夜雨聆风学习资料网

ARTICLE · 1056519

保姆级实操完整版:Ubuntu 最简源码编译 Nginx + MariaDB + PHP-FPM 9000 端口 搭建 LNMP 环境(附 DVWA 靶场部署)

保姆级实操完整版:Ubuntu 最简源码编译 Nginx + MariaDB + PHP-FPM 9000 端口 搭建 LNMP 环境(附 DVWA 靶场部署)

本文面向 Linux 零基础学习者,100% 复现实操踩坑流程与最终正确配置,采用「Nginx 最简源码编译 + apt 安装 MariaDB + PHP-FPM TCP 9000 端口」架构,所有新手易踩的盲区、报错点均已标注修复方案,跟着逐行复制即可零失败完成搭建。


目录

一、环境说明与全局规划

1.1 LNMP 请求链路与安全红线

1.2 系统与组件版本

1.3 核心路径对照表(与截图完全一致)

二、系统基础初始化(新手零门槛版)

2.1 确认系统与网络信息

2.2 更新系统并安装基础工具

2.3 启用 SSH 服务

2.4 配置 UFW 防火墙

2.5 Windows 端 SSH 远程连接测试

2.6 初始化阶段验收与快照建议

三、源码编译安装 Nginx(最简编译・全踩坑修复版)

3.1 提前安装完整编译依赖(附踩坑说明)

3.2 下载并解压 Nginx 源码

3.3 执行最简编译配置

3.4 编译与安装

3.5 初始化运行环境(解决两大高频报错)

3.6 编写主配置文件(修正运行用户 + 支持 PHP 解析)

3.7 启动 Nginx 并验证

3.8 Nginx 常用管理命令速查

四、安装并初始化 MariaDB

4.1 安装并启动服务

4.2 设置 root 数据库密码

4.3 创建网站专用数据库与账号

五、安装 PHP-FPM 并切换为 TCP 9000 端口

5.1 安装 PHP 与常用扩展

5.2 确认你的 PHP 实际版本(新手必看)

5.3 修改监听方式为 127.0.0.1:9000

5.4 重启服务并验证端口监听

六、功能验证:静态页、PHP 解析、数据库连接

6.1 验证静态页面访问

6.2 验证 PHP 解析能力

6.3 验证 PHP 连接 MariaDB

6.4 清理测试文件(安全提示)

七、防火墙配置与最终全量验收

7.1 放行 Web 80 端口

7.2 最终验收检查清单

7.3 快照保存建议

八、进阶部署:DVWA 渗透测试靶场

8.1 下载并解压 DVWA

8.2 部署到网站目录并设置权限

8.3 修改数据库配置文件

8.4 修复 PHP 配置项(解决 Setup 页红叉报错)

8.5 初始化数据库并登录

九、可选优化:配置 Nginx systemd 服务

十、高频踩坑排错速查表

十一、图片完整流程


一、环境说明与全局规划

1.1 LNMP 请求链路与安全红线

完整请求处理流程: 浏览器/客户端 → Nginx(80端口,接收HTTP请求) → PHP-FPM(127.0.0.1:9000,执行PHP脚本) → MariaDB(127.0.0.1:3306,存储数据)

⚠️ 不可突破的安全红线 PHP-FPM 的 9000 端口、MariaDB 的 3306 端口,仅用于本机组件内部通信。绝对不要在防火墙中放行这两个端口,也不要绑定到 0.0.0.0,否则会有严重的入侵风险。

1.2 系统与组件版本

  • 适用系统:Ubuntu Server 24.04 LTS / 26.04 LTS(实操截图环境为 26.04,默认 PHP 8.5;24.04 默认 PHP 8.3,路径中版本号按需替换即可)
  • Nginx:1.30.3 稳定版,最简源码编译(仅指定安装前缀)
  • 数据库:MariaDB(Ubuntu 官方源默认版本)
  • PHP 处理:PHP-FPM,监听 127.0.0.1:9000

1.3 核心路径对照表(与截图完全一致)

