博采众长,精于一技。Live for love, work for dream.

Nginx 502 Bad Gateway错误及解决方案收集

1.FastCGI worker进程数是否不够

通过命令查看服务器上一共开了多少的 php-cgi 进程

ps -fe |grep "php" | grep -v "grep" | wc -l
使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求

netstat -anop | grep "php" | grep -v "grep" | wc -l
接近配置文件中设置的数值,表明worker进程数设置太少

2.FastCGI执行时间过长

根据实际情况调高以下参数值

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

3.FastCGI Buffer不够

nginx和apache一样,有前端缓冲限制,可以调整缓冲参数

fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;

这个一般你能在日志中看到:upstream sent too big header while reading response header from upstream
意思就是反馈回来的头部信息太大,好多是Firefox浏览时才出现,是它的插件引起的。

4.Proxy Buffer不够

如果你用了Proxying,试试调整

proxy_buffer_size 16k;
proxy_buffers 4 16k;

Nginx 遇到 502 Bad Gateway 自动重启php-fpm

最近服务器时不时出现Nginx 502 Bad Gateway,如果在电脑旁边还好,要是半夜或者出去了,怎么办?
没关系,写个脚本检测服务状态,发现异常,自动重启。
自动重启脚本:
<?php
$url 
'http://blog.rebill.info';
$cmd '/usr/local/php/sbin/php-fpm restart';
 
for(
$i 0$i 5$i ++){
        
$exec "curl  connect-timeout 3 -I $url 2>/dev/null";
        
$res shell_exec($exec);
 
        if(
stripos($res'502 Bad Gateway') !== false){
                
shell_exec($cmd);
                exit();
        }
}

原理就是用curl获取HTTP头,发现502状态码就执行重启php-fpm的命令。
url和cmd根据实际情况改成自己的。然后放到crontab里一分钟执行一次。
*/1 * * * * /usr/bin/php /root/crontab/nginx502.php

大功告成!

使用fastcgi_cache为你的Nginx网站加速

对于变化不太频繁的数据,大家都比较喜欢存Memcached以减少数据库的读取,但还是会有语言解析运行上的消耗(比如运行PHP,Python等),当然这个时间很短,记得OP上有个同学说P字头的语言,效率都不高,如果能省去,当然最好。(已经用上Squid等的可以忽略本文)。

还有一个问题就是很多时候一个页面由多个数据片断组成,为了提高页面速度,要么分别缓存,要么整体缓存(所谓的Page Cache),其实都比较麻烦,增加和减少数据片断的时,大多需要调整。

最后一个问题,所有的数据都存Memcached是否经济?服务器资源足够多的无所谓,捉襟见肘的就要考虑了,当然,生成静态页面是一种方法,需要维护,还是比较累。

好吧,nginx的fastcgi_cache可以解决上面的那些问题,比较squid等的好处是简单,不需再要去维护另外一个系统,适合不那么大的网站。

关于Nginx fastcgi_cache,基础的可以参看Nginx官方文档http://wiki.nginx.org/HttpFcgiModule,下面是一个典型的做法是:
fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
fastcgi_cache_valid 200 301 302 1d;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;

全局定义一个缓存空间,配置文件名为,fastcgi_cache.conf,然后在vhost配置里面加上:
fastcgi_cache ngx_fcgi_cache;
include fastcgi.conf;

继续阅读 »

Ubuntu 10.04安装Nginx+PHP+MySQL

0.前言
本文为Ubuntu10.04下快速安装教程,如果你想在源码上编译安装,本文不适合你,但你可参考
在 Ubuntu 9.10 Server 上安装 Nginx 0.8.34
ubuntu安装 nginx,PHP,php-fpm
或我之前写的Ubuntu下安装Nginx + PHP-FPM +MySQL

1.安装PHP-FPM
1.1 添加第三方源
sudo add-apt-repository ppa:sushkov/personal
sudo apt-get update

1.2 安装php环境(请根据自己的应用来选择安装,我只是装PHP来测试,所以只装了最基本的组件)
sudo apt-get install php5-cli php5-common php5-suhosin php5-fpm php5-cgi php5-mysql

2.安装Nginx
2.1 添加第三方源
在/etc/apt/sources.list添加PPA的源
deb http://ppa.launchpad.net/jdub/devel/ubuntu lucid main
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9EEF4A1
sudo apt-get update

2.2 安装Nginx
sudo apt-get install nginx
至此Nginx安装完成。

继续阅读 »

1分钟完美安装最新 CentOS + Nginx + PHP-FPM + MySQL

PHP 5.3.1
MySQL 5.0.89
Nginx 0.8.33 或 0.7.65 (可选)
现在,我们可以快速全自动搞定CentOS + Nginx + PHP-FPM + MySQL的安装了
这个可比网上流传的什么一键安装包要好得多,强烈推荐此法安装,适合所有菜鸟和高手
我服务器上全用的源代码编译安装,也好不到哪去,还很费劲
我这个装完已经包含 php 的一些常用扩展, PDO,eaccelerator,memcache,tidy等等

继续阅读 »

返回顶部