如何在Debian10上安装Linux、Apache、MariaDB、PHP(LAMP)堆栈

来自菜鸟教程
跳转至:导航、​搜索

介绍

“LAMP”堆栈是一组开源软件,通常安装在一起以使服务器能够托管动态网站和 Web 应用程序。 这个术语实际上是一个首字母缩略词,代表 Linux 操作系统,带有 Apache Web 服务器。 站点数据存储在 MariaDB 数据库中,动态内容由 PHP 处理。

尽管此软件堆栈通常包含 MySQL 作为数据库管理系统,但一些 Linux 发行版(包括 Debian)使用 MariaDB 作为 MySQL 的替代品。

在本指南中,我们将在 Debian 10 服务器上安装 LAMP 堆栈,使用 MariaDB 作为数据库管理系统。

先决条件

为了完成本教程,您需要一个 Debian 10 服务器,该服务器具有非 root sudo 启用的用户帐户和基本防火墙。 这可以使用我们的 Debian 10 初始服务器设置指南进行配置。

第 1 步 — 安装 Apache 并更新防火墙

Apache Web 服务器是世界上最流行的 Web 服务器之一。 它有据可查,并且在网络的大部分历史中都被广泛使用,这使其成为托管网站的绝佳默认选择。

使用 Debian 的包管理器 APT 安装 Apache:

sudo apt update
sudo apt install apache2

由于这是 sudo 命令,因此这些操作以 root 权限执行。 它会要求您提供常规用户的密码以验证您的意图。

输入密码后,apt 会告诉您它计划安装哪些软件包以及它们将占用多少额外的磁盘空间。 按 Y 并点击 ENTER 继续,安装将继续。

接下来,假设您已按照 安装和启用 UFW 防火墙 的初始服务器设置说明进行操作,请确保您的防火墙允许 HTTP 和 HTTPS 流量。

在 Debian 10 上安装时,UFW 会加载应用程序配置文件,您可以使用这些配置文件来调整防火墙设置。 通过运行查看应用程序配置文件的完整列表:

sudo ufw app list

WWW 配置文件用于管理 Web 服务器使用的端口:

OutputAvailable applications:
. . .
  WWW
  WWW Cache
  WWW Full
  WWW Secure
. . .

如果您检查 WWW Full 配置文件,它显示它启用了到端口 80443 的流量:

sudo ufw app info "WWW Full"
OutputProfile: WWW Full
Title: Web Server (HTTP,HTTPS)
Description: Web Server (HTTP,HTTPS)

Ports:
  80,443/tcp

允许此配置文件的传入 HTTP 和 HTTPS 流量:

sudo ufw allow in "WWW Full"

您可以通过在 Web 浏览器中访问服务器的公共 IP 地址来立即进行抽查,以验证一切是否按计划进行:

http://your_server_ip

您将看到默认的 Debian 10 Apache 网页,该网页用于信息和测试目的。 它应该看起来像这样:

如果您看到此页面,则您的 Web 服务器现在已正确安装并可通过防火墙访问。

如果您不知道服务器的公共 IP 地址是什么,可以通过多种方式找到它。 通常,这是您用于通过 SSH 连接到服务器的地址。

有几种不同的方法可以从命令行执行此操作。 首先,您可以使用 iproute2 工具通过键入以下内容来获取您的 IP 地址:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

这会给你两三行回来。 它们都是正确的地址,但您的计算机可能只能使用其中一个,因此请随意尝试每个。

另一种方法是使用 curl 实用程序联系外部方,告诉您 it 如何查看您的服务器。 这是通过询问特定服务器您的 IP 地址是什么来完成的:

sudo apt install curl
curl http://icanhazip.com

无论您使用哪种方法获取 IP 地址,都可以在 Web 浏览器的地址栏中键入它以查看默认的 Apache 页面。

第 2 步 — 安装 MariaDB

现在您已经启动并运行了一个 Web 服务器,您需要安装数据库系统才能为您的站点存储和管理数据。