项目
完整路径
Nginx 安装根目录
/usr/local/nginx
Nginx 主配置文件
/usr/local/nginx/conf/nginx.conf
网站根目录(站点文件存放处)
/usr/local/nginx/html
Nginx 日志目录
/usr/local/nginx/logs
Nginx 执行程序
/usr/local/nginx/sbin/nginx
PHP-FPM 池配置文件
/etc/php/8.5/fpm/pool.d/www.conf
PHP-FPM 监听地址
127.0.0.1:9000

二、系统基础初始化(新手零门槛版)

2.1 确认系统与网络信息

先记录主机名、网卡 IP 和路由,方便后续远程连接与排查:

# 查看系统版本与主机名hostnamectl# 简要查看所有网卡IP地址ip -br address# 查看路由表,确认哪张网卡可以访问互联网ip route

2.2 更新系统并安装基础工具

💡 小提示:Linux 终端输入 sudo 密码时不会显示任何字符(星号也不会显示),这是正常的安全设计,正常输入密码后按回车即可。

# 更新软件源sudo apt update# 全量升级系统已安装软件sudo apt full-upgrade -y# 安装后续必备的基础工具sudo apt install -y \  openssh-server open-vm-tools \  git curl wget vim nano tree unzip \  ca-certificates ufw

2.3 启用 SSH 服务

SSH 用于远程管理服务器,是后续操作的基础:

# 设置开机自启并立即启动SSH服务sudo systemctl enable --now sshsudo systemctl enable --now open-vm-tools# 查看SSH服务运行状态sudo systemctl status ssh --no-pager# 确认22端口正在监听sudo ss -lntp | grep ':22'

2.4 配置 UFW 防火墙

必须先放行 SSH,再启用防火墙,否则远程操作时会直接把自己的连接断开:

# 第一步:先放行SSH服务sudo ufw allow OpenSSH# 第二步:启用防火墙sudo ufw enable# 查看防火墙当前规则sudo ufw status verbose

2.5 Windows 端 SSH 远程连接测试

在宿主机 Windows 的 PowerShell 中执行以下命令,验证可以远程连接虚拟机:

powershell

# 测试22端口是否连通Test-NetConnection 你的虚拟机IP地址 -Port 22# 发起SSH远程连接(替换为你的Ubuntu用户名和IP)ssh 你的用户名@192.168.80.20

首次连接会出现主机指纹提示,确认 IP 地址是你的虚拟机后,输入 yes 回车,再输入密码即可登录。登录后可执行 hostnamewhoamipwd 确认身份正确。

2.6 初始化阶段验收与快照建议

完成以上步骤后,确认以下几点:

  1. apt update
     与 full-upgrade 执行完成,无关键报错
  2. SSH 服务状态为 active (running),Windows 可以正常远程登录
  3. 内网网卡没有配置第二个默认网关,避免路由混乱

💡 新手必做:此时创建一个虚拟机快照,命名为 Ubuntu-clean,后续操作出错可随时回滚到干净系统状态。


三、源码编译安装 Nginx(最简编译・全踩坑修复版)

本节采用最简编译参数,完全对应截图操作流程;所有实操中遇到的报错(依赖缺失、日志目录不存在、配置文件缺失)均已提前给出解决方案。

3.1 提前安装完整编译依赖(附踩坑说明)

编译 Nginx 必须先安装开发工具和依赖库,一次性装完可避免反复报错:

sudo apt updatesudo apt install -y \  build-essential libpcre2-dev zlib1g-dev \  libssl-dev pkg-config curl

⚠️ 新手踩坑实录(截图中真实踩过的错误)

  1. 错写包名 libpcre3:Ubuntu 22.04 及以上版本已升级为 PCRE2,正确包名为 libpcre2-dev,输旧包名会提示 Unable to locate package
  2. 错写包名 gcc-c++:Ubuntu 系统中 C++ 编译器包名为 g++,已包含在 build-essential 中,无需单独安装
  3. 所有依赖必须在 ./configure 前安装完成,否则配置过程会反复中断

3.2 下载并解压 Nginx 源码

统一放到 /usr/local/src 源码目录管理:

cd /usr/local/src# 下载Nginx 1.30.3稳定版源码包sudo curl -fLO https://nginx.org/download/nginx-1.30.3.tar.gz# 确认文件下载成功ls -lh nginx-1.30.3.tar.gz# 解压源码包sudo tar -xzf nginx-1.30.3.tar.gz# 修改目录所有者为当前用户,避免编译时权限不足sudo chown -R "$USER":"$USER" nginx-1.30.3cd nginx-1.30.3

