本教程适用于以下操作系统版本

  • Ubuntu 24.04(Noble Numbat)
  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)
  • Ubuntu 20.04(Focal Fossa)
  • Ubuntu 18.04(Bionic Beaver)
  • Ubuntu 16.04(Xenial Xerus)

本页内容

  • 先决条件
  • 安装 Nginx 网页服务器
  • 安装 MariaDB 服务器
  • 安装 PHP-FPM
  • 将 Nginx 与 PHP-FPM 集成
  • 创建 Nginx 服务器块(虚拟主机)
  • 测试你的服务器块配置
  • 结论

LEMP 堆栈(Linux、Nginx、MySQL/MariaDB 和 PHP)是一组用于托管和开发 PHP Web 应用程序的免费开源软件。LEMP 堆栈可用于部署静态和动态 Web 应用程序。

本指南将向你展示如何在 Ubuntu 24.04 "Noble Numbat" 上安装 LEMP 堆栈(Linux、Nginx、MySQL/MariaDB 和 PHP)。我们还将演示如何加固 MariaDB 服务器,并创建 Nginx 服务器块配置来托管网站或域名。

先决条件

在开始之前,请确保你拥有一台安装了 Ubuntu 24.04 "Noble Numbat" 的机器,并使用具有 root 权限或具备 sudo/管理员权限的非 root 用户。同时,请确保 UFW(Uncomplicated Firewall,简易防火墙)已运行并启用。

安装 Nginx 网页服务器

Nginx(又称 engine-x)是互联网上最流行的网页服务器。它之所以流行,是因为 Nginx 能够以最少的系统资源同时处理高并发流量。在第一步中,你将把 Nginx 网页服务器安装到 Ubuntu 服务器上。

在安装软件包之前,请使用以下命令更新并刷新你的 Ubuntu 软件包列表。

sudo apt update

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

使用以下命令将 Nginx 网页服务器安装到你的 Ubuntu 机器上。当系统提示时,输入 Y 确认安装。

sudo apt install nginx

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

安装完成后,Nginx 服务应该已经在你的系统上运行并设置为开机自启。使用以下命令验证 Nginx 服务。

sudo systemctl is-enabled nginx
sudo systemctl status nginx

你应该会看到 Nginx 服务的状态为 'enabled'(已启用),当前状态为 'active (running)'(运行中)。

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

在访问 Nginx 之前,你需要通过 UFW(Uncomplicated Firewall,简易防火墙)在 Ubuntu 服务器上开放 HTTP 和 HTTPS 端口。

执行以下 'ufw' 命令以启用 'Nginx Full'(完整 Nginx)配置项,该配置将允许对 Ubuntu 服务器的 HTTP 和 HTTPS 访问。

sudo ufw allow 'Nginx Full'

现在使用以下命令验证 UFW 规则。请确保 'Nginx Full' 配置项已启用,状态为 'ALLOW'(允许)。

sudo ufw status

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

最后,从你常用的网页浏览器访问 http://192.168.5.30/ 以打开你的 Nginx 安装页面。如果成功,你应该会看到如下默认的 'index.html' 页面:

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

安装 MariaDB 服务器

安装完 Nginx 后,你将在 Ubuntu 上安装 MariaDB 服务器。在本示例中,你将通过 Ubuntu 软件仓库安装 MariaDB,然后使用 'mariadb-secure-installation' 工具加固 MariaDB 安装。

要在 Ubuntu 上安装 MariaDB 服务器,请执行以下 'apt install' 命令。输入 Y 并按 ENTER 键继续。

sudo apt install mariadb-server

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

安装完成后,使用以下命令验证 MariaDB 服务。这将显示 MariaDB 服务的状态。

sudo systemctl is-enabled mariadb
sudo systemctl status mariadb

MariaDB 服务处于 'enabled'(已启用)状态,当前状态为 'active (running)'(运行中)。

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

安装 MariaDB 服务器后,你必须通过 'mariadb-secure-installation' 进行加固。这可以让你设置 MariaDB 的 root 密码、禁用 root 用户的远程认证,并从 MariaDB 服务器安装中删除不必要的数据库和权限。

运行以下 'mariadb-secure-installation' 命令来加固 MariaDB 服务器。

sudo mariadb-secure-installation

当提示输入 MariaDB root 密码时,按 ENTER 键。

当提示输入 MariaDB root 密码时,按 ENTER。

Enter current password for root (enter for none):
OK, successfully used password, moving on...

当询问是否切换到 unix_socket 认证时,输入 'n'。

