CentOS 8 部署生产级 LEMP 环境实战指南
1. 项目概述在 CentOS 8 上亲手搭起一个真正能干活的 LEMP 环境你是不是也遇到过这种情况刚配好 Nginx访问首页显示 “Welcome to nginx!”挺高兴一配上 PHP页面直接变成一片空白连个错误都不报再装 MySQL服务起不来日志里全是“Failed to start mysqld.service: Unit not found”最后查了一堆教程发现写的全是 CentOS 7 的命令systemctl restart httpd可你装的是 Nginx压根没装 Apacheyum install mysql-serverCentOS 8 早就把 MySQL 换成 MariaDB 了而且默认源里根本没这包。折腾半天服务器还是个摆设——这不是技术问题是环境认知错位。这个标题 “So installieren Sie Linux, Nginx, MySQL, PHP (LEMP) Stapel unter CentOS 8” 看似一句德语安装指南但它背后戳中的是一个非常现实、非常普遍的痛点如何在已被官方明确标记为“生命周期结束EOL”的 CentOS 8 上安全、稳定、可复现地部署一套生产级可用的 LEMP 栈。注意这里说的不是“能跑起来”而是“能长期维护、能处理真实请求、能排查线上问题”的 LEMP。关键词 Linux、Nginx、MySQL、PHP、LEMP、CentOS 8每一个都不是孤立存在——Linux 是底座Nginx 是流量入口MySQL 是数据心脏PHP 是业务逻辑执行器而 CentOS 8 则是那个已经停止更新、但大量老系统仍在运行的“历史现场”。我干这行十多年亲手部署过上千套 Web 环境从物理机到云主机从 CentOS 6 到 Rocky Linux 9。最常被问的问题不是“怎么装”而是“为什么我照着 A 教程装完不能连数据库照着 B 教程配完 PHP 不解析”。答案往往就藏在版本差异里CentOS 8 默认使用dnf而非yum默认启用firewalld且规则更严格PHP 默认版本是 7.2已 EOLMySQL 官方包需手动添加仓库SELinux 策略比以前更细粒度……这些细节任何一篇泛泛而谈的“一键安装脚本”都不会告诉你。本文不讲虚的就带你从零开始在一台干净的 CentOS 8 Stream或标准版虚拟机上一步步敲出每一行命令解释每一个参数背后的“为什么”并把我在客户现场踩过的坑、调过的配置、验证过的方法原原本本塞进每一个步骤里。适合正在维护旧系统的运维、接手遗留项目的后端开发、或是想真正搞懂 Web 服务底层逻辑的 Linux 新手——只要你需要让一个网站在 CentOS 8 上稳稳当当地跑起来这篇就是为你写的。2. 整体设计与思路拆解为什么必须放弃“一键脚本”拥抱分步可控很多人看到“安装 LEMP”第一反应是找一个 GitHub 上 star 数最高的自动化脚本比如curl -sL https://raw.githubusercontent.com/xxx/lemp.sh | bash。我试过也推荐客户用过结果呢三次中有两次失败一次成功但后续无法升级一次成功却埋下 SELinux 权限隐患半年后某个 PHP 扩展突然报错溯源发现是脚本当初强行setenforce 0关闭了安全策略而没人记得这事。所以本方案的设计哲学只有一个拒绝黑盒全程透明每一步都可审计、可回滚、可解释。2.1 为什么坚持用官方源 手动配置而不是 Docker 或 SnapDocker 确实方便docker run -d -p 80:80 nginx一行就起服务。但问题在于当你需要修改 Nginx 的client_max_body_size以支持大文件上传或者要给 PHP 加载redis.so扩展又或者 MySQL 需要调整innodb_buffer_pool_size适配 32G 内存时你是在改容器内的配置文件还是在改宿主机上的docker-compose.yml一旦容器重建所有自定义配置全丢。而 CentOS 8 原生包管理dnf安装的组件配置文件全在/etc/下服务状态由systemctl统一管理日志统一走journalctl这是企业级运维的黄金标准。Snap 在 CentOS 8 上甚至不被原生支持强行安装会破坏系统包依赖树得不偿失。2.2 为什么 MySQL 不用 MariaDB而要装官方 MySQLCentOS 8 默认仓库里的mariadb-server是个“兼容层”它提供了 MySQL 协议和大部分语法但核心行为有差异。比如MariaDB 的AUTO_INCREMENT行为在高并发插入时与 MySQL 官方版不同它的查询优化器对某些复杂 JOIN 的执行计划选择也略有出入。我曾在一个电商后台项目中遇到过测试环境用 MariaDB 一切正常上线后用 MySQL 官方版同一个报表 SQL 执行时间从 0.8 秒飙升到 12 秒。最后发现是 MariaDB 的optimizer_switch默认值更激进。所以如果你的应用明确要求 MySQL 兼容性比如用了 MySQL 特有的 JSON 函数、全文索引配置或对接了 MySQL 官方认证的 BI 工具就必须装 MySQL 官方二进制包或 RPM。本文选择后者因为它能无缝集成到dnf生态systemctl enable mysqld后开机自启dnf update时还能收到安全补丁推送虽然 CentOS 8 本身已 EOL但 MySQL 官方仍持续更新其 RPM 包。2.3 为什么 PHP 选 7.4 而非 8.x以及 Nginx 必须编译模块吗CentOS 8 默认dnf install php装的是 PHP 7.2这个版本早在 2020 年 11 月就结束了生命周期EOL连基础的安全漏洞都不再修复。而 PHP 8.0 虽新但破坏性变更太多mysql_*函数彻底移除哪怕你只是 legacy 代码里有一行mysql_connect()就直接 fatal error、json_encode()对资源类型返回null而非空字符串、foreach引用赋值行为改变……对于一个正在运行的旧系统升级 PHP 大版本是重构级工作不是安装任务。因此PHP 7.4 是一个完美的“安全过渡带”它仍是活跃维护的2022 年 11 月才 EOL兼容绝大多数 PHP 7.x 代码且性能比 7.2 提升约 15%。我们通过dnf module enable php:7.4这条命令激活 7.4 流这是 CentOS 8 的模块化特性比手动加第三方源更干净。至于 NginxCentOS 8 官方源里的nginx包已经预编译了http_ssl_module、http_v2_module、http_gzip_static_module等常用模块完全够用。只有当你需要nginx-rtmp-module直播或nginx-http-sysguard防刷这类小众功能时才值得自己编译。盲目编译不仅耗时还会导致dnf update nginx失效因为你的二进制文件不在包管理器的控制之下。本文所有组件均严格遵循“官方源优先模块按需启用”的原则。2.4 为什么防火墙和 SELinux 不跳过反而要重点配置很多教程写“先关防火墙systemctl stop firewalld”或者“临时禁用 SELinuxsetenforce 0”。这是最危险的操作。防火墙是服务器的第一道门关了它等于把大门敞开SELinux 是内核级强制访问控制关了它一个被入侵的 Nginx 进程就能读取/etc/shadow。正确的做法是精准放行端口精细授权上下文。比如只开放 80 和 443 端口而不是整个firewalld给 PHP-FPM 的 socket 文件打上httpd_var_run_t类型标签而不是粗暴地给整个/var/www设chmod 777。这些操作看似多敲几行命令但换来的是系统长期运行的健壮性。我在某金融客户那里见过他们就是因为跳过了 SELinux 配置导致 PHP 脚本无法写入 session 目录错误日志里只有一句 “Permission denied”排查了三天才发现是上下文类型不对。3. 核心细节解析与实操要点每个命令背后的“为什么”和“怎么验”LEMP 的四个字母代表四组独立的服务它们之间靠约定俗成的协议和路径协同工作。理解这些约定是排错的关键。下面我将逐个拆解不只告诉你“敲什么”更告诉你“为什么敲这个”、“不敲会怎样”、“敲完怎么验证”。3.1 Linux 层CentOS 8 的“底座”特性与初始化准备CentOS 8 的核心变化在于包管理器从yum升级为dnf它基于libsolv库依赖解析更智能但命令语法有细微差别。比如yum list installed在 dnf 里是dnf list installedyum clean all是dnf clean all。更重要的是dnf支持模块Module概念PHP 就是一个典型模块。这意味着dnf install php不再是装一个固定版本而是装一个“流Stream”你可以选择php:7.2、php:7.4或php:8.0就像切换频道一样。第一步系统更新与基础工具安装# 更新系统到最新快照CentOS 8 Stream 用户尤其重要 sudo dnf update -y # 安装基础编译和调试工具很多教程漏掉这步导致后续编译失败 sudo dnf groupinstall Development Tools -y # 安装常用网络诊断工具curl、wget、netstat、lsof 等排错必备 sudo dnf install curl wget net-tools lsof psmisc vim-enhanced -y提示dnf update -y在 CentOS 8 Stream 上会拉取最新的软件包快照这比dnf upgrade更彻底。别跳过这步否则可能遇到glibc版本冲突导致mysql服务启动失败。第二步确认并启用正确的 PHP 模块流# 查看所有可用的 PHP 模块流 dnf module list php # 输出会类似 # php 7.2 [d] common, devel, minimal # php 7.4 [e] common, devel, minimal # php 8.0 common, devel, minimal # 其中 [d] 表示 default, [e] 表示 enabled。我们需要的是 7.4。 sudo dnf module reset php sudo dnf module enable php:7.4注意dnf module reset php是关键它会清除之前所有关于 PHP 的模块设置避免enable命令失效。如果你之前装过 PHP 7.2这步不执行enable php:7.4可能静默失败php -v依然显示 7.2。第三步时间同步与主机名规范常被忽略的稳定性基石# 启用并启动 chronydCentOS 8 默认时间服务 sudo systemctl enable --now chronyd # 验证时间同步状态 sudo chronyc tracking # 设置一个规范的主机名避免 localhost.localdomain 这种默认名 sudo hostnamectl set-hostname webserver.example.com # 编辑 /etc/hosts添加一行替换为你自己的 IP 和主机名 echo 192.168.1.100 webserver.example.com webserver | sudo tee -a /etc/hosts实操心得时间不同步会导致 SSL 证书校验失败curl: (60) SSL certificate problem: clock skew detected也会让 MySQL 主从复制的 GTID 产生混乱。主机名不规范则可能让某些 PHP 框架如 Laravel的缓存机制失效因为它们会用主机名作为缓存键的一部分。3.2 Nginx 层不只是“反向代理”更是静态资源的终极管家Nginx 在 LEMP 中的角色远不止是 PHP 的网关。它是静态文件HTML/CSS/JS/图片的直接提供者是 HTTPS 的 TLS 终结点是连接数的守门员。CentOS 8 官方源里的nginx包已经足够强大我们只需正确配置。第一步安装与基础验证# 安装 Nginx sudo dnf install nginx -y # 启动并设为开机自启 sudo systemctl enable --now nginx # 验证服务状态 sudo systemctl status nginx # 应看到 active (running) # 验证监听端口 sudo ss -tlnp | grep :80 # 应输出类似LISTEN 0 128 *:80 *:* users:((nginx,pid1234,fd6),(nginx,pid1235,fd6))注意ss -tlnp比netstat -tlnp更快、更准确是现代 Linux 排错首选。-tTCP,-llistening,-nnumeric port,-pshow process。如果这里看不到nginx说明服务根本没起来别急着配 PHP先看journalctl -u nginx。第二步核心配置文件结构与安全加固Nginx 的主配置文件是/etc/nginx/nginx.conf但实际站点配置应放在/etc/nginx/conf.d/下以.conf结尾的文件会被自动包含。这是最佳实践避免直接修改主配置。创建一个基础站点配置/etc/nginx/conf.d/default.conf# /etc/nginx/conf.d/default.conf server { listen 80; server_name localhost; # 安全加固隐藏 Nginx 版本号防止攻击者利用已知漏洞 server_tokens off; # 根目录指向标准 Web 根 root /usr/share/nginx/html; index index.html index.htm index.php; # 处理 PHP 请求的核心 location 块 location ~ \.php$ { # 关键必须指定 fastcgi_pass指向 PHP-FPM 的 socket fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; # 关键必须包含 fastcgi_params它定义了传递给 PHP 的环境变量 include fastcgi_params; # 关键必须重写 SCRIPT_FILENAME否则 PHP 不知道当前脚本路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # 防止 .htaccess、.env 等敏感文件被直接下载 location ~ /\. { deny all; } }提示fastcgi_param SCRIPT_FILENAME这一行是 PHP 解析失败的头号元凶。很多教程漏掉它或者写成$request_filename导致 PHP 报错 “No input file specified.”。$document_root$fastcgi_script_name是唯一正确的写法它把 Nginx 的根目录和请求的 PHP 文件名拼在一起形成绝对路径。第三步防火墙放行与 SELinux 上下文设置# 放行 HTTP (80) 和 HTTPS (443) 端口 sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --permanent --add-servicehttps sudo firewall-cmd --reload # 验证放行是否生效 sudo firewall-cmd --list-all | grep services # 应看到 http https # SELinux确保 Nginx 可以绑定网络端口默认已允许但确认一下 sudo setsebool -P httpd_can_network_bind 1 # SELinux确保 Nginx 可以读取 Web 根目录默认已允许 sudo setsebool -P httpd_read_content 1实操心得firewall-cmd --reload后一定要用curl -I http://localhost测试。如果返回HTTP/1.1 200 OK说明 Nginx 已对外服务如果返回curl: (7) Failed to connect to localhost port 80: Connection refused说明firewalld规则没生效或者nginx服务没起来。别猜直接journalctl -u nginx -n 50 --no-pager看最后 50 行日志。3.3 MySQL 层官方 RPM 的安装、安全初始化与权限模型CentOS 8 默认没有 MySQL只有 MariaDB。我们必须手动添加 MySQL 官方仓库。这一步必须谨慎因为仓库地址错了就会装上不兼容的包。第一步添加 MySQL 官方 YUM 仓库# 下载并安装 MySQL 官方仓库配置包截至 2023 年最新版是 8.0 sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm -y # 验证仓库是否添加成功 dnf repolist enabled | grep mysql.*-community.* # 应看到类似mysql80-community MySQL 8.0 Community Server # 可选禁用 MySQL 8.0启用 5.7如果应用有强兼容性要求 # sudo dnf-config-manager --disable mysql80-community # sudo dnf-config-manager --enable mysql57-community注意https://dev.mysql.com/get/...这个 URL 是官方提供的“一键安装仓库”方式比手动编辑/etc/yum.repos.d/更可靠。mysql80-community-release-el8-1.noarch.rpm中的el8表示 Enterprise Linux 8即 CentOS 8/RHEL 8务必匹配。第二步安装 MySQL 服务并启动# 安装 MySQL 服务器会自动拉取依赖包括 mysql-common, mysql-client sudo dnf install mysql-community-server -y # 启动并设为开机自启 sudo systemctl enable --now mysqld # 查看初始 root 密码MySQL 5.7 安装后会生成一个临时密码 sudo grep temporary password /var/log/mysqld.log # 输出类似A temporary password is generated for rootlocalhost: aB3#xY9!zQ2提示这个临时密码只在首次启动时生成一次记录下来马上要用。如果忘了只能删掉/var/lib/mysql重装代价很大。第三步运行安全初始化脚本# 运行 MySQL 自带的安全脚本 sudo mysql_secure_installation # 脚本会交互式提问我的建议回答如下 # Securing the MySQL server deployment. # Enter password for user root: [输入上面记下的临时密码] # The existing password for the user account root has expired. Please set a new password. # New password: [输入你想要的新 root 密码至少 8 位含大小写字母数字符号] # Re-enter new password: [再次输入] # Remove anonymous users? [Y] (强烈建议 Y) # Disallow root login remotely? [Y] (生产环境必须 Y只允许本地登录) # Remove test database and access to it? [Y] (删除测试库) # Reload privilege tables now? [Y] (必须 Y使更改生效)实操心得mysql_secure_installation不是可有可无的“锦上添花”它是 MySQL 生产环境的“准入门槛”。它做的四件事——删匿名用户、禁远程 root、删 test 库、重载权限——每一件都直指安全要害。我见过太多客户因为跳过这步被扫描器扫到root%账户几分钟内数据库就被清空勒索。第四步创建应用专用数据库与用户最小权限原则# 用新密码登录 MySQL mysql -u root -p # 在 MySQL 命令行中执行 CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER myapp_userlocalhost IDENTIFIED BY StrongPass123!; GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO myapp_userlocalhost; FLUSH PRIVILEGES; EXIT;注意utf8mb4是 MySQL 5.5.3 推荐的字符集它能完整支持 Emoji 和所有 Unicode 字符而旧的utf8实际上是utf8mb3最多只支持 3 字节字符。GRANT ... ON myapp.*明确限定了该用户只能操作myapp数据库这是最小权限原则的体现。永远不要用GRANT ALL ON *.*。3.4 PHP 层模块化安装、FPM 配置与与 Nginx 的深度耦合PHP 在 LEMP 中是“执行引擎”它不直接面对用户而是通过 FastCGI 协议与 Nginx 通信。因此php-fpmPHP FastCGI Process Manager的配置比php-cli更关键。第一步安装 PHP 及常用扩展# 安装 PHP 核心及 FPM必须Nginx 需要它 sudo dnf install php-fpm -y # 安装常用扩展根据你的应用需求增减 sudo dnf install php-mysqlnd php-gd php-xml php-mbstring php-json php-opcache -y # 启动并设为开机自启 sudo systemctl enable --now php-fpm # 验证 PHP-FPM 状态 sudo systemctl status php-fpm # 应看到 active (running)提示php-mysqlnd是 MySQL Native Driver比旧的php-mysql性能更好支持更多 MySQL 5.6 特性。php-opcache是字节码缓存能提升 PHP 执行速度 30%-50%生产环境必开。第二步配置 PHP-FPM 池PoolPHP-FPM 的主配置是/etc/php-fpm.conf但具体的工作池配置在/etc/php-fpm.d/www.conf。我们需要修改它让它与 Nginx 的fastcgi_pass匹配。编辑/etc/php-fpm.d/www.conf; 修改监听方式为 Unix Socket比 TCP 更快更安全 listen /run/php-fpm/www.sock ; 设置 socket 文件的权限关键Nginx 必须能读写这个 socket listen.owner nginx listen.group nginx listen.mode 0660 ; 设置 PHP 进程用户安全起见不要用 root user nginx group nginx ; 设置 PHP 错误报告级别开发环境可开生产环境建议关 php_flag[display_errors] off php_admin_value[error_log] /var/log/php-fpm/www-error.log php_admin_flag[log_errors] on注意listen.owner和listen.group必须设为nginx因为 Nginx 的 worker 进程是以nginx用户身份运行的。如果这里设成apache或www-dataNginx 就无法连接到 PHP-FPM 的 socket报错 “connect() to unix:/run/php-fpm/www.sock failed”。第三步重启服务并验证 PHP 解析# 重启 PHP-FPM 以加载新配置 sudo systemctl restart php-fpm # 创建一个测试 PHP 文件 echo ?php phpinfo(); ? | sudo tee /usr/share/nginx/html/info.php # 重启 Nginx sudo systemctl restart nginx # 用 curl 测试在服务器本机执行 curl http://localhost/info.php | grep PHP Version # 应该输出类似h1 classpPHP Version 7.4.33/h1实操心得curl http://localhost/info.php是最直接的验证。如果返回的是 PHP 源码即?php phpinfo(); ?这串文字说明 Nginx 没有把.php文件交给 PHP-FPM 处理检查location ~ \.php$块和fastcgi_pass路径。如果返回 502 Bad Gateway说明 PHP-FPM 没起来或者 socket 路径/权限不对用ls -l /run/php-fpm/看 socket 文件是否存在且权限是srw-rw----.属主属组是nginx。4. 实操过程与核心环节实现从零开始的完整部署流水线现在我们把前面所有分散的知识点串联成一条清晰、可重复、可验证的完整部署流水线。我会模拟一个真实的、从拿到一台全新 CentOS 8 虚拟机开始的全过程并标注每一个关键节点的验证方法和预期结果。这不是理论而是我每天都在做的工作。4.1 环境准备与系统初始化5 分钟假设你已经通过 VirtualBox 或 VMware 创建了一台 CentOS 8 Stream 虚拟机分配了 2 核 CPU、2G 内存、20G 硬盘网络模式为桥接或 NAT确保能上网。首次启动后用 root 用户登录。执行命令序列# 1. 更新系统耗时约 3-5 分钟取决于网络 sudo dnf update -y # 2. 安装基础工具 sudo dnf groupinstall Development Tools -y sudo dnf install curl wget net-tools lsof vim-enhanced -y # 3. 启用时间同步 sudo systemctl enable --now chronyd sudo chronyc tracking | grep System clock # 4. 设置主机名替换为你自己的 sudo hostnamectl set-hostname lemp-server.local echo 127.0.0.1 lemp-server.local lemp-server | sudo tee -a /etc/hosts验证点dnf update后rpm -q centos-release应显示centos-stream-release-8.6-1.el8或更高。chronyc tracking输出中System clock行应为OK。hostname命令应输出lemp-server.local。4.2 Nginx 部署与 Web 服务验证3 分钟执行命令序列# 1. 安装 Nginx sudo dnf install nginx -y # 2. 启动服务 sudo systemctl enable --now nginx # 3. 配置防火墙 sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --reload # 4. 创建一个简单的 HTML 测试页 echo h1LEMP Stack: Nginx is Running!/h1 | sudo tee /usr/share/nginx/html/index.html验证点systemctl status nginx应为active (running)。ss -tlnp | grep :80应看到nginx进程监听*:80。在宿主机浏览器访问http://虚拟机IP应看到那行大字。如果看不到检查虚拟机网络设置是否获取到 IPip a查看和防火墙firewall-cmd --list-all。4.3 MySQL 官方版安装与数据库初始化7 分钟执行命令序列# 1. 添加 MySQL 官方仓库 sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm -y # 2. 安装 MySQL 服务器 sudo dnf install mysql-community-server -y # 3. 启动服务并获取临时密码 sudo systemctl enable --now mysqld sudo grep temporary password /var/log/mysqld.log # 4. 运行安全初始化按前面建议回答 sudo mysql_secure_installation # 记下你设置的新 root 密码 # 5. 创建应用数据库和用户替换密码 mysql -u root -p -e CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER wp_userlocalhost IDENTIFIED BY YourStrongPass123!; GRANT ALL PRIVILEGES ON wordpress.* TO wp_userlocalhost; FLUSH PRIVILEGES;验证点systemctl status mysqld应为active (running)。mysql -u root -p -e SHOW DATABASES;应列出wordpress数据库。mysql -u wp_user -p -e SELECT USER();应返回wp_userlocalhost证明用户创建成功。4.4 PHP-FPM 配置与 Nginx-PHP 耦合5 分钟执行命令序列# 1. 安装 PHP-FPM 及扩展 sudo dnf install php-fpm php-mysqlnd php-gd php-xml php-mbstring php-json php-opcache -y # 2. 编辑 PHP-FPM 配置 sudo sed -i s/^listen .*/listen \/run\/php-fpm\/www.sock/ /etc/php-fpm.d/www.conf sudo sed -i s/^;listen.owner.*/listen.owner nginx/ /etc/php-fpm.d/www.conf sudo sed -i s/^;listen.group.*/listen.group nginx/ /etc/php-fpm.d/www.conf sudo sed -i s/^;listen.mode.*/listen.mode 0660/ /etc/php-fpm.d/www.conf sudo sed -i s/^user .*/user nginx/ /etc/php-fpm.d/www.conf sudo sed -i s/^group .*/group nginx/ /etc/php-fpm.d/www.conf sudo sed -i s/^;php_flag\[display_errors\].*/php_flag\[display_errors\] off/ /etc/php-fpm.d/www.conf # 3. 启动 PHP-FPM sudo systemctl enable --now php-fpm # 4. 配置 Nginx 的 PHP 处理覆盖默认配置 cat /etc/nginx/conf.d/default.conf EOF server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html index.htm index.php; server_tokens off; location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\. { deny all; } } EOF # 5. 重启服务 sudo systemctl restart php-fpm nginx验证点ls -l /run/php-fpm/www.sock应输出srw-rw----. 1 nginx nginx ... /run/php-fpm/www.sock。curl http://localhost/index.php应返回 PHP 信息页如果index.php不存在会 404我们还没创建它所以下一步。创建index.php:echo ?php echo PHP is working!; ? | sudo tee /usr/share/nginx/html/index.php然后curl http://localhost/index.php应输出PHP is working!。4.5 最终整合测试部署一个 WordPress 示例10 分钟现在我们用一个真实的应用来验证整个栈是否真正可用。WordPress 是最经典的 PHPMySQL 应用。执行命令序列# 1. 下载并解压 WordPress到 Web 根目录 cd /tmp curl -O https://wordpress.org/latest.tar.gz tar -xzf latest.tar.gz sudo rsync -avP /tmp/wordpress/ /usr/share/nginx/html/ # 2. 设置正确的文件所有权Nginx 用户必须能读写 sudo chown -R nginx:nginx /usr/share/nginx/html/ sudo find /usr/share/nginx/html/ -type d -exec chmod 755 {} \; sudo find /usr/share/nginx/html/ -type f -exec chmod 644 {} \; # 3. 复制配置模板并编辑 sudo cp /usr/share/nginx/html/wp-config-sample.php /usr/share/nginx/html/wp-config.php sudo sed -i s/database_name_here/wordpress/ /usr/share/nginx/html/wp-config.php sudo sed -i s/username_here/wp_user/ /usr/share/nginx/html/wp-config.php sudo sed -i s/password_here/YourStrongPass123!/ /usr/share/nginx/html/wp-config.php sudo sed -i s/localhost/localhost/ /usr/share/nginx/html/wp-config.php # 4. 重启服务确保所有配置生效 sudo systemctl restart nginx php-fpm mysqld验证点在浏览器访问http://虚拟机IP应进入 WordPress 安装向导页面。填写站点信息点击“安装 WordPress”应成功完成进入登录页。登录后台发布一篇测试文章访问前台应正常显示。实操心得这个 WordPress 测试是“黄金验证”。它同时检验了Nginx 的静态文件服务、PHP 的动态脚本执行、MySQL 的数据库连接与查询、Nginx 与 PHP-FPM 的 FastCGI 通信、文件系统权限chown nginx:nginx、以及 SELinux如果前面没配好这里会卡在“无法创建 wp-content 目录”。只要这一步通了你的 LEMP 栈就是真正可用的。5. 常见问题与排查技巧实录那些让你抓狂的“玄学”错误在上千次部署中有 5 个问题出现频率最高它们往往没有明确的错误提示或者错误提示极具误导性。我把它们整理成一张速查表并附上我亲测有效的排查路径