3.3 执行最简编译配置

仅指定安装前缀,所有文件都会安装到 /usr/local/nginx 目录下:

bash

运行

./configure --prefix=/usr/local/nginx

执行完成后,末尾出现 Configuration summary 且没有 error 即为成功。如果提示缺少 PCRE、zlib、OpenSSL 等库,回到上一步补装对应 -dev 包后重新执行即可。

3.4 编译与安装

# 多核编译,nproc会自动获取CPU核心数,加快编译速度make -j"uri  {            try_files document_root 配置块是否正确,并重载配置。6.3 验证 PHP 连接 MariaDB创建数据库连接测试文件:sudo nano /usr/local/nginx/html/test_db.php写入以下测试代码:php运行<?php$host = '127.0.0.1';$port = 3306;$user = 'webuser';$password = 'Web@123456';$database = 'webdb';$conn = new mysqli($host$user$password$database$port);if ($conn->connect_error) {    http_response_code(500);    die('数据库连接失败:' . htmlspecialchars(conn->set_charset('utf8mb4');echo '数据库连接成功!<br>';echo '数据库版本:' . htmlspecialchars(conn->close();?>测试访问:curl http://127.0.0.1/test_db.php显示「数据库连接成功」和 MariaDB 版本号即为正常。如果连接失败,请核对数据库账号密码、授权是否正确。6.4 清理测试文件(安全提示)验证完成后,请删除包含环境信息和账号密码的测试文件,避免泄露:sudo rm /usr/local/nginx/html/info.phpsudo rm /usr/local/nginx/html/test_db.php七、防火墙配置与最终全量验收7.1 放行 Web 80 端口仅开放 80 端口给你的实验网段,示例网段 192.168.80.0/24 请替换为实际网段:sudo ufw allow from 192.168.80.0/24 to any port 80 proto tcp# 查看当前所有规则sudo ufw status numbered7.2 最终验收检查清单执行以下命令,逐一确认所有组件正常运行:# 查看所有核心服务运行状态systemctl --no-pager --full status mariadb ssh php8.5-fpm# 查看所有关键端口监听情况sudo ss -lntp | grep -E ':(22|80|9000|3306)\b'# Nginx配置语法检查sudo /usr/local/nginx/sbin/nginx -t# 本地页面访问测试curl -i http://127.0.0.1/# 数据库专用账号登录测试mariadb -u webuser -p -D webdb检查项正确结果Nginx 配置测试syntax is ok / test is successful80 端口Nginx 进程监听,可从实验网段访问9000 端口仅监听 127.0.0.1,由 php-fpm 进程占用3306 端口MariaDB 正常运行,不向实验网段开放静态页面正常返回页面内容,不报错PHP 页面正常输出版本号,不出现文件下载现象数据库账号webuser 可正常登录 webdb 库,无其他库权限7.3 快照保存建议全部验收通过后,创建虚拟机快照,命名为 LNMP-ready。后续部署网站、靶场前,可随时回滚到这个干净的基础环境。八、进阶部署:DVWA 渗透测试靶场8.1 下载并解压 DVWAcd /usr/local/src# 下载DVWA最新版源码sudo curl -fLO https://github.com/digininja/DVWA/archive/refs/heads/master.zip# 解压sudo unzip master.zip8.2 部署到网站目录并设置权限# 移动到网站根目录sudo mv DVWA-master /usr/local/nginx/html/dvwa# 统一设置目录所有者,避免权限报错sudo chown -R www-data:www-data /usr/local/nginx/html/dvwa8.3 修改数据库配置文件cd /usr/local/nginx/html/dvwa/config# 从模板复制出正式配置文件sudo cp config.inc.php.dist config.inc.php# 编辑配置sudo nano config.inc.php修改数据库连接信息为我们之前创建的专用账号:php_DVWA[ 'db_server' ]   = '127.0.0.1';_DVWA[ 'db_user' ]     = 'webuser';_DVWA[ 'db_port' ]     = '3306';8.4 修复 PHP 配置项(解决 Setup 页红叉报错)DVWA 的初始化页面会检查 PHP 配置项,默认配置会出现多项红叉,需要修改 php.ini:# 编辑PHP-FPM配置文件,版本号替换为你的实际版本sudo nano /etc/php/8.5/fpm/php.ini找到并修改以下参数:iniallow_url_include = Onallow_url_fopen = Ondisplay_errors = On修改完成后重启 PHP-FPM 生效:sudo systemctl restart php8.5-fpm8.5 初始化数据库并登录浏览器访问 http://你的虚拟机IP/dvwa/setup.php,拉到页面底部点击 Create / Reset Database 完成数据库初始化。初始化完成后会自动跳转到登录页,默认账号密码:用户名:admin密码:password九、可选优化:配置 Nginx systemd 服务默认最简编译的 Nginx 只能通过二进制文件管理,配置 systemd 后可以用 systemctl 统一管理,更符合服务器运维规范。该步骤为可选进阶内容。创建服务单元文件:sudo nano /etc/systemd/system/nginx.service写入以下内容:[Unit]Description=Nginx built from sourceDocumentation=https://nginx.org/en/docs/After=network-online.targetWants=network-online.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -qExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s quitTimeoutStopSec=10KillMode=mixedPrivateTmp=true[Install]WantedBy=multi-user.target重载 systemd 并设置开机自启:sudo systemctl daemon-reloadsudo systemctl enable nginx配置完成后,就可以用以下命令管理 Nginx 了:# 启动/停止/重启/重载sudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginxsudo systemctl reload nginx# 查看状态sudo systemctl status nginx十、高频踩坑排错速查表表格故障现象核心原因快速解决方法./configure 报错 PCRE library not found依赖包名写错,装成了旧版本安装 libpcre2-dev,不是 libpcre3启动 Nginx 报 error.log failed (2: No such file or directory)日志目录未创建执行 sudo mkdir -p /usr/local/nginx/logsNginx 启动报 fastcgi_params 找不到最简编译只有模板文件复制 .default 后缀文件为正式配置文件PHP 页面返回 502 Bad GatewayNginx 转发地址与 PHP-FPM 监听地址不一致用 `ss -lntpgrep 9000确认监听地址,两边必须都是127.0.0.1:9000`浏览器直接下载 PHP 文件Nginx 未匹配到 PHP 解析规则检查 nginx.conf 中 location ~ \.php$ 配置块,重载配置网站文件 403 Forbidden文件所有者和 Nginx 运行用户不一致执行 sudo chown -R www-data:www-data /usr/local/nginx/html数据库连接报错 1045 Access denied用户名、密码、主机或授权不匹配用命令行测试账号登录,执行 SHOW GRANTS 查看权限9000 端口显示 0.0.0.0监听了所有网卡,有安全风险改回 listen = 127.0.0.1:9000 并重启 PHP-FPMDVWA Setup 页全是红叉PHP 配置项未开启修改 php.ini 中的 allow_url_include 等参数,重启 PHP-FPM常用排错命令速查:# 查看PHP-FPM系统日志sudo journalctl -u php8.5-fpm -n 50 --no-pager# 查看MariaDB系统日志sudo journalctl -u mariadb -n 50 --no-pager# 查看Nginx错误日志sudo tail -n 50 /usr/local/nginx/logs/error.log# 查看所有监听端口sudo ss -lntp# 查看防火墙详细规则sudo ufw status verbose排错建议按照「地址 → 路由 → 端口 → HTTP → PHP-FPM → 数据库 → 应用配置」的顺序逐层定位,不要一遇到错误就盲目重装系统。十一、图片完整流程Nginx 源码编译依赖踩坑与编译安装完整操作记录 对应内容:apt 更新、依赖包名踩错、configure 报错、补装正确依赖、重新编译的完整终端过程。LNMP 全组件安装配置与启动排错完整操作记录 对应内容:Nginx 安装收尾、PHP-FPM 安装、MariaDB 初始化、9000 端口修改、Nginx 启动报错排错、DVWA 源码解压。DVWA 靶场部署与 PHP 环境配置完整操作记录 对应内容:DVWA 文件部署、数据库配置文件修改、PHP 扩展验证、PHP 版本切换。

相关学习资料