Switch to unix_socket authentication [Y/n] n
 ... skipping.

输入 Y 以配置 MariaDB root 密码。然后,输入你的新密码并重复确认。

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

输入 Y 以从 MariaDB 服务器安装中删除默认的匿名用户。

Remove anonymous users? [Y/n] Y
 ... Success!

输入 Y 以禁用 MariaDB root 用户的远程登录。root 用户应始终从 localhost 连接。

Disallow root login remotely? [Y/n] Y
 ... Success!

现在再次输入 Y,以从 MariaDB 服务器中删除默认的 test 数据库及其权限。

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

输入 Y 以重新加载权限表并应用你到目前为止所做的所有更改。

Reload privilege tables now? [Y/n] Y
 ... Success!

完成后,你将看到如下提示信息:

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!

PHP-FPM(FastCGI Process Manager,FastCGI 进程管理器)是 PHP 的 FastCGI 实现的一种替代方案。它主要用于以 Nginx 作为网页服务器的高流量站点。在本节中,你将安装 PHP-FPM 以及若干附加扩展,例如用于 MySQL/MariaDB 驱动的 mysqli、opcache,以及用于缓存的 APCu。

使用以下命令将 PHP-FPM 安装到你的 Ubuntu 服务器上。当系统提示时,输入 Y 并按 ENTER 键继续。

使用以下命令在 Ubuntu 服务器上安装 PHP-FPM。出现提示时,输入 Y 并按 ENTER 继续。

sudo apt install php-fpm php-mysql php-curl php-gd php-json php-intl php-bcmath php-opcache php-apcu php-mbstring php-fileinfo php-xml php-soap php-tokenizer php-zip

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

安装完成后,PHP-FPM 服务应当已启动并运行。使用以下命令检查 PHP-FPM 的服务状态。

sudo systemctl is-enabled php8.3-fpm
sudo systemctl status php8.3-fpm

如下所示,PHP-FPM 的状态为 'active (running)'(运行中),并在系统启动时 'enabled'(已启用):

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

使用以下命令查看 PHP-FPM sock 文件的所在路径。

使用以下命令检查 PHP-FPM sock 文件所在的路径。

ss -pl | grep php

在以下输出中,你可以看到 PHP-FPM 的 sock 文件位于 '/run/php/php8.3-fpm.sock'。

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

既然你已经安装了 PHP-FPM,现在是将它与 Nginx 网页服务器集成的时候了。为此,你必须确切知道 PHP-FPM sock 文件的路径,然后修改默认的 Nginx 服务器块文件。

使用以下 nano 编辑器命令打开服务器块配置文件 '/etc/nginx/sites-available/default'。

使用以下 nano 编辑器命令打开服务器块配置文件 '/etc/nginx/sites-available/default'。

sudo nano /etc/nginx/sites-available/default

取消以下行的注释,并确保将 PHP-FPM sock 文件的路径改为新的位置。

 # pass PHP scripts to FastCGI server
 #
 location ~ \.php$ {
     include snippets/fastcgi-php.conf;
     # # With php-fpm (or other unix sockets):
     fastcgi_pass unix:/run/php/php8.3-fpm.sock;
     # # With php-cgi (or other tcp sockets):
     # fastcgi_pass 127.0.0.1:9000;
 }

现在运行以下 'nginx' 命令来验证你的 Nginx 配置语法。在对 Nginx 配置做出修改后,你都必须运行此命令。

现在运行以下 'nginx' 命令来验证你的 Nginx 语法。在修改 Nginx 配置后,你必须运行此命令。

sudo nginx -t

如果你的 Nginx 语法正确,你应该会看到类似如下的确认信息:

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

接下来,运行以下命令重启 Nginx 服务,使 Nginx 与 PHP-FPM 的集成生效。

sudo systemctl restart nginx

在 Nginx 重启后,你可以通过 PHPINFO 文件验证集成是否成功。运行以下命令,在默认 web 根目录 '/var/www/html/' 下创建 PHPINFO 文件 'info.php'。

echo "<?php phpinfo(); ?>" > /var/www/html/info.php

你可以在下方看到,在 Nginx 网页服务器下,PHP 8.3 正以 PHP-FPM 作为服务器 API 运行。

如下所示,PHP 8.3 正在 Nginx Web 服务器下以 PHP-FPM 作为服务器 API 运行。

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

向下滚动页面,你还会看到 PHP 的 mysqli/mysqlnd 扩展也已安装。

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

