简介
LAMP "堆栈是一组开源软件,通常安装在一起,使服务器能够承载动态网站和网络应用。这个术语是一个首字母缩写,代表Linux操作系统和Apache网络服务器。网站数据存储在MariaDB数据库中,而动态内容由PHP处理。
虽然这个软件栈通常包括MySQL作为数据库管理系统,但一些Linux发行版--包括Debian--使用MariaDB作为MySQL的替代品。
在本指南中,你将在Debian 11服务器上安装一个LAMP堆栈,使用MariaDB作为数据库管理系统。
前提条件
要遵循本教程,你将需要一个 Debian 11 服务器,并有一个非rootsudo-enabled 用户账户和一个基本的防火墙。这可以通过我们为Debian 11提供的初始服务器设置指南进行配置。
第一步 - 安装Apache和更新防火墙
Apache网络服务器是世界上最流行的网络服务器之一。它有很好的文档,有一个活跃的用户社区,并且在网络的大部分历史中一直被广泛使用,这使得它成为托管网站的一个伟大选择。
从更新软件包管理器的缓存开始。如果这是你第一次在这个会话中使用sudo ,你会被提示提供你的用户密码,以确认你有正确的权限用apt 管理系统包。
sudo apt update
然后,用下面的方法安装Apache。
sudo apt install apache2
这个命令会提示你确认Apache的安装。通过写Y ,然后写ENTER 来确认。一旦安装完成,你需要调整你的防火墙设置。假设你按照最初的服务器设置说明安装并启用了UFW防火墙,请确保你的防火墙允许HTTP和HTTPS流量。
在Debian 11中,用友软件加载了应用配置文件,你可以用它来调整你的防火墙设置。通过运行查看应用程序配置文件的完整列表。
sudo ufw app list
列出的WWW 配置文件是用来管理网络服务器使用的端口。
OutputAvailable applications:
. . .
WWW
WWW Cache
WWW Full
WWW Secure
. . .
如果你用ufw app info 来检查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"
你可以通过在你的网络浏览器中访问你的服务器的公共IP地址来验证一切是否按计划进行。
http://your_server_ip
这将返回默认的 Debian 11 Apache 网页,它是为了提供信息和测试而存在的。

