关键在于路径、权限、FastCGI与跨域细节对齐:需用VC15版PHP 7.4.33配Nginx 1.31.6,php-cgi.exe带-c参数启动并监听9000端口,nginx.conf中fastcgi_pass地址、SCRIPT_FILENAME路径、root目录三者必须严格一致,且WordPress需部署在root指定的物理路径下,固定链接依赖try_files规则生效。

在 Windows 上用 Nginx 1.31.6 搭配 PHP 7.4.33 部署 WordPress,关键不在“能不能装”,而在于路径、权限、FastCGI 和跨域/安全细节是否对齐。下面直接说可落地的步骤和易错点。
一、基础环境准备与验证
确保三件套版本明确且兼容:
- Nginx:从 nginx.org/download 下载 nginx-1.31.6.zip(非官网镜像或第三方编译版),解压后路径避免中文和空格,例如
D:\nginx - PHP:使用 php-7.4.33-Win32-vc15-x64.zip(VC15 对应 Nginx 官方 Windows 编译环境),解压到
D:\php,复制php.ini-development为php.ini,启用extension_dir = "ext"并取消注释:extension=php_mysqli.dll、extension=php_gd2.dll、extension=php_opcache.dll - 启动 PHP-CGI:命令行执行
D:\php\php-cgi.exe -b 127.0.0.1:9000 -c D:\php\php.ini(保持窗口常开,或转为 Windows 服务)
二、Nginx 配置 WordPress 站点
编辑 D:\nginx\conf\nginx.conf 或新建虚拟主机配置(推荐放 conf.d\wordpress.conf):
server {
listen 80;
server_name localhost;
root D:/www/wordpress;
index index.php;
<pre class="brush:php;toolbar:false;">location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 防止敏感文件被直接访问
location ~ \.(htaccess|htpasswd|ini|log|sh|sql|bak|swp)$ {
deny all;
}}
立即学习“PHP免费学习笔记(深入)”;
注意:$document_root 必须用正斜杠,Windows 路径中的反斜杠会导致 404;root 值末尾不加斜杠;修改后运行 nginx -t 测试语法,再 nginx -s reload 生效。
三、部署 WordPress 并初始化
下载最新 WordPress(如 wordpress-6.7-zh_CN.zip),解压到 D:\www\wordpress,然后:
- 新建 MySQL 数据库(推荐 utf8mb4 字符集 + utf8mb4_unicode_ci 排序规则)
- 复制
wp-config-sample.php为wp-config.php,填入数据库名、用户、密码、主机(localhost或127.0.0.1) - 若提示“另一站点正在安装”,删掉数据库里残留的
wp_options表中core_updater.lock记录 - 浏览器访问
http://localhost,按向导完成安装
四、常见问题快速修复
部署后若打不开、白屏、无法上传图片、后台跳转错误,优先检查这几项:
-
PHP-CGI 是否仍在运行?任务管理器看是否有
php-cgi.exe进程;中断后重开,别只改配置不重启 CGI -
WordPress 固定链接:设置 → 固定链接 → 选“朴素”测试是否生效;再切回“文章名”需确认 Nginx 的
try_files规则已生效 -
文件权限:Windows 下无需 chmod,但确保
D:\www\wordpress目录对当前运行 Nginx 的用户(默认是当前登录用户)有读写权限,特别是wp-content子目录 -
跨域或 API 报错:如使用 REST API 或前端分离开发,在 server 块内加入以下跨域头(带
always参数):add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' always; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=UTF-8'; add_header 'Content-Length' 0; return 204; }



















