介绍
LEMP 软件堆栈是一组可用于为动态网页和 Web 应用程序提供服务的软件。命名为“雷电电磁脉冲”是一个描述的缩写大号inux的操作系统,与(ē)Nginx的网络服务器。后端数据存储在一个中号ariaDB数据库和动态处理是通过处理P HP。
尽管此软件堆栈通常包含MySQL作为数据库管理系统,但一些 Linux 发行版(包括 Debian)使用MariaDB作为 MySQL 的替代品。
在本指南中,您将使用 MariaDB 作为数据库管理系统在 Debian 10 服务器上安装 LEMP 堆栈。
先决条件
要完成本指南,您需要访问 Debian 10 服务器。该服务器应该有一个配置了sudo
权限的普通用户和一个启用了ufw
. 要进行设置,您可以按照我们的 Debian 10 初始服务器设置指南进行操作。
第 1 步 – 安装 Nginx Web 服务器
为了向您的网站访问者提供网页服务,我们将使用Nginx,这是一种流行的网络服务器,以其整体性能和稳定性而闻名。
您将用于此过程的所有软件都将直接来自 Debian 的默认软件包存储库。这意味着您可以使用apt
包管理套件来完成安装。
由于这是您第一次apt
在此会话中使用,您应该首先更新您的本地包索引。然后您可以安装服务器:
- sudo apt update
- sudo apt install nginx
在 Debian 10 上,Nginx 被配置为在安装时开始运行。
如果您ufw
运行了防火墙,则需要允许连接到 Nginx。您应该启用仍然允许您想要的流量的最严格的配置文件。由于您还没有为您的服务器配置 SSL,现在您只需要允许端口上的 HTTP 流量80
。
您可以通过键入以下内容启用此功能:
- sudo ufw allow 'Nginx HTTP'
您可以通过键入以下内容来验证更改:
- sudo ufw status
您应该会在显示的输出中看到允许的 HTTP 流量:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
现在,通过在 Web 浏览器中访问服务器的域名或公共 IP 地址来测试服务器是否已启动并正在运行。如果您没有指向服务器的域名,并且您不知道服务器的公共 IP 地址,您可以通过在终端中键入以下内容之一来找到它:
- ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
这将打印出一些 IP 地址。您可以在 Web 浏览器中依次尝试每一个。
键入您在 Web 浏览器中收到的地址之一。它应该带你到 Nginx 的默认登陆页面:
http://your_domain_or_IP
如果你看到上面的页面,你已经成功安装了 Nginx。
第 2 步 – 安装 MariaDB
现在您已经启动并运行了 Web 服务器,您需要安装数据库系统才能存储和管理站点的数据。
在 Debian 10 中,mysql-server
传统上用于安装 MySQL 服务器的 metapackage被default-mysql-server
. 这个元包引用了MariaDB,这是 Oracle 原始 MySQL 服务器的一个社区分支,它目前是基于 debian 的包管理器存储库中可用的默认 MySQL 兼容数据库服务器。
但是,为了长期兼容性,建议使用程序的实际包安装 MariaDB,而不是使用元包mariadb-server
。
要安装此软件,请运行:
- sudo apt install mariadb-server
安装完成后,建议您运行 MariaDB 预装的安全脚本。此脚本将删除一些不安全的默认设置并锁定对数据库系统的访问。通过运行以下命令启动交互式脚本:
- sudo mysql_secure_installation
此脚本将带您完成一系列提示,您可以在其中对 MariaDB 设置进行一些更改。第一个提示将要求您输入当前的数据库 root密码。这不要与系统 root混淆。该数据库根用户是在数据库系统完全权限的管理用户。因为您刚刚安装了 MariaDB,还没有进行任何配置更改,所以这个密码将为空,所以只需ENTER
在提示下按即可。
下一个提示询问您是否要设置数据库 root密码。因为 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,这是 LEMP 堆栈的最后一个组件。
第 3 步 – 安装 PHP 进行处理
您已经安装了 Nginx 来为您的内容提供服务,并安装了 MySQL 来存储和管理您的数据。现在您可以安装 PHP 来处理代码并为 Web 服务器生成动态内容。
虽然 Apache 在每个请求中嵌入了 PHP 解释器,但 Nginx 需要一个外部程序来处理 PHP 处理并充当PHP 解释器本身和 Web 服务器之间的桥梁。这允许在大多数基于 PHP 的网站中获得更好的整体性能,但它需要额外的配置。您需要安装php-fpm
,它代表“PHP fastCGI 进程管理器”,并告诉 Nginx 将 PHP 请求传递给该软件进行处理。此外,您还需要php-mysql
一个 PHP 模块,它允许 PHP 与基于 MySQL 的数据库进行通信。核心 PHP 包将自动安装为依赖项。
要安装php-fpm
和php-mysql
软件包,请运行:
- sudo apt install php-fpm php-mysql
您现在已经安装了 PHP 组件。接下来,您将配置 Nginx 以使用它们。
第 4 步 – 配置 Nginx 以使用 PHP 处理器
使用 Nginx Web 服务器时,服务器块(类似于 Apache 中的虚拟主机)可用于封装配置细节并在一台服务器上托管多个域。在本指南中,我们将使用your_domain作为示例域名。要了解有关使用 DigitalOcean 设置域名的更多信息,请参阅我们对 DigitalOcean DNS的介绍。
在 Debian 10 上,Nginx 默认启用一个服务器块,并配置为从/var/www/html
. 虽然这适用于单个站点,但如果您托管多个站点,则可能会变得难以管理。/var/www/html
让我们/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
然后,sites-available
使用您喜欢的命令行编辑器在 Nginx 的目录中打开一个新的配置文件。在这里,我们将使用nano
:
- sudo nano /etc/nginx/sites-available/your_domain
这将创建一个新的空白文件。粘贴以下基本配置:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain;
index index.php index.html index.htm;
server_name your_domain;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
}
}
这是一个基本配置,它侦听端口80
并从您刚刚创建的 Web 根目录提供文件。它只会响应对 之后提供的主机或 IP 地址的请求server_name
,任何以 结尾的文件都.php
将php-fpm
在 Nginx 将结果发送给用户之前处理。
注意:如果您运行的 PHP 版本不同于 PHP 7.3,则需要调整
fastcgi_pass
以匹配您正在使用的 PHP 版本。
完成编辑后,保存并关闭文件。如果您曾经nano
创建过该文件,请通过键入CTRL
+X
和y
和ENTER
进行确认。
通过链接到 Nginxsites-enabled
目录中的配置文件来激活您的配置:
- sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
这将告诉 Nginx 在下次重新加载时使用该配置。您可以通过键入以下内容来测试您的配置是否存在语法错误:
- sudo nginx -t
如果报告了任何错误,请在继续之前返回到您的配置文件查看其内容。
准备好后,重新加载 Nginx 以进行更改:
- sudo systemctl reload nginx
接下来,您将在新的 Web 根目录中创建一个文件来测试 PHP 处理。
第 5 步 – 创建一个 PHP 文件来测试配置
您的 LEMP 堆栈现在应该已经完全设置好了。您可以对其进行测试以验证 Nginx 是否可以将.php
文件正确地传递给您的 PHP 处理器。
您可以通过在文档根目录中创建一个测试 PHP 文件来完成此操作。info.php
在文本编辑器中打开一个在文档根目录中调用的新文件:
- nano /var/www/your_domain/info.php
将以下行键入或粘贴到新文件中。这是将返回有关您的服务器的信息的有效 PHP 代码:
<?php
phpinfo();
?>
完成后,通过键入CTRL
+X
和y
和ENTER
确认保存并关闭文件。
现在,您可以通过访问您在 Nginx 配置文件中设置的域名或公共 IP 地址,在 Web 浏览器中访问此页面,后跟/info.php
:
http://your_domain/info.php
您将看到一个包含有关您的服务器的详细信息的网页:
通过该页面检查有关您的 PHP 服务器的相关信息后,最好删除您创建的文件,因为它包含有关您的 PHP 环境和 Debian 服务器的敏感信息。您可以使用rm
删除该文件:
- rm /var/www/your_domain/info.php
如果以后需要,您可以随时重新生成此文件。接下来,我们将从 PHP 端测试数据库连接。
步骤 6 — 从 PHP 测试数据库连接(可选)
如果您想测试 PHP 是否能够连接到 MariaDB 并执行数据库查询,您可以创建一个包含虚拟数据的测试表并从 PHP 脚本查询其内容。
首先,使用您在本指南第 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 脚本中:
<?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();
}
完成编辑后保存并关闭文件。
现在,您可以通过访问您在 Nginx 配置文件中设置的域名或公共 IP 地址,在 Web 浏览器中访问此页面,后跟/todo_list.php
:
http://your_domain/todo_list.php
您应该会看到一个这样的页面,其中显示了您插入到测试表中的内容:
这意味着您的 PHP 环境已准备好连接您的 MariaDB 服务器并与之交互。
结论
在本指南中,您已经构建了一个灵活的基础,使用 Nginx 作为 Web 服务器,为访问者提供 PHP 网站和应用程序。您已将 Nginx 设置为通过 处理 PHP 请求php-fpm
,并且还设置了一个 MariaDB 数据库来存储您网站的数据。
为了进一步改进您当前的设置,您可以在 PHP 中安装 Composer以进行依赖项和包管理,您还可以使用Let’s Encrypt为您的网站安装 OpenSSL 证书。