安装fastcgi模式php
./configure --prefix=/site/webserver/php --with-config-file-path=/site/webserver/php/etc --with-mysql=/usr/local/mysql --with-zlib-dir=/usr/local/zlib --with-png-dir=/usr/local --with-jpeg-dir=/usr/local/jpeg6 --with-gd --enable-soap --with-iconv --with-sqlite=shared --enable-sockets --enable-mbstring=all --with-curl --with-libxml-dir=/usr/local/libxml2 --with-freetype-dir=/usr/local/freetype --enable-fastcgi --enable-fpm --enable-force-cgi-redirect ## 最重点的一句是 --enable-fastcgi --enable-force-cgi-redirect make make install
修改php.ini cgi.fix_pathinfo=1 这样php-cgi方能正常使用SCRIPT_FILENAME这个变量。
安装nginx
./configure --prefix=/site/webserver/nginx --with-http_stub_status_module make make install
spawn-fcgi http://redmine.lighttpd.net/projects/spawn-fcgi/news
fetch http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz ./configure make make install
启动fastcgi: /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -f /site/webserver/php/bin/php-cgi
启动nginx: /site/webserver/nginx/sbin/nginx
配置虚拟主机部分,支持pathinfo的nginx代码如下:
## 在nginx.conf的server部分:
server {
listen 8080;
server_name localhost;
location ~ \.php {
include fastcgi.conf;
}
}
##要点: \.php 后面没有$,以便匹配所有 *.php/* 形式
##重点代码见 fastcgi.conf 开头部分
特别提示:这样会存在严重的安全问题,用户可能使用 asc.php.jpg形式图片文件,而nginx当作php给执行了! — 屈伟 2010/03/13 20:56
fastcgi.conf 代码如下:
fastcgi_pass 127.0.0.1:9000;
##fastcgi_index index.php;
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
## 以上是支持pathinfo的重点部分
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;
server {
listen 8080;
server_name cs.niceword.cn;
location / {
root /data/apps/cs;
index index.php index.html index.htm ;
# !-e 表示如果文件不存在。
if (!-e $request_filename) {
rewrite ^/xn/(.+)$ /xn.php/xn/$1 last;
rewrite ^/xn$ /xn.php/xn last;
rewrite ^/xn/$ /xn.php/xn last;
rewrite ^/(.+)$ /index.php/$1 last;
}
}
location ~ \.php {
root /data/apps/cs;
include fastcgi.conf;
}
}
#!/usr/local/bin/bash
case $1 in
start)
/usr/local/sbin/nginx
;;
stop)
killall -9 nginx
;;
test)
nginx -t -c /usr/local/etc/nginx/nginx.conf
;;
restart)
ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP
;;
show)
ps -aux|grep nginx
;;
esac
如题,最近网站频繁出现502错误,简直无法正常运转,出现这种情况大多是php-cgi超时没有返回信息,或进程僵死等情况造成的,参考张宴的这篇关于 502错误的解决办法(http://blog.s135.com/read.php?361)。
经过分析将nginx的error log打开,发现”pstream sent too big header while reading response header from upstream”这样的错误提示,查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决,后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。修改方法如下:
fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k;