nginx+php-fpm出现502 bad gateway错误解决方法

502错误是所有用nginx跑php的运维人员不愿意看见的,但是我遇到了!!!咋整,还能咋整,整呗。。

nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端php-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题导致不能正确解析php代码,最终返回给了客户端502错误。

服务器出现502的原因是连接超时 我们向服务器发送请求 由于服务器当前链接太多,导致服务器方面无法给于正常的响应,产生此类报错

因此如果你服务器并发量非常大,那只能先增加机器,然后按以下方式优化会取得更好效果;但如果你并发不大却出现502,一般都可以归结为配置问题,脚本超时问题。

1. php-fpm进程数不够用

使用 netstat -napo |grep “php-fpm” | wc -l 查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。

但也不能无休止调高,可以根据服务器内存情况,可以把php-fpm子进程数调到100或以上,在4G内存的服务器上200就可以。

2. 调高调高linux内核打开文件数量

可以使用这些命令(必须是root帐号)

echo ‘ulimit -HSn 65536’ >> /etc/profile

echo ‘ulimit -HSn 65536’ >> /etc/rc.local

source /etc/profile

3. 脚本执行时间超时

如果脚本因为某种原因长时间等待不返回 ,导致新来的请求不能得到处理,可以适当调小如下配置。

nginx.conf里面主要是如下

fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;

php-fpm.conf里如要是如下

request_terminate_timeout = 10s

4. 缓存设置比较小

修改或增加配置到nginx.conf

proxy_buffer_size 64k; proxy_buffers 512k; proxy_busy_buffers_size 128k;

5. recv() failed (104: Connection reset by peer) while reading response header from upstream

可能的原因机房网络丢包或者机房有硬件防火墙禁止访问该域名

但最重要的是程序里要设置好超时,不要使用php-fpm的request_terminate_timeout,

最好设成request_terminate_timeout=0;

因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。

May 01 10:50:58.044162 [WARNING] [pool www] child 4074, script ‘/usr/local/nginx/html/quancha/sameip/detail.php’ execution timed out (15.129933 sec), terminating May 01 10:50:58.045725 [WARNING] [pool www] child 4074 exited on signal 15 SIGTERM after 90.227060 seconds from start May 01 10:50:58.046818 [NOTICE] [pool www] child 4082 started

说一千道一万最重要的就是程序里控制好超时,gethostbyname、curl、file_get_contents等函数的都要设置超时时间。

另一个就是多说,这个东西是增加了网站的交互性,但是使用的多了反应就慢了,如果你网站超时且使用了多说是,可以关闭它。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

从URL开始,定位世界 | 洞见

从我们输入URL并按下回车键到看到网页结果之间发生了什么?换句话说,一张网页,要经历怎样的过程,才能抵达用户面前?下面来从一些细节上面尝试一下探寻里面的秘密。 ...

3595
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Distillery和edeliver自动化Elixir-Phoenix部署

Elixir构建于Erlang编程语言之上,是一种功能性编程语言,因其专注于开发人员的工作效率以及因为编写高度并发和可伸缩的应用程序而易于使用而闻名。

1650
来自专栏SDNLAB

“访问限制”&“代理访问”实验

前言: 第三届SDN创新大赛又悄悄临近了,第二届大赛时做的题目积压在电脑里实在可惜,因此简单整理,拿出来和大家分享,从代码到实验过程,比较详尽,可以供初学者参考...

38910
来自专栏zingpLiu

Nginx(一)安装及启停

    我发现很多博客排版杂乱,表达不清,读者看了往往云里雾里。我此前的博客也是如此,我自己很不满意。今起,每一篇博客都会用心写,此前的博客我也会尽力修改。至少...

1832
来自专栏黑白安全

Zeus-Scanner 宙斯漏洞扫描器 一款开源漏洞扫描工具

宙斯是一种先进的侦察工具,旨在简化Web应用程序侦察。Zeus拥有强大的内置URL解析引擎,多种搜索引擎兼容性,能够从禁用和webcache URL中提取URL...

1.1K4
来自专栏java思维导图

RESTful API 最佳实践(阮一峰)

它的大原则容易把握,但是细节不容易做对。本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API。

5272
来自专栏逸鹏说道

【通用方法】CentOS7 安装 Mogodb3.4(在线 && 离线)

平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html 先说推荐安装:在线安装...

3606
来自专栏北京马哥教育

linux、mysql、nginx、tomcat 环境下压力测试的主要调试参数

一、linux 系统内核参数 /etc/sysctl.conf文件常用参数 net.core.netdev_max_backlog = 32768 #允许送到队...

3097
来自专栏二进制文集

Git 30分钟简明教程

1991年,Linus创建了开源的Linux,世界各地的志愿者为Linux编写代码,但是绝大多数的内核维护工作,都花费在提交补丁和保存档案的繁琐事务上。这期间所...

913
来自专栏云计算教程系列

如何在Debian上使用Cachet

如果有多个业务系统对外提供服务,那么一个状态展示系统可以为客户提供直观的服务状态展示。当出现系统故障或安排更新计划时可以为客户提供一个信息公开的平台,以便作出相...

1973

扫码关注云+社区

领取腾讯云代金券