本地要跑一个老项目,装了 nginx 和 php,浏览器打开不是显示一段源码,就是直接 502。配置文件改了好几遍,还是不通。

这套组合在 Windows 上能跑,只是几个环节容易漏,顺序也不能乱。

第一步:php 的包和路径要选对

下载的是压缩包,要选对线程模式。以独立进程方式配合 nginx 时,一般用非线程安全的包更稳。选错了不一定立刻报错,跑起来偶尔崩一下,很难查。

解压到没有中文、没有空格的短路径,比如盘符下面一个两三个字母的目录。路径里有空格时,启动参数容易被截断,报错看着莫名其妙。

目录里找到配置模板,复制一份改成正式配置,再改扩展目录的路径,把需要的扩展前面注释去掉。

第二步:让 php 先跑起来

用命令行方式启动,绑定本机地址加一个端口,常见是九千。启动后窗口里会显示监听中,这个窗口别关,关了服务就停。

想后台常驻,可以注册成系统服务,或者用第三方小工具托管。省事,但出问题时看不到实时日志,调试阶段不推荐。

第三步:nginx 把请求转过去

在站点配置里加一段规则:匹配以 php 结尾的请求,转给上面那个本机端口,同时把脚本路径和查询参数传过去。这两项不传,php 拿不到文件路径,返回的是一句没有指定输入文件。

Windows 下路径分隔符要写正斜杠。写反斜杠会被当成转义字符,配置检查能过,请求一到就 404,这是最常见的一个坑。

报错对照

  • 直接显示源码:nginx 没把请求交给 php,检查匹配规则有没有生效;
  • 502:php 没启动,或者端口对不上;
  • 404:脚本路径映射错,看根目录和路径参数;
  • 白屏无提示:错误显示被关了,先打开再看。

两个提醒

改完配置是重载,不是重启进程,两条命令别混用。重载不生效时再考虑重启。

还有一个细节:请求转发出去后,如果脚本跑得久,可能等不到结果就断开,页面显示的是网关超时而不是 502。把超时时间调大一点,再配合 php 那边的执行时间上限一起改,两边不一致照样白改。

另外八十端口常被系统服务占着,本地开发换个高位端口,能省掉半天排查。改配置之前先复制一份原文件,文件名带上日期,改坏了直接覆盖回去,比回忆改过哪几行快得多。这套环境只适合本地调试,真要对外提供服务,还是用 Linux 更省心。