如何在CentOS8上安装Linux、Nginx、MySQL、PHP(LEMP)堆栈

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

介绍

LEMP 软件堆栈是一组软件,可用于提供用 PHP 编写的动态网页和 Web 应用程序。 名称“LEMP”是一个首字母缩写词,描述了带有 Nginx(发音为“Engine-X”)Web 服务器的 Linux 操作系统。 后端数据存储在 MariaDB 数据库中,动态处理由 PHP 处理。

LEMP 堆栈中的数据库层通常是 MySQL 数据库服务器,但在 CentOS 8 发布之前,默认的 CentOS 存储库中不提供 MySQL。 正因为如此,MariaDB,一个 MySQL 的社区分支,作为 CentOS 机器上 LEMP 堆栈的默认数据库系统,成为 MySQL 的一个被广泛接受的替代品。 MariaDB 可作为原始 MySQL 服务器的直接替代品,这实际上意味着您可以切换到 MariaDB,而无需在应用程序中进行任何配置或代码更改。

在本指南中,您将在 CentOS 8 服务器上安装 LEMP 堆栈。 虽然 MySQL 可从 CentOS 8 的默认存储库中获得,但本指南将介绍使用 MariaDB 作为数据库管理系统设置 LEMP 堆栈的过程。

先决条件

要遵循本指南,您需要以具有 sudo 权限的非 root 用户身份访问 CentOS 8 服务器,并在服务器上安装活动防火墙。 要进行此设置,您可以按照我们的 CentOS 8 初始服务器设置指南进行操作。

第 1 步 — 安装 Nginx Web 服务器

为了向我们的网站访问者显示网页,我们将使用 Nginx,一个高性能的网络服务器。 我们将使用 dnf 包管理器,它是 CentOS 8 上新的默认包管理器,来安装这个软件。

安装 nginx 包:

sudo dnf install nginx

出现提示时,输入 y 以确认您要安装 nginx。

安装完成后,运行以下命令启用并启动服务器:

sudo systemctl start nginx

如果您按照我们的初始服务器设置指南启用了 firewalld 防火墙,则需要允许连接到 Nginx。 以下命令将永久启用 HTTP 连接,默认情况下在端口 80 上运行:

sudo firewall-cmd --permanent --add-service=http

要验证是否应用了更改,您可以运行:

sudo firewall-cmd --permanent --list-all

你会看到这样的输出:

Outputpublic
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

您需要重新加载防火墙配置以使更改生效:

sudo firewall-cmd --reload

添加新的防火墙规则后,您可以通过从 Web 浏览器访问服务器的公共 IP 地址或域名来测试服务器是否已启动并运行。

注意:如果您使用 DigitalOcean 作为 DNS 托管服务提供商,您可以查看我们的 产品文档 以获取有关如何设置新域名并将其指向您的服务器的详细说明。


如果您没有指向您的服务器的域名并且您不知道您的服务器的公共 IP 地址,您可以通过运行以下命令找到它:

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

这将打印出一些 IP 地址。 您可以在您的网络浏览器中依次尝试它们中的每一个。

作为替代方案,您可以检查从 Internet 上的其他位置查看的 IP 地址是可访问的:

curl -4 icanhazip.com

在您的网络浏览器中输入您收到的地址,它将带您进入 Nginx 的默认登录页面:

如果您看到此页面,那么您的 Web 服务器现在已正确安装。

第 2 步 — 安装 MariaDB

现在您已经启动并运行了一个 Web 服务器,您需要安装一个数据库系统以便能够为您的站点存储和管理数据。 我们将安装 MariaDB,这是 Oracle 原始 MySQL 服务器的社区开发分支。

要安装此软件,请运行:

sudo dnf install mariadb-server

安装完成后,您可以启用并启动 MariaDB 服务器:

sudo systemctl start mariadb

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

sudo mysql_secure_installation

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

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

从那里,您可以按 Y 然后按 ENTER 接受所有后续问题的默认值。 这将删除匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便服务器立即尊重您所做的更改。

完成后,输入以下命令登录 MariaDB 控制台:

sudo mysql

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

OutputWelcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server

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 控制台来测试新用户是否具有适当的权限,这次使用自定义用户凭据:

mysql -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-FPM

你已经安装了 Nginx 来提供你的内容,并安装了 MariaDB 来存储和管理你的数据。 现在您可以安装 PHP 来处理代码并为 Web 服务器生成动态内容。

