本地要跑一个老项目,装了 nginx 和 php,浏览器打开不是显示一段源码,就是直接 502。配置文件改了好几遍,还是不通。
这套组合在 Windows 上能跑,只是几个环节容易漏,顺序也不能乱。
第一步:php 的包和路径要选对
下载的是压缩包,要选对线程模式。以独立进程方式配合 nginx 时,一般用非线程安全的包更稳。选错了不一定立刻报错,跑起来偶尔崩一下,很难查。
解压到没有中文、没有空格的短路径,比如盘符下面一个两三个字母的目录。路径里有空格时,启动参数容易被截断,报错看着莫名其妙。
目录里找到配置模板,复制一份改成正式配置,再改扩展目录的路径,把需要的扩展前面注释去掉。
第二步:让 php 先跑起来
用命令行方式启动,绑定本机地址加一个端口,常见是九千。启动后窗口里会显示监听中,这个窗口别关,关了服务就停。
想后台常驻,可以注册成系统服务,或者用第三方小工具托管。省事,但出问题时看不到实时日志,调试阶段不推荐。
第三步:nginx 把请求转过去
在站点配置里加一段规则:匹配以 php 结尾的请求,转给上面那个本机端口,同时把脚本路径和查询参数传过去。这两项不传,php 拿不到文件路径,返回的是一句没有指定输入文件。
Windows 下路径分隔符要写正斜杠。写反斜杠会被当成转义字符,配置检查能过,请求一到就 404,这是最常见的一个坑。
报错对照
- 直接显示源码:nginx 没把请求交给 php,检查匹配规则有没有生效;
- 502:php 没启动,或者端口对不上;
- 404:脚本路径映射错,看根目录和路径参数;
- 白屏无提示:错误显示被关了,先打开再看。
两个提醒
改完配置是重载,不是重启进程,两条命令别混用。重载不生效时再考虑重启。
还有一个细节:请求转发出去后,如果脚本跑得久,可能等不到结果就断开,页面显示的是网关超时而不是 502。把超时时间调大一点,再配合 php 那边的执行时间上限一起改,两边不一致照样白改。
另外八十端口常被系统服务占着,本地开发换个高位端口,能省掉半天排查。改配置之前先复制一份原文件,文件名带上日期,改坏了直接覆盖回去,比回忆改过哪几行快得多。这套环境只适合本地调试,真要对外提供服务,还是用 Linux 更省心。