如果您的浏览器返回这个页面,那么您的网络服务器现在已经正确安装,并且可以通过您的防火墙访问。
如何找到您的服务器的公共 IP 地址
如果你不知道你的服务器的公共IP地址是什么,有很多方法可以找到它。通常,这是你用来通过SSH连接到服务器的地址。
有几种不同的方法可以从命令行中做到这一点。首先,你可以使用iproute2 工具,通过运行:来获得你的IP地址。
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
这将返回两到三行。它们都是正确的地址,但你的电脑可能只能使用其中一个,所以请随意尝试每一个。
另一种方法是使用curl 工具与外界联系,告诉你它如何看待你的服务器。你可以运行下面的命令,问一个特定的服务器你的IP地址是什么。
curl http://icanhazip.com
无论你喜欢哪种方法,把你的IP地址写进网络浏览器,以验证你的服务器是否在运行默认的Apache页面。
第2步 - 安装MariaDB
现在你已经有了一个网络服务器并在运行,你需要安装数据库系统,以便能够为你的网站存储和管理数据。
在Debian 11中,传统上用来安装MySQL服务器的元包mysql-server ,被default-mysql-server 所取代。这个元包引用了MariaDB,它是甲骨文公司原始MySQL服务器的一个社区分叉,目前它是基于Debian的软件包管理器仓库中默认的MySQL兼容数据库服务器。
然而,为了长期的兼容性,我们建议你使用MariaDB的实际软件包mariadb-server ,而不是使用元包来安装该程序。
要安装MariaDB软件,请运行。
sudo apt install mariadb-server
当安装完成后,建议你运行一个预装在MariaDB中的安全脚本。这个脚本将删除一些不安全的默认设置,并锁定对数据库系统的访问。通过运行来启动交互式脚本。
sudo mysql_secure_installation
这个脚本将带你通过一系列的提示,你可以对你的MariaDB设置进行一些修改。第一个提示将要求你输入当前的数据库根密码。这与系统根用户不能混为一谈。数据库根用户是一个拥有数据库系统全部权限的管理用户。由于你刚刚安装了MariaDB,并且还没有做任何配置上的修改,这个密码将是空白的,所以在提示符下按ENTER 。
下一个提示是询问你是否要设置数据库根密码。由于MariaDB对根用户使用了一种特殊的认证方法,通常比使用密码更安全,所以你现在不需要设置。按N ,然后按ENTER 。
在这里,你可以按Y ,然后按ENTER ,接受所有后续问题的默认值。这将删除匿名用户和测试数据库,禁用远程root登录,并加载这些新的规则,以便MariaDB立即尊重你所做的改变。
当你完成后,登录到MariaDB控制台。
sudo mariadb
这将以管理数据库用户root的身份连接到MariaDB服务器,在运行此命令时,通过使用sudo ,可以推断出root用户。你应该收到像下面这样的输出。
OutputWelcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 41
Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11
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)]>
注意,你不需要提供密码就可以以根用户的身份连接。这是因为MariaDB管理用户的默认认证方式是unix_socket ,而不是password 。尽管这起初看起来是一个安全问题,但它使数据库服务器更加安全,因为唯一允许以MariaDB根用户身份登录的用户是具有sudo 权限的系统用户,从控制台连接,或通过以相同权限运行的应用程序连接。在实践中,这意味着你将不能使用管理数据库根用户从你的PHP应用程序中连接。
为了提高安全性,最好为每个数据库设置权限较小的专用用户账户,特别是当你打算在服务器上托管多个数据库时。
你可以通过以下方式退出MariaDB控制台。
exit
你的MariaDB服务器现在已经安装完毕并得到保障。接下来,你将安装PHP,LAMP栈中的最后一个组件。
第3步 - 安装PHP
你已经安装了Apache为你的内容提供服务,并安装了MariaDB来存储和管理你的数据。PHP是你设置的组件,它将处理代码以向最终用户显示动态内容。它可以运行脚本,连接到MariaDB数据库以获取信息,并将处理后的内容移交给Web服务器来显示。
除了php ,你还需要php-mysql ,这是一个PHP模块,允许PHP与基于MySQL的数据库,如MariaDB进行通信。还需要libapache2-mod-php 来使 Apache 能够处理 PHP 文件。核心的 PHP 包将自动作为依赖项安装。
要安装这些包,请运行以下命令。
sudo apt install php libapache2-mod-php php-mysql
一旦安装完成,你可以用下面的命令验证你的PHP版本。
php -v
OutputPHP 7.4.30 (cli) (built: Jul 7 2022 15:51:43) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies
在这一点上,你的LAMP堆栈已经完全运作了,但是在用PHP脚本测试你的设置之前,最好是建立一个合适的Apache虚拟主机来存放你的网站的文件和文件夹。
第4步 - 为你的网站创建一个虚拟主机
当使用Apache网站服务器时,你可以创建虚拟主机(类似于Nginx中的服务器块)来封装配置细节,并在一台服务器上托管一个以上的域名。在本指南中,我们将设置一个名为your_domain的域名,但你应该用你自己的域名来代替它。
**注意:**如果你使用DigitalOcean作为DNS主机提供商,请查看我们的产品文档,了解如何设置一个新域名并将其指向你的服务器的详细说明。
默认情况下,Apache从位于/var/www/html 的目录中提供内容,使用/etc/apache2/sites-available/000-default.conf 中的配置。而不是修改默认的网站配置文件/var/www/html ,你要创建一个新的虚拟主机来测试你的PHP环境。虚拟主机使你能够在一个Apache服务器上存放多个网站。你还将在/var/www 中为your_domain网站创建一个目录结构,将/var/www/html 留作默认目录,以便在客户请求与任何其他网站不匹配时提供服务。
首先,为你的网站创建根目录,如下所示。
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>
完成后保存并关闭该文件。如果你使用的是nano ,你可以按CTRL + X ,然后按Y 和ENTER 来做。
通过这个VirtualHost 配置,你要告诉Apache为 your_domain使用 /var/www/your_domain作为Web根目录。如果你想在没有域名的情况下测试Apache,你可以删除或注释选项ServerName 和ServerAlias ,在每个选项的行首添加一个磅符号 (#)。
现在,使用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 代码。
/var/www/your_domain/info.php
<?php
phpinfo();
完成后,保存并关闭该文件。
要测试这个脚本,请到你的网页浏览器中访问你的服务器的域名或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用户,并将其正确配置为访问数据库。
创建一个名为example_database的数据库和一个名为example_user的用户。你可以用不同的值替换这些名字。
首先,使用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
现在你可以创建一个PHP脚本,它将连接到MariaDB并查询你的内容。用你喜欢的编辑器在你的自定义Web根目录下创建一个新的PHP文件。
nano /var/www/your_domain/todo_list.php
下面的PHP脚本将连接到MariaDB数据库并查询todo_list表中的内容,并将结果以列表形式展示出来。如果数据库连接有问题,它将抛出一个异常。
将这些内容添加到你的todo_list.php 脚本中,记住要将 example_user和 password值替换成你自己的值。
/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 。
http://your_domain/todo_list.php
这个网页将向访问者展示你在测试表中插入的内容。

这意味着你的PHP环境已经准备好与你的MariaDB服务器进行连接和交互。
总结
在本指南中,你已经建立了一个灵活的基础,使用Apache作为Web服务器和MariaDB作为数据库系统,为你的访问者提供PHP网站和应用程序。
作为下一步,你应该通过HTTPS来确保与你的Web服务器的连接是安全的。为了达到这个目的,你可以使用Let's Encrypt。你也可以阅读我们的指南:如何在PHP中安装和使用Composer进行依赖性和包管理。