本文约 2,815 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:一键包省了事,也埋了坑
LNMP 一键安装包(lnmp.org)是国内站长最常用的环境之一,几条命令就能有 Nginx + MySQL + PHP。但”能跑起来”和”能稳定跑 WordPress”是两回事。
最常见的三类问题:内页全是 404(伪静态没 include)、后台装插件要 FTP 凭据(属主不对)、上传主题提示”无法创建目录”(open_basedir 或权限)。这三个问题无一例外都出在 Nginx / PHP-FPM 配置层,而不是 WordPress 本身。
原理分析:Nginx 和 PHP-FPM 是怎么协作的
Nginx 本身不执行 PHP。请求进来后:
- Nginx 根据
server_name匹配到对应的 server 块; - 命中
location ~ \.php$,通过 FastCGI 协议把请求转给 PHP-FPM; - PHP-FPM 执行
index.php,WordPress 启动,查数据库,返回 HTML; - Nginx 把结果回给浏览器。
WordPress 的固定链接(比如 /2026/10/10/hello)在磁盘上并不存在文件,要靠 try_files 把所有找不到的路径都交给 index.php 处理。这一步就是”伪静态”,也是 LNMP 部署最容易漏掉的地方。
保姆级实操
第一步:添加虚拟主机
lnmp vhost add
按提示填域名、站点目录、是否开启伪静态。伪静态那一步选择 wordpress(lnmp 内置规则),或者选 other 后手动配置。
第二步:确认伪静态生效
查看生成的配置:
cat /usr/local/nginx/conf/vhost/mimangfei.com.conf
核心部分应包含:
server {
listen 80;
server_name mimangfei.com www.mimangfei.com;
index index.html index.php;
root /home/wwwroot/mimangfei.com;
include rewrite/wordpress.conf;
location ~ [^/]\.php(/|$) {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|webp)$ {
expires 30d;
}
}
rewrite/wordpress.conf 的内容本质是:
location / {
try_files $uri $uri/ /index.php?$args;
}
第三步:上传大小限制
LNMP 默认限制偏小,编辑 /usr/local/php/etc/php.ini:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
改完重启:
lnmp php-fpm restart
同时 Nginx 也要放行:
client_max_body_size 64m;
第四步:解决”需要 FTP 凭据”
原因是 PHP-FPM 运行用户(一般是 www)对站点目录没有写权限:
chown -R www:www /home/wwwroot/mimangfei.com
find /home/wwwroot/mimangfei.com -type d -exec chmod 755 {} \;
find /home/wwwroot/mimangfei.com -type f -exec chmod 644 {} \;
第五步:防跨目录(open_basedir)
LNMP 默认会加 open_basedir 限制,这是好事,但如果你把 wp-content 移到别处、或者用了某些缓存插件写临时文件,会被拦住。临时放开:
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/:/home/wwwroot/";
更彻底的做法是在 php.ini 里注释掉,但会牺牲安全性,不建议长期关闭。
第六步:强制 HTTPS
server {
listen 80;
server_name mimangfei.com www.mimangfei.com;
return 301 https://mimangfei.com$request_uri;
}
常见踩坑与失败案例
- 内页 404,首页正常 —— 90% 是没 include 伪静态规则。用
nginx -t检查语法,lnmp nginx reload生效。 - 502 Bad Gateway —— PHP-FPM 没起来或 sock 路径不对。看
/usr/local/php/var/log/php-fpm.log,常见问题有pm.max_children太小导致进程耗尽、sock 文件权限不对。 - 案例:某站启用插件后前台 500,查日志是
open_basedir restriction in effect,因为插件要往/tmp之外写缓存。把缓存目录改到/tmp下解决。 - SSL 配好后样式全丢(混合内容) —— 后台”站点地址”还写着 http,需要在数据库里批量替换,或临时用
WP_HOME/WP_SITEURL常量救场。 - 改了配置不生效 —— LNMP 修改了配置必须
lnmp nginx reload,仅重启服务有时读的还是旧配置缓存。
总结
LNMP 部署 WordPress 的关键配置就四处:伪静态 try_files、PHP-FPM 监听与权限、上传限制(php.ini + client_max_body_size 双管齐下)、open_basedir。把这四处配明白,剩下的都是 WordPress 层面的事。建议每次改配置都做一次 nginx -t,并保留一份配置文件的 Git 快照,出问题时 diff 一下就能定位。
