当前位置: 首页 > news >正文

Nginx提示502和504错误的终极解决方案

一、错误提示说明:

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

Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

二、错误提示原因分析:

解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,

而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。

php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout” ,但是这个值不是通用的,而是需要自己计算的。

计算的方式如下:

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

三、临时解决办法:

综上所述,Nginx提示502和504错误的临时解决办法是:

1、调整php-fpm.conf的相关设置:

<value name=”max_children”>32</value>

<value name=”request_terminate_timeout”>30s</value>

2、调整nginx.conf的相关设置:

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;

四、终级解决方案:

标题3中所示的解决方案只能临时解决问题,而如果网站的访问量确实非常非常大,而Nginx+FastCGI只能对处理瞬间或短时间内的高并发有很好的效果,所以目前唯一的终极解决方案是:定时平滑重启php-cgi。

具体配置如下:

1、写一个非常简单的脚本:

#vi /home/www/scripts/php-fpm.sh

内容如下:

#!/bin/bash
# This script run at */1
/usr/local/php/sbin/php-fpm reload

2、将脚本添加至计划任务:

#crontab -e

内容如下:

*/1 * * * * /home/www/scripts/php-fpm.sh

注:为了省事起见,也可以不写脚本,直接在crontab里写入php-fpm的平滑重启命令。


转: http://blog.chinaunix.net/uid-24500107-id-2602885.html

相关文章:

  • MySQL远程连接不上
  • 微信jssdk分享功能开发
  • nginx配置pathinfo模式,解决访问404
  • sphinx搜索优化
  • Liunx学习01
  • Linux学习02
  • Linux学习03tcp_wrappers
  • 解决thinkPHP5 paginate()分页不带参数问题
  • Apache 压力测试工具ab
  • ThinkPHP5.0 空模块、空控制器、空操作的跳转
  • Mysql主从同步备份策略分享
  • nginx index.php 隐藏设置
  • Linux 搭建git服务器
  • Yii2 – Mongodb的安装和配置 mongo
  • 搭建一个redis高可用系统
  • 【翻译】babel对TC39装饰器草案的实现
  • 【个人向】《HTTP图解》阅后小结
  • 2019年如何成为全栈工程师?
  • CSS实用技巧
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker: 容器互访的三种方式
  • jquery cookie
  • Less 日常用法
  • node和express搭建代理服务器(源码)
  • oschina
  • PHP 小技巧
  • python docx文档转html页面
  • Python学习之路13-记分
  • Redis在Web项目中的应用与实践
  • TypeScript实现数据结构(一)栈,队列,链表
  • V4L2视频输入框架概述
  • vue 个人积累(使用工具,组件)
  • yii2权限控制rbac之rule详细讲解
  • 安卓应用性能调试和优化经验分享
  • 半理解系列--Promise的进化史
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 第十八天-企业应用架构模式-基本模式
  • 对超线程几个不同角度的解释
  • 技术胖1-4季视频复习— (看视频笔记)
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端_面试
  • 学习使用ExpressJS 4.0中的新Router
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 怎么将电脑中的声音录制成WAV格式
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #define用法
  • (175)FPGA门控时钟技术
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十六)串口UART
  • (新)网络工程师考点串讲与真题详解