最后,你还会看到 PHP 安装中已启用通过 APC 的缓存。

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

服务器块(server block)是 Nginx 网页服务器中“虚拟主机”(virtual host)的另一种叫法。它用于在单台服务器上托管多个网站或域名。在本节中,你将学习如何创建一个 Nginx 服务器块。

在创建服务器块配置之前,运行以下命令创建一个新的网站根目录 '/var/www/newsite/public_html' 以及一个自定义的 'index.html' 页面。

在创建服务器块配置之前,运行以下命令创建一个新的 web 根目录 '/var/www/newsite/public_html' 以及自定义的 'index.html' 页面。

mkdir -p /var/www/newsite/public_html
echo "Welcome to newsite.com" > /var/www/newsite/public_html/index.html

现在运行以下命令,将 '/var/www/newsite' 目录的所有权更改为用户 'www-data'。在 Ubuntu 系统中,Nginx Web 服务器以 'www-data' 用户身份运行。

sudo chown -R www-data:www-data /var/www/newsite

接下来,运行以下 nano 编辑器命令,创建新的服务器块配置文件 '/etc/nginx/sites-available/newsite'。

sudo nano /etc/nginx/sites-available/newsite

插入以下配置,确保将 server_name 选项改为你的域名,并将 web 根目录改为新路径,例如 '/var/www/newsite/public_html'。

server {
   listen 80;
   server_name newsite.com;
   root /var/www/newsite/public_html;
   index index.html;
   location ~ \.php$ {
     include snippets/fastcgi-php.conf;
     fastcgi_pass unix:/run/php/php8.3-fpm.sock;
   }
   location / {
     try_files $uri $uri/ =404;
   }
}

现在运行以下命令来启用名为 'newsite' 的服务器块配置。通过该命令,你将在 '/etc/nginx/sites-enabled/' 目录中创建 '/etc/nginx/sites-available/newsite' 文件的新符号链接。

现在运行以下命令以启用服务器块配置 'newsite'。该命令会在 '/etc/nginx/sites-enabled/' 目录下创建 '/etc/nginx/sites-available/newsite' 文件的符号链接。

sudo ln -s /etc/nginx/sites-available/newsite /etc/nginx/sites-enabled/

在服务器块启用后,运行以下 'nginx' 命令检查你的 Nginx 语法。

sudo nginx -t

最后,运行以下命令重启 Nginx 网页服务器,以应用你新的服务器块配置。完成后,你的服务器块配置应该可以从本地机器访问了。

最后,运行以下命令重启 Nginx Web 服务器并应用你新的服务器块配置。至此,你的服务器块配置应当可以从本地机器访问。

sudo systemctl restart nginx

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

为了确保你的 Nginx 服务器块配置成功,你需要从本地计算机访问该服务器块配置对应的域名。如果你使用的是公网域名,直接访问该域名即可。但对于本地域名用户,需要编辑本地计算机上的 'hosts' 文件。

["对于 Linux 和 MacOS 用户,以 root/管理员权限编辑 '/etc/hosts' 文件。", "对于 Windows 用户,以管理员身份编辑 'C:\\Windows\\System32\\drivers\\etc\\hosts' 文件。"]

  • For Linux and MacOS users, edit the ' /etc/hosts ' file as root/administrative privileges.
  • For Windows users, edit the file ' C:\Windows\System32\drivers\etc\hosts ' as administrator.

按如下方式添加你的服务器 IP 地址和域名:

192.168.5.30 newsite.com

现在打开你的网页浏览器并访问 http://newsite.com/。如果你的 Nginx 服务器块配置成功,你应该会看到你创建的自定义 'index.html' 页面,如下所示:

现在打开你的 Web 浏览器并访问 http://newsite.com/。如果你的 Nginx 服务器块配置成功,你应该会看到你所创建的自定义 'index.html' 页面,如下所示:

在 Ubuntu 上安装 Nginx、PHP 与 MySQL 搭建 LEMP 堆栈

恭喜!你现已在 Ubuntu 24.04 "Noble Numbat" 上安装了 LEMP 堆栈(Linux、Nginx、MySQL/MariaDB 和 PHP)。你还加固了 MariaDB 服务器的安装,并创建了一个 Nginx 服务器块来托管多个网站。

恭喜!你现已在 Ubuntu 24.04 "Noble Numbat" 上安装了 LEMP 堆栈(Linux、Nginx、MySQL/MariaDB 和 PHP)。你还加固了 MariaDB 服务器安装,并创建了 Nginx 服务器块来托管多个网站。