在 Debian 10 中,传统上用于安装 MySQL 服务器的元包 mysql-serverdefault-mysql-server 取代。 这个元包引用了 MariaDB,这是 Oracle 原始 MySQL 服务器的社区分支,它目前是基于 debian 的包管理器存储库中可用的默认 MySQL 兼容数据库服务器。

但是,为了长期兼容,建议您使用程序的实际包 mariadb-server 来安装 MariaDB,而不是使用元包。

要安装此软件,请运行:

sudo apt install mariadb-server

安装完成后,建议您运行 MariaDB 预装的安全脚本。 此脚本将删除一些不安全的默认设置并锁定对您的数据库系统的访问。 通过运行启动交互式脚本:

sudo mysql_secure_installation

该脚本将引导您完成一系列提示,您可以在其中对 MariaDB 设置进行一些更改。 第一个提示将要求您输入当前的 数据库根 密码。 不要与 系统根 混淆。 数据库根 用户是对数据库系统具有完全权限的管理用户。 因为你刚刚安装了 MariaDB,还没有做任何配置更改,所以这个密码会是空白的,所以在提示符下按 ENTER 即可。

下一个提示询问您是否要设置 数据库根 密码。 因为 MariaDB 为 root 用户使用了一种特殊的身份验证方法,通常比使用密码更安全,所以您现在不需要设置它。 键入 N,然后按 ENTER

从那里,您可以按 Y 然后按 ENTER 接受所有后续问题的默认值。 这将删除匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MariaDB 立即尊重您所做的更改。 完成后,输入以下命令登录 MariaDB 控制台:

sudo mariadb

这将以管理数据库用户 root 的身份连接到 MariaDB 服务器,这是通过在运行此命令时使用 sudo 推断出来的。 你应该看到这样的输出:

OutputWelcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.3.15-MariaDB-1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

请注意,您无需提供密码即可以 root 用户身份进行连接。 这是因为管理 MariaDB 用户的默认身份验证方法是 unix_socket 而不是 password。 尽管这起初看起来像是一个安全问题,但它使数据库服务器更加安全,因为唯一允许以 root MariaDB 用户身份登录的用户是从控制台连接的具有 sudo 权限的系统用户或通过以相同权限运行的应用程序。 实际上,这意味着您将无法使用管理数据库 root 用户从您的 PHP 应用程序进行连接。

为了提高安全性,最好为每个数据库设置具有较少扩展权限的专用用户帐户,特别是如果您计划在您的服务器上托管多个数据库。 为了演示这样的设置,我们将创建一个名为 example_database 的数据库和一个名为 example_user 的用户,但您可以将这些名称替换为不同的值。 要创建新数据库,请从 MariaDB 控制台运行以下命令:

CREATE DATABASE example_database;

现在您可以创建一个新用户并授予他们对您刚刚创建的自定义数据库的完全权限。 以下命令将此用户的密码定义为 password,但您应该将此值替换为您自己选择的安全密码。

GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

这将赋予 example_user 用户对 example_database 数据库的完全权限,同时阻止该用户在您的服务器上创建或修改其他数据库。

刷新权限以确保它们已保存并在当前会话中可用:

FLUSH PRIVILEGES;

在此之后,退出 MariaDB shell:

exit

您可以通过再次登录 MariaDB 控制台来测试新用户是否具有适当的权限,这次使用自定义用户凭据:

mariadb -u example_user -p

请注意此命令中的 -p 标志,它将提示您输入创建 example_user 用户时使用的密码。 登录 MariaDB 控制台后,确认您有权访问 example_database 数据库:

SHOW DATABASES;

这将为您提供以下输出:

Output+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

要退出 MariaDB shell,请键入:

exit

此时,您的数据库系统已设置完毕,您可以继续安装 PHP,这是 LAMP 堆栈的最后一个组件。

第 3 步 — 安装 PHP

PHP 是您设置的组件,它将处理代码以显示动态内容。 它可以运行脚本,连接到您的 MariaDB 数据库以获取信息,并将处理后的内容交给您的 Web 服务器进行显示。

再次利用 apt 系统安装 PHP。 此外,包括一些帮助程序包,它们将确保 PHP 代码可以在 Apache 服务器下运行并与您的 MariaDB 数据库通信:

sudo apt install php libapache2-mod-php php-mysql

这应该安装 PHP 没有任何问题。 我们稍后会对此进行测试。

在大多数情况下,您需要修改 Apache 提供文件的方式。 目前,如果用户向服务器请求目录,Apache 将首先查找名为 index.html 的文件。 我们想告诉 Web 服务器比其他文件更喜欢 PHP 文件,所以让 Apache 首先查找 index.php 文件。

为此,请键入以下命令以在具有 root 权限的文本编辑器中打开 dir.conf 文件:

sudo nano /etc/apache2/mods-enabled/dir.conf

它看起来像这样:

/etc/apache2/mods-enabled/dir.conf

<IfModule mod_dir.c>
    DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>

将 PHP 索引文件(上面突出显示)移动到 DirectoryIndex 规范之后的第一个位置,如下所示:

/etc/apache2/mods-enabled/dir.conf

<IfModule mod_dir.c>
    DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

完成后,保存并关闭文件。 如果您使用的是 nano,您可以按 CTRL+X,然后按 YENTER 进行确认。

现在重新加载 Apache 的配置:

sudo systemctl reload apache2

您可以使用 systemctl status 检查 apache2 服务的状态:

sudo systemctl status apache2
Sample Output● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-07-08 12:58:31 UTC; 8s ago
     Docs: https://httpd.apache.org/docs/2.4/
  Process: 11948 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 11954 (apache2)
    Tasks: 6 (limit: 4719)
   Memory: 11.5M
   CGroup: /system.slice/apache2.service
           ├─11954 /usr/sbin/apache2 -k start
           ├─11955 /usr/sbin/apache2 -k start
           ├─11956 /usr/sbin/apache2 -k start
           ├─11957 /usr/sbin/apache2 -k start
           ├─11958 /usr/sbin/apache2 -k start
           └─11959 /usr/sbin/apache2 -k start

此时,您的 LAMP 堆栈已完全运行,但在您可以使用 PHP 脚本测试您的设置之前,最好设置一个适当的 Apache 虚拟主机 来保存您网站的文件和文件夹。 我们将在下一步中这样做。

第 4 步 — 为您的网站创建虚拟主机

默认情况下,Apache 使用 /etc/apache2/sites-available/000-default.conf 中包含的配置从位于 /var/www/html 的目录中提供其内容。 我们将创建一个新的 虚拟主机 来测试您的 PHP 环境,而不是修改默认的网站配置文件。 虚拟主机使我们能够将多个网站托管在单个 Apache 服务器上。

之后,您将在 /var/www 中为名为 your_domain 的示例网站创建一个目录结构。

your_domain 创建根 Web 目录,如下所示:

sudo mkdir /var/www/your_domain

接下来,使用 $USER 环境变量分配目录的所有权,它应该引用您当前的系统用户:

sudo chown -R $USER:$USER /var/www/your_domain

然后,使用您喜欢的命令行编辑器在 Apache 的 sites-available 目录中打开一个新的配置文件。 在这里,我们将使用 nano

sudo nano /etc/apache2/sites-available/your_domain.conf

这将创建一个新的空白文件。 粘贴以下基本配置:

/etc/apache2/sites-available/your_domain

<VirtualHost *:80>
    ServerName your_domain
    ServerAlias www.your_domain 
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

通过这个 VirtualHost 配置,我们告诉 Apache 使用 /var/www/your_domain 作为 Web 根目录来服务 your_domain。 如果您想在没有域名的情况下测试 Apache,您可以通过在每个选项的开头添加 # 字符来删除或注释掉选项 ServerNameServerAlias线。

您现在可以使用 a2ensite 来启用此虚拟主机:

sudo a2ensite your_domain

您可能想要禁用随 Apache 一起安装的默认网站。 如果您不使用自定义域名,这是必需的,因为在这种情况下,Apache 的默认配置会覆盖您的虚拟主机。 要禁用 Apache 的默认网站,请键入:

sudo a2dissite 000-default

要确保您的配置文件不包含语法错误,您可以运行:

