浏览模式: 标准 | 列表 Tag: nginx

解决nginx502错误经验小结

好久木有码字了,都有点生疏了。之前有写过一篇文章《解决nginx中FastCGI的502 Bad Gateway错误》,本篇《解决nginx502错误经验小结》就当是正冰对上一篇文章的补充与完善。

首先先讲理论,理论就跟说明书一样,理解明白了下次遇到问题可以快速判断,举一反三:

LNMP架构中PHP是运行在FastCGI模式下,随着系统的运行,php-cgi进程所占用的内存越来越多,并且似乎只增不减。有一段时间当我所管理的VPS经常遇到nginx 502错误时候,我以为这是网站访问量过高或者是系统中有软件配置不当出现问题。但是多番数据比较发现网站访问量并不高,配置也并未做修改。内存占用越大,不得不考虑是不是内存泄漏(这个是linux系统比较特有的),而来自PHP官方的解释却说php-cgi进程并没有内存泄漏,php-cgi会在每个请求结束的时候会回收脚本使用的全部内存,但是并不会释放给操作系统,而是继续持有以应对下一次PHP请求。这样做大概是为了减少内存碎片化或者解决从系统申请内存之后又释放回操作系统所需要的时间不可控问题。可是如果偶然一次PHP请求使用了诸如ftp或者zlib这样的大内存操作,那么将导致一大块系统内存被php-cgi持续占有,不能被利用。 

下面先来说一下php-cgi配置文件php-fpm.conf中较为有用的2个参数方便下面解决方案的说明:max_children与max_requests。max_children参数表示php将开启多少个php-cgi的子进程来应对用户的请求,而max_requests参数表示每个children最多处理多少个请求后便会被管理进程关闭“释放”内存后启动应对下一次PHP请求。php把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就使得所有的php-cgi子进程基本上在相近时间被关闭并重启。在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降低(不用处理php,更不用执行sql),而负载会升高(关闭和开启children、nginx等待php-fpm),网卡流量也降低(nginx无法生成数据传输给客户端)。

讲完理论继续讲实践,实践检验真理:

我用一条语句来说明php-cgi的内存占用情况以及进程启动时间

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'|grep www|sort -nrk5

图中显示的就是10个php-cgi进程,每个进程目前内存占用在10-16M左右(随着时间推移会越来越大直至进程重启内存回收),进程的上一次启动时间在12点52分到12点59分间。

php-cgi内存占用大.jpg

大小: 43.06 K
尺寸: 300 x 76
浏览: 56 次
点击打开新窗口浏览全图

最后,给出本篇小结:

解决方法:适当提高children的数值,降低max_requests的数值。建议一般VPS的children在5-10,max_requests在1000-2000,具体自行调整。 对了,降低max_requests的数值可使php-cgi重启的周期缩短,偶然的高内存操作造成的问题影响时间也会缩短。

还有另外一个解决方法:写一个crontab脚本,定时发现高内存占用的php-cgi进程并向它传送kill指令。 正冰只写出来提供思路,不推荐大家采用,因为当你在kill某个高内存占用的进程时,也就同时kill了该进程当前在处理的用户请求。根据正冰测试跟踪nginx的web日志发现当kill进程产生会出现502错误,因为该请求并未由php-cgi完成。所以,慎用该方法。

造成nginx产生502错误的原因较多,但是无非也就这么几方面:php-cgi进程数不够用、php执行时间长、php-cgi进程死掉等等。

遇到问题多查一下日志信息,相信寻因解决问题会很容易。Good Luck!

Tags: nginx, fastcgi, 502

转换重写规则:从apache的htaccess到nginx的RewriteRul...

越来越多的web服务器开始选择跑nginx,而两个平台的rewriterule却不相同,有这么一个网站,可以解决这个问题:

http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

Tags: apache, nginx, rewriterule

解决nginx中FastCGI的502 Bad Gateway错误

