Pages

Thursday, 23 May 2013

一个关于“502 bad gateway"问题的解决

在我重启vps后,因为未启动nginx ,故我搭建在 nginx上的2个网站http://el.brite.biz:81/和
http://ob.brite.biz:81/都是打不开的,在firefox中显示“unable to connect”,这是由于未启动webserver造成的典型提示,于是我启动nginx(命令为/usr/local/nginx/sbin/nginx)。在我启动nginx后,http://ob.brite.biz:81/可以打开了,但是http://el.brite.biz:81/依然打不开,显示:“502 bad gateway“错误。当时觉得很奇怪,要么都不能打开,要么都能打开,怎么会一个打得开,另一个打不开呢?原来是http://ob.brite.biz:81/的建站程序-oblog做了伪静态处理,http://ob.brite.biz:81/之所以能打开,其实是通过访问
http://ob.brite.biz:81/index.html来打开的,而访问http://ob.brite.biz:81/index.php是打不开网站的,访问http://ob.brite.biz:81/index.php一样的会显示“502 bad gateway"。

我是通过php5-cgi来跟nginx相整合的(即:通过/usr/bin/spawn-fcgi -a 127.0.0.1 -C 10 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi),我以为是php5-cgi没在运行造成的, 于是输入命令ps aux|grep php5-cgi,发现它在运行。

查看nginx.conf中的http://el.brite.biz:81相应的server段代码:
server {
listen 81;
server_name el.brite.biz;
location / {
root /usr/local/nginx/emlog/;
index index.html index.htm index.php;
}
location ~ \.php$ {
root /usr/local/nginx/emlog/;
fastcgi_pass 127.0.0.1:9090;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/emlog/$fastcgi_script_name;
include fastcgi_params;
}
}

才发现nginx.conf中让fastcgi去监听9090端口了而非9000端口,
as3:~# netstat -antlnp |grep 9090
as3:~# 
以上结果表明没有程序在使用9090端口,fastcgi当然也未在使用9090端口。那么fastcgi使用的是什么端口呢??从这条命令:
/usr/bin/spawn-fcgi -a 127.0.0.1 -C 10 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi,就可知道fastcgi使用的端口是9000。运行如下命令:

as3:~# netstat -antlnp |grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      28284/php5-cgi
就可知php5-cgi(fastcgi) 使用的端口的确是9000,所以 需要把nginx.conf中的http://el.brite.biz:81相应的server段代码中的9090改为9000,然后重启nginx,即可解决问题。

当然9000端口也可改成服务器上未被使用的其他端口,比如9080:
 # killall php5-cgi
# /usr/bin/spawn-fcgi -a 127.0.0.1 -C 10 -p 9080 -u www-data -g www-data -f /usr/bin/php5-cgi
  这样fastcgi所使用的端口就改成了9080.
不过nginx.conf中的9000也必须相应的改成9080,然后重启nginx。