如何在 Debian 10 上安装 Linux、Apache、MariaDB、PHP (LAMP) 堆栈
介绍
LAMP 堆栈是一组开源软件,通常安装在一起以使服务器能够托管动态网站和网络应用程序。该术语是代表 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 服务器之一。它有据可查,并在网络的大部分历史中得到广泛使用,这使其成为托管网站的绝佳默认选择。
首先更新包管理器缓存。如果这是您第一次在此会话中使用 sudo
,系统将提示您提供用户密码以确认您有使用 apt
管理系统包的正确权限:
- sudo apt update
然后使用以下命令安装 Apache:
- sudo apt install apache2
此命令提示您确认 Apache 的安装。按 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
配置文件,它会显示它允许到端口 80
和 443
的流量:
- 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 地址
如果您不知道服务器的公共 IP 地址是什么,可以通过多种方式找到它。通常,这是您用来通过 SSH 连接到服务器的地址。
有几种不同的方法可以从命令行执行此操作。首先,您可以使用 iproute2
工具通过运行以下命令获取您的 IP 地址:
- ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
这将返回两三行。它们都是正确的地址,但您的计算机可能只能使用一个,所以请尝试每一个。
另一种方法是使用 curl
实用程序联系外部方,告诉您它如何查看您的服务器。您可以运行以下命令并询问特定服务器您的 IP 地址是什么:
由于 Debian 10 默认没有 curl
,您需要先安装它:
- sudo apt install curl
然后运行以下命令并询问特定服务器您的 IP 地址是什么:
- curl http://icanhazip.com
无论使用哪种方法,将您的 IP 地址写入 Web 浏览器以验证您的服务器是否正在运行默认的 Apache 页面。
第 2 步 — 安装 MariaDB
现在您已经启动并运行了 Web 服务器,您需要安装数据库系统以便能够存储和管理您站点的数据。
在 Debian 10 中,传统上用于安装 MySQL 服务器的元数据包 mysql-server
被替换为 default-mysql-server
。这个元数据包引用了 MariaDB,它是 Oracle 原始 MySQL 服务器的社区分支,目前是基于 Debian 的包管理器存储库上可用的默认 MySQL 兼容数据库服务器。
但是,为了长期兼容,建议不要使用元数据包,而是使用程序的实际数据包 mariadb-server
安装 MariaDB。
要安装 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 42
Server version: 10.3.36-MariaDB-0+deb10u2 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
权限的系统用户或通过以相同权限运行的应用程序。实际上,这意味着您将无法使用管理数据库根用户从您的 PHP 应用程序进行连接。
为了提高安全性,最好为每个数据库设置具有较少扩展权限的专用用户帐户,特别是如果您计划在服务器上托管多个数据库。
您可以使用以下命令退出 MariaDB 控制台:
- exit
您的 MariaDB 服务器现已安装并受到保护。接下来,您将安装 PHP,这是 LAMP 堆栈中的最后一个组件。
第 3 步 — 安装 PHP
您安装了 Apache 来提供您的内容,并安装了 MariaDB 来存储和管理您的数据。 PHP 是您的设置组件,它将处理代码以向最终用户显示动态内容。它可以运行脚本,连接到您的 MariaDB 数据库以获取信息,并将处理后的内容交给您的 Web 服务器进行显示。
除了 php
包之外,您还需要 php-mysql
,这是一个允许 PHP 与基于 MySQL 的数据库(例如 MariaDEB)进行通信的 PHP 模块。您还需要 libapache2-mod-php
来使 Apache 能够处理 PHP 文件。核心 PHP 包将作为依赖项自动安装。
要安装这些包,请运行以下命令:
- sudo apt install php libapache2-mod-php php-mysql
安装完成后,您可以使用以下命令验证您的 PHP 版本:
- php -v
OutputPHP 7.3.31-1~deb10u2 (cli) (built: Dec 15 2022 09:39:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.31, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.31-1~deb10u2, Copyright (c) 1999-2018, by Zend Technologies
在大多数情况下,您会希望修改 Apache 提供文件的方式。目前,如果用户向服务器请求目录,Apache 将首先搜索名为 index.html
的文件。要指示 Web 服务器优先选择 PHP 文件而不是其他文件,您可以将 Apache 设置为首先搜索 index.php
文件。
为此,请运行以下命令以使用 root 权限在您首选的文本编辑器中打开 dir.conf
文件。在这个例子中,我们使用的是 nano
:
- sudo nano /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
规范之后的第一个位置,如下所示:
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
完成后,保存并关闭文件。如果您使用的是 nano
,您可以按 CTRL+X
,然后按 Y
和 ENTER
来执行此操作确认。
现在重新加载 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:
Active: active (running) since Fri 2023-01-20 22:21:24 UTC; 2min 12s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 13076 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCC
Process: 13097 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/
Main PID: 13080 (apache2)
Tasks: 6 (limit: 4915)
Memory: 13.7M
CGroup: /system.slice/apache2.service
├─13080 /usr/sbin/apache2 -k start
├─13101 /usr/sbin/apache2 -k start
├─13102 /usr/sbin/apache2 -k start
├─13103 /usr/sbin/apache2 -k start
├─13104 /usr/sbin/apache2 -k start
└─13105 /usr/sbin/apache2 -k start
此时,您的 LAMP 堆栈已完全运行,但在您可以使用 PHP 脚本测试您的设置之前,最好设置一个适当的 Apache 虚拟主机来保存您网站的文件和文件夹。您将在下一步中进行设置。
第 4 步 — 为您的网站创建虚拟主机
使用 Apache Web 服务器时,您可以创建虚拟主机(类似于 Nginx 中的服务器块)来封装配置详细信息并从一台服务器托管多个域。在本节中,您将设置一个名为 your_domain 的域,但您应该将其替换为您自己的域名。
注意:如果您使用 DigitalOcean 作为 DNS 提供商,请查看我们的产品文档以获取有关如何设置新域名并将其指向您的服务器的详细说明
默认情况下,Apache 使用位于 /var/www/html
的目录提供其内容,使用 /etc/apache2/sites-available/000-default.conf
中包含的配置。您将创建一个新的虚拟主机来测试您的 PHP 环境,而不是修改默认的网站配置文件。虚拟主机使您能够将多个网站托管在单个 Apache 服务器上。您还将在 /var/www
中为 your_domain 站点创建一个目录结构,将 /var/www/html
保留为默认目录,如果客户端请求与任何其他站点都不匹配。
首先为 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
这将创建一个新的空白文件。使用您自己的域名添加以下基本配置:
<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 服务
作为网站根目录。如果您想在没有域名的情况下测试 Apache,您可以通过添加井号 (your_domain
>#
) 每个选项行开头的字符。
完成后保存并关闭文件。
现在使用 a2ensite
来启用这个虚拟主机:
- sudo a2ensite your_domain
您可能想要禁用随 Apache 安装的默认网站。如果您不使用自定义域名,这是必需的,因为在这种情况下,Apache 的默认配置会覆盖您的虚拟主机。要禁用 Apache 的默认网站,请运行:
- sudo a2dissite 000-default
为确保您的配置文件不包含语法错误,您可以运行:
- sudo apache2ctl configtest
最后,重新加载 Apache 以使这些更改生效:
- sudo systemctl reload apache2
接下来,您将创建一个 PHP 脚本来测试 PHP 是否已在您的服务器上正确安装和配置。
第 5 步 — 在您的 Web 服务器上测试 PHP 处理
现在您已经有了一个自定义位置来托管您网站的文件和文件夹,创建一个 PHP 测试脚本以确认 Apache 能够处理和处理对 PHP 文件的请求。
首先在您的自定义 Web 根文件夹中创建一个名为 info.php
的新文件:
- nano /var/www/your_domain/info.php
这将打开一个空白文件。在文件中添加以下文本,这是有效的 PHP 代码:
<?php
phpinfo();
完成后,保存并关闭文件。
要测试脚本,请转到 Web 浏览器并访问服务器的域名或 IP 地址,然后是脚本名称,在本例中为 info.php
:
http://your_domain/info.php
以下是默认 PHP 网页的示例:
此页面从 PHP 的角度提供有关您的服务器的一些基本信息。它对于调试和确保正确应用您的设置很有用。
如果您在浏览器中收到此页面,那么您的 PHP 安装正在按预期工作。
通过该页面检查了有关您的 PHP 服务器的相关信息后,最好删除您创建的文件,因为它包含有关您的 PHP 环境和 Debian 服务器的敏感信息。您可以使用 rm
来这样做:
- sudo rm /var/www/your_domain/info.php
如果以后需要再次访问信息,您可以随时重新创建此页面。
第 6 步 — 从 PHP 测试数据库连接(可选)
如果您想测试 PHP 是否能够连接到 MariaDB 并执行数据库查询,您可以创建一个包含测试数据的测试表并从 PHP 脚本查询其内容。在你这样做之前,你需要创建一个数据库和一个正确配置的新 MariaDB 用户来访问它。
首先,使用 root 帐户连接到 MariaDB 控制台:
- sudo mariadb
要创建新数据库,请从 MariaDB 控制台运行以下命令:
- CREATE DATABASE example_database;
现在创建一个新用户并授予他们对您创建的自定义数据库的全部权限。
以下命令创建一个名为 example_user
的新用户,该用户使用密码进行身份验证。我们将此用户的密码定义为 password
,但您应将此值替换为您自己选择的安全密码:
- CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';
接下来,授予此用户对 example_database
数据库的权限:
- GRANT ALL ON example_database.* TO 'example_user'@'%';
这将赋予 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)
接下来,创建一个名为 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
脚本中,记得替换 example_user
和 password
值与你自己的:
<?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 服务器并与之交互。
结论
在本指南中,您已经构建了一个灵活的基础来为访问者提供 PHP 网站和应用程序,使用 Apache 作为 Web 服务器并使用 MariaDB 作为数据库系统。
作为紧接着的下一步,您应该通过 HTTPS 为它们提供服务,以确保与您的 Web 服务器的连接是安全的。为此,您可以使用 How to Install and Use Composer 在 PHP 中进行依赖项和包管理。