我有使用 nginx 的经验,但它一直是为我预安装的(通过 VPS.net 预配置映像)。我真的很喜欢它为我所做的一切,现在我正尝试使用 apt-get 将它安装在我自己的服务器上。这是一个相当新的 Debian 5 安装。我安装了几个额外的软件包,但它们都是 .deb,没有手动编译或任何疯狂的事情发生。
Apache 已安装,但我禁用了它。我执行了 apt-get install nginx,一切正常。根据我的需求稍微更改了配置,尽管即使使用默认配置,我即将描述的相同问题也会发生。
我花了一段时间才弄清楚,nginx 的默认 debian 软件包不会自动生成 fastcgi 进程。这很蹩脚,但我弄清楚了如何使用此脚本来实现这一点,我发现这个脚本发布在许多不同的网站上:
#!/bin/bash
## ABSOLUTE path to the PHP binary
PHPFCGI="/usr/bin/php5-cgi"
## tcp-port to bind on
FCGIPORT="9000"
## IP to bind on
FCGIADDR="127.0.0.1"
## number of PHP children to spawn
PHP_FCGI_CHILDREN=10
## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=1000
# allowed environment variables sperated by spaces
ALLOWED_ENV="ORACLE_HOME PATH USER"
## if this script is run as root switch to the following user
USERID=www-data
################## no config below this line
if test x$PHP_FCGI_CHILDREN = x; then
PHP_FCGI_CHILDREN=5
fi
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"
if test x$UID = x0; then
EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
else
EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
fi
echo $EX
# copy the allowed environment variables
E=
for i in $ALLOWED_ENV; do
E="$E $i=${!i}"
done
# clean environment and set up a new one
nohup env - $E sh -c "$EX" &> /dev/null &
当我执行“ps -A | grep php5-cgi”时,我看到 10 个进程正在运行,它们应该已准备好监听。
但是当我尝试通过 nginx 查看网页时,只收到 502 错误网关错误。
经过一番折腾之后,我尝试 telnet 到 127.0.0.1 9000(fastcgi 正在监听端口 9000,并且 nginx 配置为与该端口通信),但它立即关闭了连接。
这让我觉得问题出在 fastcgi 上,但我不确定我能做什么来测试它。它可能只是因为没有收到任何要处理的数据而关闭了连接,但它关闭了立即地所以这让我改变了想法。
所以……有什么建议吗?我搞不懂。虽然现在是凌晨 1 点,但这也没什么用,但我快要疯了!
答案1
在我的服务器上我也使用 nginx+fcgi。
我的解决方案并非万无一失,但至少有效。我有这个脚本,它在 /etc/init.d/ 下使用 spawn-fcgi 和 php5-cgi
#!/bin/bash
PHP_SCRIPT='/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi'
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall -9 php5-cgi
RETVAL=$?
;;
restart)
killall -9 php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
相关的 nginx 配置如下:
server {
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME /var/www/hyperblasted/$fastcgi_script_name;
}
...
}
并且 fastcgi.conf 包含以下内容
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 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;
希望这可以帮助 :)
PS:使用此设置时,我遇到了一个问题,即 cgi 守护程序会时不时地死机。我通过每 5 分钟在 cronjob 中执行此操作解决了此问题:
if ps aux | grep 'php5-cgi' | grep -v grep > /dev/null ; then
echo "PHP-cgi is runnning !"
else
echo "PHP-cgi is down. Starting over..."
/etc/init.d/php-fcgi start
fi
答案2
我根本不是这方面的专家。事实上,我看到你的帖子是因为我遇到了同样的问题。但是,我似乎能够让它工作,我所做的就是将 /etc/init.d/php-fastcgi 文件中的 USERID(www-data)更改为我当前正在运行的用户。如果这没有帮助或者我无法进一步解释,我很抱歉,但我想我会发布它以防万一它有用。
答案3
尝试这个:
vim /etc/php5/fpm/pool.d/www.conf
然后改变
; listen.owner = www-data
; listen.group = www-data
到
listen.owner = www-data
listen.group = www-data