Windows下搭建PHP与Nginx环境四步详细教程
时间:2026-08-16 | 作者:怪兽小助手 | 阅读:0php-cgi.exe 需要手动启动,而且监听地址必须与 nginx.conf 里的 fastcgi_pass 严格保持一致;只要两边对不上,Nginx 就连不上,502 错误也就随之出现。
运行时要通过 RunHiddenConsole 放到后台。同时,php.ini 里的几个关键配置也不能出错,比如 cgi.force_redirect=0、cgi.fix_pathinfo=1,以及 extension_dir、date.timezone 等项目,都必须设置正确。
php-cgi.exe 必须手动启动,且监听地址必须和 nginx.conf 里 fastcgi_pass 的值严格一致。这是 Windows 下 502 Bad Gateway 最常见的根源。
怎么让 nginx 找到 php-cgi 并不报 502
Windows 不像 Linux 那样能用 systemd 或 init 管理进程。php-cgi.exe 是个命令行程序,不加参数直接双击会闪退。
因此,必须用批处理或工具包裹后持续运行。
常见错误现象
- 浏览器访问
.php文件返回502 Bad Gateway nginx -t检查配置通过,但日志里反复出现connect() failed (10061: No connection could be made)
实操建议
- 不要用
php.exe,必须用php-cgi.exe(NTS 版本才带这个可执行文件) - 启动命令形如:
php-cgi.exe -b 127.0.0.1:9000,端口必须和nginx.conf中fastcgi_pass 127.0.0.1:9000完全一致 - 推荐用
RunHiddenConsole.exe包裹,避免窗口弹出又关闭:RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9000 - 若端口被占用(比如另一个 php-cgi 正在跑),改端口的同时务必同步改
nginx.conf
php.ini 里哪些配置项不设就肯定挂
Windows 下 PHP 要跑通,不是“开了扩展就行”。几个关键开关必须显式设置,否则 Nginx 请求进来后 PHP 会直接拒绝处理。
最容易漏掉的三项
cgi.fix_pathinfo=1—— 不设会导致SCRIPT_FILENAME解析错乱,Nginx 传过来的路径变成空或错误路径extension_dir="C:/php/ext"—— 必须是绝对路径,且指向真实存在的ext目录;路径中斜杠用/或,别混用date.timezone="Asia/Shanghai"—— 不设会在错误日志里刷满警告,虽不影响运行,但干扰排查
注意:cgi.force_redirect 在 Windows + Nginx 场景下应设为 0,设成 1 会导致所有请求被拦截并返回 404。
nginx.conf 里 location ~ .php$ 的坑在哪
这段配置看着简单,但 Windows 下最常出问题的是 SCRIPT_FILENAME 的拼接逻辑。
Nginx 默认不自动补全根路径,必须手工写对。
正确写法
location ~ .php$ {
root C:/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
错误高发点
- 把
$document_root$fastcgi_script_name写成$script_filename(这个变量 Nginx 不提供,PHP 也收不到) - 在
location块里漏写root,导致$document_root为空,最终SCRIPT_FILENAME变成C:/www/后面没东西 - 多个
server块共用一套fastcgi_params,但其中某条fastcgi_param被覆盖或遗漏
为什么测试 phpinfo() 成功了,mysqli 却连不上 MySQL
这和 Nginx、PHP 配置无关,纯属 MySQL 认证插件不兼容。
PHP 8.0+ 默认用 mysql_native_password,而 MySQL 8.0+ 新建用户默认用 caching_sha2_password。
现象
phpinfo()页面正常显示- 代码里
new mysqli(...)报错:mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
解决方法
- 重置 MySQL 用户认证方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 或在 PHP 连接时显式指定驱动:
mysqli_real_connect($link, $host, $user, $pass, $db, $port, null, MYSQLI_CLIENT_SSL);(不治本) - 更稳妥的做法:安装 MySQL 5.7 或启用兼容模式,避免版本错配
问题根源总结
真正麻烦的从来不是装上,而是各组件默认行为之间的隐性冲突。
php-cgi.exe不后台驻留cgi.fix_pathinfo默认关着- MySQL 认证方式悄悄升级
这些点不手动掰正,环境永远差一口气。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 基于Flutter重构的轻量级Windows桌面壁纸软件:从Electron到Dart的体积优化实践
- 时间:2026-08-27
-
- AMD锐龙真实加速频率实测 Windows系统游戏性能更强
- 时间:2026-08-24
-
- Windows Hello红外摄像头开启与设置全步骤指南
- 时间:2026-08-24
-
- 微软Windows系统性能与界面优化后下一步将更新音效设计
- 时间:2026-08-24
-
- 微软修复Windows内存显示问题告别1048576KB困扰
- 时间:2026-08-24
-
- Windows 11右键菜单重新加入刷新功能用户等待终获解决
- 时间:2026-08-23
-
- Edge浏览器关闭下载完成通知的详细设置教程
- 时间:2026-08-23
-
- Windows系统type命令详解:功能、语法与使用实例
- 时间:2026-08-23
精选合集
更多大家都在玩
大家都在看
更多-
- 蚂蚁新村小课堂今日答案10月23日 江苏溧阳的跳幡神是一种
- 时间:2026-10-23
-
- 蚂蚁新村2026年10月23日答案最新
- 时间:2026-10-23
-
- 蚂蚁庄园答案2026年10月24日
- 时间:2026-10-23
-
- 蚂蚁庄园今天答题答案2026年10月24日
- 时间:2026-10-23
-
- 蚂蚁庄园今日答案2026年10月24日
- 时间:2026-10-23
-
- 秦始皇陵地宫至今未发掘,主要原因是 蚂蚁庄园今日答案10.24
- 时间:2026-10-23
-
- 小鸡答题今天的答案是什么2026年10月24日
- 时间:2026-10-23
-
- 蚂蚁庄园每日答题答案2026年10月24日
- 时间:2026-10-23