虽然 Apache 在每个请求中嵌入了 PHP 解释器,但 Nginx 需要一个外部程序来处理 PHP 处理并充当 PHP 解释器本身和 Web 服务器之间的桥梁。 这允许在大多数基于 PHP 的网站中获得更好的整体性能,但它需要额外的配置。 您需要安装 php-fpm,它代表“PHP fastCGI 进程管理器”,并告诉 Nginx 将 PHP 请求传递给该软件进行处理。 此外,您还需要 php-mysqlnd,这是一个 PHP 模块,它允许 PHP 与基于 MySQL 的数据库进行通信。 核心 PHP 包将自动安装为依赖项。

要安装 php-fpmphp-mysql 软件包,请运行:

sudo dnf install php-fpm php-mysqlnd

安装完成后,您需要编辑 /etc/php-fpm.d/www.conf 文件以调整几个设置。

CentOS 8 自带的默认文本编辑器是 vivi 是一个非常强大的文本编辑器,但对于缺乏使用经验的用户来说可能有些迟钝。 您可能需要安装更用户友好的编辑器,例如 nano 以方便在 CentOS 8 服务器上编辑配置文件:

sudo dnf install nano

现在使用 nano 或您选择的编辑器打开 /etc/php-fpm.d/www.conf 配置文件:

sudo nano /etc/php-fpm.d/www.conf

现在寻找 usergroup 指令。 如果您使用的是 nano,您可以点击 CTRL+W 在打开的文件中搜索这些术语。

/etc/php-fpm.d/www.conf

…
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
…

您会注意到 usergroup 变量都设置为 apache。 我们需要将这些更改为 nginx

/etc/php-fpm.d/www.conf

…
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
…

完成编辑后保存并关闭文件。 如果您使用 nano,请按 CTRL + X,然后按 YENTER

要启用和启动 php-fpm 服务,请运行:

sudo systemctl start php-fpm

最后,重启 Nginx Web 服务器,使其加载 php-fpm 安装创建的配置文件:

sudo systemctl restart nginx

您的 Web 服务器现在已完全设置。 在下一步中,我们将创建一个 PHP 测试脚本以确保一切都按预期工作。

第 4 步 — 使用 Nginx 测试 PHP

在 CentOS 8 上,默认的 php-fpm 安装会自动创建配置文件,允许您的 Nginx Web 服务器处理位于 /usr/share/nginx/html 的默认文档根目录中的 .php 文件。 您不需要对 Nginx 的配置进行任何更改,以便 PHP 在您的 Web 服务器中正常工作。

我们要做的唯一调整是更改 Nginx 文档根文件夹的默认权限设置。 这样,您就可以使用常规系统用户在该目录中创建和修改文件,而无需在每个命令前加上 sudo

以下命令会将默认 Nginx 文档根目录的所有权更改为名为 sammy 的用户和组,因此请务必替换此命令中突出显示的用户名和组以反映您系统的用户名和组。

sudo chown -R sammy.sammy /usr/share/nginx/html/

我们现在将创建一个测试 PHP 页面以确保 Web 服务器按预期工作。

/usr/share/nginx/html 目录下创建一个名为 info.php 的新 PHP 文件:

nano /usr/share/nginx/html/info.php

以下 PHP 代码将显示有关服务器上当前运行的 PHP 环境的信息:

/usr/share/nginx/html/info.php

<?php

phpinfo();

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

现在我们可以测试我们的 Web 服务器是否可以正确显示 PHP 脚本生成的内容。 转到您的浏览器并访问您的服务器主机名或 IP 地址,然后是 /info.php

http://server_host_or_IP/info.php

你会看到一个类似这样的页面:

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

rm /usr/share/nginx/html/info.php

如果以后需要,您可以随时重新生成此文件。 接下来,我们将从 PHP 端测试数据库连接。

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

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

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

mysql -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 /usr/share/nginx/html/todo_list.php

将以下内容添加到您的 PHP 脚本中:

/usr/share/nginx/html/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://server_host_or_IP/todo_list.php

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

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

结论

在本指南中,您已经为使用 Nginx 作为 Web 服务器为访问者提供 PHP 网站和应用程序建立了一个灵活的基础。 您已经设置了 Nginx 以通过 php-fpm 处理 PHP 请求,并且还设置了 MariaDB 数据库来存储您网站的数据。