如何在Debian10上安装Linux、Nginx、MariaDB、PHP(LEMP堆栈)
介绍
LEMP 软件堆栈是一组可用于提供动态网页和 Web 应用程序的软件。 名称“LEMP”是描述 Linux 操作系统的首字母缩写词,带有 (E)Nginx Web 服务器。 后端数据存储在 MariaDB 数据库中,动态处理由 PHP 处理。
尽管此软件堆栈通常包含 MySQL 作为数据库管理系统,但一些 Linux 发行版(包括 Debian)使用 MariaDB 作为 MySQL 的替代品。
在本指南中,您将在使用 MariaDB 作为数据库管理系统的 Debian 10 服务器上安装 LEMP 堆栈。
先决条件
要完成本指南,您需要访问 Debian 10 服务器。 该服务器应该有一个配置了 sudo
权限的普通用户和一个启用了 ufw
的防火墙。 要进行设置,您可以按照我们的 Initial Server Setup with Debian 10 指南进行操作。
第 1 步 — 安装 Nginx Web 服务器
为了向您的网站访问者提供网页,我们将使用 Nginx,一种流行的网络服务器,以其整体性能和稳定性而闻名。
您将用于此过程的所有软件将直接来自 Debian 的默认软件包存储库。 这意味着您可以使用 apt
包管理套件来完成安装。
由于这是您第一次在此会话中使用 apt
,因此您应该从更新本地包索引开始。 然后,您可以安装服务器:
sudo apt update sudo apt install nginx
在 Debian 10 上,Nginx 配置为在安装时开始运行。
如果您正在运行 ufw
防火墙,则需要允许连接到 Nginx。 您应该启用仍然允许您想要的流量的最严格的配置文件。 由于您还没有为您的服务器配置 SSL,现在您只需要允许端口 80
上的 HTTP 流量。
您可以通过键入以下内容启用此功能:
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 浏览器中收到的地址之一。 它应该带你到 Nginx 的默认登录页面:
http://your_domain_or_IP
如果你看到上面的页面,你已经成功安装了 Nginx。
第 2 步 — 安装 MariaDB
现在您已经启动并运行了一个 Web 服务器,您需要安装数据库系统才能为您的站点存储和管理数据。
在 Debian 10 中,传统上用于安装 MySQL 服务器的元包 mysql-server
被 default-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,这是 LEMP 堆栈的最后一个组件。
第 3 步 — 安装 PHP 进行处理
你已经安装了 Nginx 来提供你的内容,并安装了 MySQL 来存储和管理你的数据。 现在您可以安装 PHP 来处理代码并为 Web 服务器生成动态内容。
虽然 Apache 在每个请求中嵌入了 PHP 解释器,但 Nginx 需要一个外部程序来处理 PHP 处理并充当 PHP 解释器本身和 Web 服务器之间的 bridge。 这允许在大多数基于 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 服务器时,server blocks(类似于 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
然后,使用您喜欢的命令行编辑器在 Nginx 的 sites-available
目录中打开一个新的配置文件。 在这里,我们将使用 nano
:
sudo nano /etc/nginx/sites-available/your_domain
这将创建一个新的空白文件。 粘贴以下基本配置:
/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 根目录提供文件的基本配置。 它只会响应server_name
之后提供的主机或IP地址的请求,任何以.php
结尾的文件都会在Nginx将结果发送给用户之前由php-fpm
处理.
注意:如果您运行的 PHP 版本不同于 PHP 7.3,则需要调整
fastcgi_pass
以匹配您正在使用的 PHP 版本。
完成编辑后,保存并关闭文件。 如果您使用 nano
创建文件,请键入 CTRL
+X
然后 y
和 ENTER
进行确认。
通过链接到 Nginx 的 sites-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 代码,它将返回有关您的服务器的信息:
/var/www/your_domain/info.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 脚本查询其内容。
首先,使用您在本指南的 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 脚本中:
<?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-fpm
处理 PHP 请求,并且还设置了 MariaDB 数据库来存储您网站的数据。
为了进一步改进您当前的设置,您可以 安装 Composer 以在 PHP 中进行依赖项和包管理,您还可以 使用 Let's Encrypt 为您的网站安装 OpenSSL 证书 ]。