本博客一直运行正常,前段时间经常遇到502 Bad Gateway错误,web采用的是nginx,跑fastcgi,用php-fpm管理。当出现该问题,我采用重启php-cgi进程的方式(php-fpm restart),但总归不是长久之计,我通过检查排错,调整了配置文件(php-fpm.conf)中<value name="max_children">5</value>的值为10,而内存占用没有多大变化。保存配置文件并重启php-cgi,这样系统中的php-cgi进程为10个了。观察几天,再也没遇到502错误。注:因为本人主机是centos的vps主机,内存较小,故不配置更多的php-cgi进程。在实际生产环境中,你可根据硬件水平开启更多的进程!

恰好在我的运维群里孤竹朋友发了以下经验,故摘录。

1.FastCGI进程是否已经启动

2.FastCGI worker进程数是否不够
运行 netstat -anpo | grep "php-cgi" | wc -l 判断是否接近FastCGI进程,接近配置文件中设置的数值,表明worker进程数设置太少,请适当调整进程数
参见:http://blog.s135.com/post/361.htm

3.FastCGI执行时间过长
根据实际情况调高以下参数值
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

4.FastCGI Buffer不够
nginx和apache一样,有前端缓冲限制,可以调整缓冲参数
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
参见:http://www.hiadmin.com/nginx-502-gateway-error%E4%B8%80%E4%BE%8B/

5.Proxy Buffer不够
如果你用了Proxying,调整
proxy_buffer_size  16k;
proxy_buffers      4 16k;
参见:http://www.ruby-forum.com/topic/169040

6.https转发配置错误
正确的配置方法
server_name www.mydomain.com;
location /myproj/repos {
set $fixed_destination $http_destination;
if ( $http_destination ~* ^https(.*)$ )
{
set $fixed_destination http$1;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Destination $fixed_destination;
proxy_pass http://subversion_hosts;
}
参见:http://www.ruby-forum.com/topic/169040

Tags: nginx, fastcgi, 502

为“爱树人”增加rewrite功能(wordpress rewrite rule...

“爱树人”资讯频道(http://i.zjsru.com)选用的是wordpress程序架构,考虑到SEO问题,故在设计之初便加入rewrite功能,无奈功底欠深,没把wordpress在nginx下的rewrite规则写出来,只能求助google来搜索……

终于搜到(测试链接后正常可用):

if (!-e $request_filename) {
rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;
rewrite ^([_0-9a-zA-Z-]+)?(/.*.php)$ $2 last;
rewrite ^ /index.php last;
}

» 阅读全文

Tags: wordpress, rewrite, nginx

在nginx上配置Sa-Blog2.0与discuz7.0的rewrite规则

nginx上配置Sa-Blog2.0与discuz7.0的rewrite规则(代码)

顺带解决了directive "rewrite" is not terminated by ";"问题!

详细代码请入……

» 阅读全文

Tags: nginx

Nginx+PHP+mysql在CentOS5.3+128MB安装测试

按照张宴的nginx 0.7.x + PHP 5.2.8(FastCGI)搭建胜过Apache十倍的Web服务器(第4版)与Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存vps服务器上的配置优化两文,顺利搭建了:Nginx 0.7.61 + PHP 5.2.10(FastCGI)+mysql 5.1.35在CentOS5.3系统+128MB内存上的安装。

下载系统见:linux系统之CentOS5.3下载与安装

操作环境以及简单操作步骤:

在VMware Workstation 6.5.0上建立一个5GB虚拟硬盘,网络连接方式采用bridge(桥接)方式(分配一个独立的ip),划分了128MB内存(实际安装过程中128MB内存无法使用图形界面安装,故加到256MB内存采用图像界面安装后调回128MB内存,当然,采用text安装模式亦可),只安装基础的系统与一些编辑软件和gcc编译器。

安装系统完成后,开始安装Nginx+PHP+mysql环境,只要按照张宴文中的操作来,一般不会有问题,出现的问题可google下,一般都可以解决。

安装完Nginx+PHP+mysql组建的web应用环境,重启一次,采用webbench进行压力测试,效果不错!决定采购rashost的D128型号主机了。

Tags: centos, nginx, vps