Guzzle发送POST请求本地正常 生产环境请求Nginx接口超时无响应
问题原因
- 报错信息显示实际请求目标为
192.140.88.50:80,和代码中配置的127.0.0.1:8000完全不符,优先判定生产环境运行的代码配置未生效,$base_url或路由拼接逻辑在生产环境被修改,导致请求地址和预期不一致。 - 若Apache和Nginx部署在不同服务器,代码中写死的
127.0.0.1是本地回环地址,只能访问当前Apache所在服务器的服务,无法指向其他机器上的Nginx服务。 - 代码中URL未携带HTTP/HTTPS协议头,Guzzle解析地址时可能出现异常,默认请求80端口,忽略配置的8000端口。
- 服务器开启了SELinux规则,默认禁止Apache服务发起对外网络请求,即使网络连通、防火墙关闭也会被拦截。
- Nginx的8000端口监听配置仅绑定了公网IP,未允许本地回环地址访问,导致同一服务器上用
127.0.0.1:8000请求失败。
解决方法
- 首先在生产环境代码中打印输出最终拼接的
$url值,确认实际请求地址是否符合预期,排查部署时是否错误替换了配置文件,修正错误的$base_url配置。 - 补全URL的协议头,修改base_url配置为带协议的格式:
$base_url = "http://127.0.0.1:8000"; - 确认Apache和Nginx的部署位置:
- 二者部署在同一台服务器时,检查Nginx配置的监听规则,确认是
listen 8000;或者listen 127.0.0.1:8000;,如果仅绑定了公网IP则调整监听规则,或者将base_url改为Nginx实际监听的地址。 - 二者部署在不同服务器时,将base_url修改为Nginx所在服务器的IP+端口格式,同时确认Nginx所在服务器的安全组、防火墙规则允许Apache服务器的IP访问8000端口。
- 二者部署在同一台服务器时,检查Nginx配置的监听规则,确认是
- 检查Apache所在服务器的SELinux配置,执行命令
getsebool httpd_can_network_connect,如果返回值为off,执行setsebool -P httpd_can_network_connect on开启Apache的网络请求权限。 - 先在Apache所在服务器用curl命令验证连通性,比如执行
curl http://<Nginx实际地址>:8000/infotech/selecionar_cidades,排除代码外的网络问题后再调试代码逻辑。
内容的提问来源于stack exchange,提问作者Iago Vinicius
相关产品推荐
相关产品推荐

