一般nginx搭配php都采用这样的方式:

location ~ \.php$ {
    proxy_pass http://localhost:9000;
    fastcgi_param SCRIPT_FILENAME /data/_hongdou$fastcgi_script_name;
    include fastcgi_params;
    }

这个方式只能连接到一组spawn-fcgi开启的fastcgi,在服务器负载稍高时常常出现502 bad gateway错误。

起先怀疑这是php-cgi的进程开得太少,增加后仍然有反映时常有错,偶然间发现php-cgi会报出这样的错误:

zend_mm_heap corrupted

看来是php-cgi在执行某些代码时有问题,以致于该线程中止。

在服务器上可能还会看到php-cgi进程在不断变少,估计是出现错误的php-cgi的进程自动退出了。

php的问题总是不太容易能解决,所以在nginx方面想想办法,nginx的好处是它总是能爆出一些稀奇古怪的做法出来。

在nginx的proxy中,规避莫名其妙错误的办法无非是proxy到一个upstream的服务器组中,然后配置 proxy_next_upstream,让nginx遇到某种错误码时,自动跳到下一个后端上。这样,应用服务器即使不稳定,但是在nginx后面就变成了稳定服务。想到nginx的fastcgi和proxy是一路东西,所以proxy能用的经验,移植到fastcgi也能跑得起来。

    照着这个思路,用spawn-fcgi多开同样一组php进程,所不同的仅仅是端口:

spawn-fcgi -a 127.0.0.1 -p 9000 -u nobody -f php-cgi -C 100
    spawn-fcgi -a 127.0.0.1 -p 9001 -u nobody -f php-cgi -C 100

然后把fastcgi的这段配置改成用upstream的方式:

upstream backend {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    }

location ~ \.php$ {
    fastcgi_pass backend;
    fastcgi_param SCRIPT_FILENAME /data/_hongdou$fastcgi_script_name;
    include fastcgi_params;
    }

检查配置结果正确,能跑起来;同时在服务器上netstat -n|grep 9000和grep 9001都有记录,证明连接无误;在前台查阅页面,一切运行正常。

这个配置是最简单的配置,既然能连接上upstream,那么很显然upstream的一些东西都可以拿来用,比如ip_hash、weight、max_fails等。

这样的配置在单机下不知能不能共享session,没有测试,如果有问题,可以加上ip_hash,或者配置php把session存进memcached中。

然后就是fastcgi_next_upstream的配置,nginx wiki中没有介绍到这个配置,查了一下,在nginx的CHANGES中有提到,而且出生年月是和proxy_next_upstream一样的。既然如此,那就照proxy_next_upstream一样配吧。一般按默认的值error timeout就可以工作,因为php出现502错误的异常是返回的500错误,所以我把fastcgi_next_upstream定为:

fastcgi_next_upstream error timeout invalid_header http_500;

通过这个配置,就可以基本杜绝任何时常性的500错误,出问题的几率会变小很多,如果客户反映仍然激烈,那么就多增加几组fastcgi进程。

以上配置能够杜绝由于php所引起的“莫名其妙”的时常性的502错误,同时可使nginx搭配php比从前方式更为强悍。假如nginx还是返回502错误,那这次就一定是出现服务器挂掉或其它严重问题的了。

转载于:https://blog.51cto.com/liuxin1982/915070

NGINX 502 Bad Gateway 用upstream解决方法相关推荐

  1. Nginx 出现504 Gateway Time-out的解决方法

    Nginx 出现504 Gateway Time-out的解决方法 参考文章: (1)Nginx 出现504 Gateway Time-out的解决方法 (2)https://www.cnblogs. ...

  2. java nginx 502_Nginx 502 bad gateway问题的解决方法

    Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad G ...

  3. nginx php 502 bad gateway,nginx 502 bad gateway问题怎么解决

    Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad G ...

  4. Nginx 502 Bad Gateway 错误的原因及解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 刚才在调试程序的时候,居然服务器502错误,昨天晚上也发生了,好像我没有做非常规的操作. 然后网上寻找了下答案, 把一些原因及 ...

  5. 服务器报错nginx 502 Bad Gateway的原因以及解决办法

    网站页面出现502badgateway怎么办?今天我们来分析一下原因和解决办法. 一.nginx 502 Bad Gateway出现的原因: nginx出现502多数是属于后端的问题,后期就是PHP的 ...

  6. Nginx 502 Bad Gateway 的错误的解决方案

    我用的是nginx反向代理Apache,直接用Apache不会有任何问题,加上nginx就会有部分ajax请求502的错误,下面是我收集到的解决方案. 一.fastcgi缓冲区设置过小 出现错误,首先 ...

  7. 常见的Nginx 502 Bad Gateway解决办法

    常见的Nginx 502 Bad Gateway解决办法如下: Nginx 502错误情况1: 网站的访问量大,而php-cgi的进程数偏少. 针对这种情况的502错误,只需增加php-cgi的进程数 ...

  8. 解决nginx 502 bad gateway

    nginx 502 bad gateway 可以采取客户端强制刷新的方法,但是真正的解决要么改配置或者放CDN上.      遇到这个问题,首先是有人发现可以加index.html访问,因为我们是线上 ...

  9. nginx 502 Bad Gateway解决办法

    我的解决方式比较小白, 第一次报这个错(nginx 502 Bad Gateway).网上找了一大圈都是PHP什么的,但是好像都不适用. 于是问了之前的一个同事,他说是不是我的tomcat关闭了,我恍 ...

最新文章

  1. RHEL 5服务篇—修改MySQl数据库root密码的几种方式
  2. 斯坦福NLP团队发布最新自然语言处理Python库
  3. csdn上传资源提示“该资源已存在,请重新上传”
  4. 科技/IT:2019 年 Q3 表现最佳和最差的企业
  5. [YTU]_2417 C语言习题 字符串长度
  6. php购物系统论文答辩老师评价,答辩指导教师的评语大全
  7. java概述、安装、配置环境、运行
  8. 网络抓包工具 wireshark教程
  9. bst 删除节点_C ++程序查找具有N个节点的BST数量(加泰罗尼亚编号)
  10. 【图说word】 宏
  11. 【AI视野·今日CV 计算机视觉论文速览 第240期】Thu, 4 Nov 2021
  12. “阿里离职女高管”蹭马云热度遭阿里高管打假:重新定义高管
  13. WSL配置C/D盘大小写敏感
  14. git clone 遇到的坑
  15. 【Gym-100085 K】Kingdom Roadmap【树上构造题】
  16. Hybrid App
  17. python第三方库官方文档汇总
  18. js获取屏幕高度、宽度
  19. 从“NVIDIA禁令”看如何正确选择NVIDIA GPU卡
  20. 《壁纸 - 大全精选手机壁纸》EULA条款协议

热门文章

  1. Linux MTD子系统 _从模型分析到Flash驱动模板
  2. 转载一篇阅读文章(还算不错吧)
  3. QQ号双主号要求验证码解决方法
  4. 利用Kubernetes名称空间来管理内存和CPU资源(三)
  5. 有这样的开发,产品经理跪着帮你擦汗!
  6. php %3ch1%3e字体,phpWebSite搜索模块跨站脚本执行漏洞
  7. 淘宝H5移动端解决方案
  8. spring框架的深入理解
  9. 在Intel处理器上,修改mitigations参数使Linux系统运行得更快
  10. gsoap插件之wsdd主动广播发送hello、bye