sudo apache2ctl configtest

最后,重新加载 Apache,使这些更改生效:

sudo systemctl reload apache2

您的新网站现在处于活动状态,但网络根目录 /var/www/your_domain 仍然为空。 在下一步中,我们将创建一个 PHP 脚本来测试新设置并确认 PHP 已在您的服务器上正确安装和配置。

第 5 步 — 在您的 Web 服务器上测试 PHP 处理

现在您已经有了一个自定义位置来托管您网站的文件和文件夹,我们将创建一个简单的 PHP 测试脚本来确认 Apache 能够处理和处理对 PHP 文件的请求。

在您的自定义 Web 根文件夹中创建一个名为 info.php 的新文件:

nano /var/www/your_domain/info.php

这将打开一个空白文件。 在文件中添加以下文本,这是有效的 PHP 代码:

/var/www/your_domain/info.php

<?php
phpinfo();

完成后,保存并关闭文件。

现在您可以测试您的 Web 服务器是否能够正确显示此 PHP 脚本生成的内容。 要试用此功能,请在您的网络浏览器中访问此页面。 您将再次需要服务器的公共 IP 地址。

您将要访问的地址是:

http://your_domain/info.php

您应该会看到类似于以下内容的页面:

此页面从 PHP 的角度提供了有关您的服务器的一些基本信息。 它对于调试和确保正确应用您的设置很有用。

如果您可以在浏览器中看到此页面,那么您的 PHP 安装正在按预期工作。

通过该页面检查有关您的 PHP 服务器的相关信息后,最好删除您创建的文件,因为它包含有关您的 PHP 环境和 Debian 服务器的敏感信息。 您可以使用 rm 来执行此操作:

sudo rm /var/www/your_domain/info.php

如果您以后需要再次访问该信息,您可以随时重新创建此页面。

第 6 步 — 从 PHP 测试数据库连接(可选)

如果您想测试 PHP 是否能够连接到 MariaDB 并执行数据库查询,您可以使用虚拟数据创建一个测试表并从 PHP 脚本查询其内容。

首先,使用您在本指南的 Step 2 中创建的数据库用户连接到 MariaDB 控制台:

mariadb -u example_user -p

创建一个名为 todo_list 的表。 在 MariaDB 控制台中,运行以下语句:

CREATE TABLE example_database.todo_list (
    item_id INT AUTO_INCREMENT,
    content VARCHAR(255),
    PRIMARY KEY(item_id)
);

现在,在测试表中插入几行内容。 您可能希望使用不同的值重复下一个命令几次:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

要确认数据已成功保存到您的表中,请运行:

SELECT * FROM example_database.todo_list;

您将看到以下输出:

Output+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

确认您的测试表中有有效数据后,您可以退出 MariaDB 控制台:

exit

现在您可以创建将连接到 MariaDB 并查询您的内容的 PHP 脚本。 使用您喜欢的编辑器在您的自定义 Web 根目录中创建一个新的 PHP 文件。 我们将为此使用 nano

nano /var/www/your_domain/todo_list.php

以下 PHP 脚本连接到 MariaDB 数据库并查询 todo_list 表的内容,并在列表中显示结果。 如果数据库连接有问题,它会抛出异常。 将此内容复制到您的 todo_list.php 脚本中:

/var/www/your_domain/todo_list.php

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>"; 
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

完成编辑后保存并关闭文件。

您现在可以通过访问您网站的域名或公共 IP 地址,然后在 /todo_list.php 后的 Web 浏览器中访问此页面:

http://your_domain/todo_list.php

您应该会看到这样的页面,显示您在测试表中插入的内容:

这意味着您的 PHP 环境已准备好与您的 MariaDB 服务器连接和交互。

结论

在本指南中,我们使用 Apache 作为 Web 服务器和 MariaDB 作为数据库系统,为向访问者提供 PHP 网站和应用程序建立了一个灵活的基础。

为了进一步改进您当前的设置,您可以 安装 Composer 以在 PHP 中进行依赖项和包管理,您还可以使用 Let's Encrypt 为您的网站安装 OpenSSL 证书。