Ubuntu 18.04 服务器:安装和配置 Nginx、PHP 和 MariaDB
要在 Ubuntu 18.04 上同时使用 Nginx、PHP-FPM 和 MariaDB,您需要安装每个软件包,将 Nginx 的 PHP 请求传递给 PHP-FPM 套接字,然后使用单独的帐户设置数据库。下面的示例仅用于本地练习,不会更改现有站点,并且不会将数据库根帐户用于 Web 应用程序。
练习范围和准备
Ubuntu 18.04 的一般安全支持已结束。请检查是否已应用 Ubuntu Pro 的扩展安全维护 (ESM) 以及每个软件包的支持范围,见 Ubuntu 安全维护计划,并建议使用受支持的版本构建新的操作环境。本文以默认仓库中的 PHP 7.2 为例,了解现有的 18.04 服务器。
准备一台具有管理员权限和仓库访问权限的独立测试服务器。Nginx 处理 Web 请求,PHP-FPM(FastCGI 进程管理器)执行 PHP 代码,MariaDB 存储数据。示例仅在 127.0.0.1:8080 中接收,因此无法从服务器外部直接访问它们。若需公共互联网访问,则需要单独的防火墙、域名、TLS 证书和安全审查。
在已有服务或数据的服务器上,在进行更改之前,请准备备份和恢复程序。如果下面的练习路径、账户、数据库名称或端口 8080 已经在使用中,请不要按原样进行操作;请使用单独的测试环境。您可以使用以下命令检查端口使用情况。如果没有输出,则该端口没有 TCP 监听器。
sudo ss -lntp | grep ':8080 '
软件包安装和服务验证
安装软件包可能会自动启动默认 Nginx 站点并监听 80 端口。将练习站点限制在本地 8080 端口不会限制默认站点。安装之前,请使用网络和防火墙措施隔离测试服务器,并检查对现有服务的影响。
在更新软件包列表后,安装 Nginx、带有 MySQL 驱动的 PHP 7.2 FPM、MariaDB 服务器以及用于验证的 curl。如果由于仓库或支持问题无法使用软件包,请在继续之前解决错误。
sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl
安装后,使用以下命令检查服务状态和 PHP-FPM 套接字。如果服务未运行,请查明原因并启动服务。如果套接字路径不同,请调整下面的 Nginx 配置以匹配实际路径。
systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/
检查三个服务中的每一个是否为 active。如果 php7.2-fpm.sock 不存在,请在 systemctl status php7.2-fpm 和服务日志中检查原因。当 PHP 版本不同,需要同时更改软件包和套接字路径。
Nginx 和 PHP-FPM 连接
创建一个新的练习目录和配置文件。如果 /var/www/lnmp-demo、/etc/nginx/sites-available/lnmp-demo 或 /etc/nginx/sites-enabled/lnmp-demo 已存在,请不要覆盖。在确认干净服务器上不存在该路径后,执行下面的编辑命令。
sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo
将在编辑器中保存以下完整的服务器块。fastcgi_pass 必须与之前确认的 PHP-FPM 套接字匹配。snippets/fastcgi-php.conf 是来自 Ubuntu Nginx 软件包的配置片段;如果该文件不存在,请检查发行版中的 FastCGI 设置。
server {
listen 127.0.0.1:8080;
server_name localhost;
root /var/www/lnmp-demo;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
激活并检查配置文件。仅在 nginx -t 成功时重新加载。如果失败,检查并纠正错误、端口和套接字路径,然后重新检查。如果出现问题,仅删除本练习中创建的符号链接,然后重新检查并重新加载以保持现有站点配置。
sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx
Nginx FastCGI 连接也可以在 Nginx 官方指南 中检查。
检查 PHP 执行
检查以下路径下是否没有文件,并创建一个新文件。在编辑器中保存下面的代码。
sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";
在同一服务器上运行以下命令。如果出现 PHP is working 和 SAPI: fpm-fcgi,说明 Nginx 已通过 PHP-FPM 执行了代码。如果 PHP 代码按原样显示,则说明配置未生效,因此不要暴露测试文件,并再次检查 FastCGI 设置。
curl http://127.0.0.1:8080/
如果出现 502 错误,请检查 PHP-FPM 服务、套接字路径及权限;如果出现 404 错误,请检查文档目录和文件路径。不要暴露显示详细服务器设置的 phpinfo() 页面。
MariaDB 数据库和单独账户
MariaDB 管理员认证依赖于安装方法。如果设置了本地套接字认证,可以使用以下命令打开管理控制台。如果失败,请检查现有的管理员认证方法。MYSQL_HISTFILE=/dev/null 指定此客户端会话不应生成命令历史文件。
sudo env MYSQL_HISTFILE=/dev/null mysql
以下是创建新的练习数据库和仅限本地账户的 SQL。如果同名已存在,请不要修改现有条目;使用不同的名称。在执行之前,将 CHANGE_ME_STRONG_PASSWORD 替换为一个长且唯一的密码,并确保 SQL 字符串中的任何引号或反斜杠都已正确转义。
CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;
此示例账户在数据库上具有只读权限。如果实际应用程序需要写入或更改模式的权限,请仅单独授予必要的权限。不要直接修改管理员账户的身份验证插件,也不要将 root 权限赋予 Web 应用程序。有关账户和身份验证的更多详细信息,请参阅 MariaDB CREATE USER 文档。
验证新账户是否可以本地连接。不要在命令行上直接输入密码;请在提示符下输入。连接后,执行 SELECT DATABASE(), CURRENT_USER(); 将显示数据库和已验证的账户。使用 EXIT; 退出控制台。
mysql -u lnmp_demo -p lnmp_demo
在 PHP 中检查数据库连接
以下是使用上面创建的账户进行的临时验证方法。请将凭据保存在网页文档目录之外。如果 /etc/lnmp-demo 已存在,请不要覆盖它;改为使用单独的测试环境。这假设默认配置下 PHP-FPM 运行在 www-data 组下。
sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php
将以下内容插入文件中,并将密码替换为数据库账户设置的值。如果 PHP 字符串中有引号或反斜杠,请正确转义。由于使用相同 www-data 权限运行的其他应用也可以读取该文件,因此在共享服务器上需要进行单独隔离。
<?php
return array(
'user' => 'lnmp_demo',
'password' => 'CHANGE_ME_STRONG_PASSWORD',
);
确保 /var/www/lnmp-demo/db-check.php 不存在并保存以下代码。仅指示成功或失败,以避免在网页响应中暴露错误信息或密码。
sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
$db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
$config['user'], $config['password'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
echo "Database connection OK\n";
} catch (PDOException $e) {
http_response_code(500);
echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php
如果出现 HTTP 200 和 Database connection OK,则表示 PHP 连接 MariaDB 成功。如果失败,请检查 PHP 的 MySQL 扩展、服务状态、套接字认证及账号/密码。验证后,安全地移除临时 PHP 文件和凭证文件,并清理不再需要的练习账号和数据库,同时检查实际目标和备份。
在应用于生产环境之前
该实践环境设置用于本地连接验证。在将实际服务公开之前,请迁移到受支持的操作系统和 PHP 版本,并根据环境配置 Nginx 服务器名称和文档根目录、HTTPS 证书、防火墙和云网络规则。您还需要审核 PHP 文件上传/执行范围、FPM 用户隔离以及 MariaDB 的网络访问、备份和恢复。
MariaDB 安全配置工具根据已安装的版本提供为 mysql_secure_installation 或 mariadb-secure-installation。由于可能影响现有服务,请阅读每个问题并根据您的环境进行选择。详细项目可在 MariaDB 安全配置工具说明 中找到。




