spawn-fcgi + multiwatch + nginx + ruby​​:工作人员不回应

我用Ruby和FastCGI做了一个网站,在Apache下它工作得很好。 我想切换到Nginx,但我无法得到它的工作。

该网站由两个stream程组成:一个负责处理AJAX呼叫,另一个处理剩下的事情。

到目前为止,我想我应该使用spawn-fcgi来启动我的工作者并将它们绑定到一个套接字。 因为我想有多个工作人员,我也使用multiwatch。

问题是,每当我尝试访问一个页面,我得到一个502错误,并在error.log中的以下行:

2013/04/03 23:58:39 [error] 1450#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: v2.localhost, request: "GET / HTTP/1.1", upstream: "http://unix:/run/fastcgi/site-v2.main.sock:/", host: "v2.localhost:8000" 

所以没有工人回答这个要求。 netstat -x根本不显示套接字,但看起来好像在使用中,因为如果我尝试两次启动我的启动脚本,它说spawn-fcgi: socket is already in use, can't spawn

最后一件事情是:如果我启动我的启动脚本,而不尝试请求一个页面,multiwatch进程和工作人员终止正确与一kill multiwatch。 但是,如果我要求一个页面,应该发送响应的multiwatch和所有的子工作者挂起。 我必须kill -9他们。

该网站的入口点如下所示:

 require 'fcgi' FCGI.each do |req| process req end 

我的启动脚本:

 USER=www-site-v2 GROUP=www-site-v2 SOCK_MODE=0660 NB_WORKERS_MAIN=4 NB_WORKERS_AJAX=4 MULTIWATCH_BIN=/usr/bin/multiwatch APP_MAIN=/var/www/site-v2/www/main.rb APP_AJAX=/var/www/site-v2/www/ajax.rb PID_MAIN=/run/fastcgi/site-v2.main.pid PID_AJAX=/run/fastcgi/site-v2.ajax.pid SOCK_MAIN=/run/fastcgi/site-v2.main.sock SOCK_AJAX=/run/fastcgi/site-v2.ajax.sock SPAWN_BIN=/usr/bin/spawn-fcgi SPAWN_ARGS="-u $USER -g $GROUP -M $SOCK_MODE -d /var/www/site-v2/www" SPAWN_ARGS_MAIN="-s $SOCK_MAIN -P $PID_MAIN" SPAWN_ARGS_AJAX="-s $SOCK_AJAX -P $PID_AJAX" case "$1" in start) test \! -d /run/fastcgi && mkdir /run/fastcgi $SPAWN_BIN $SPAWN_ARGS $SPAWN_ARGS_MAIN -- $MULTIWATCH_BIN -f $NB_WORKERS_MAIN -- $APP_MAIN && \ $SPAWN_BIN $SPAWN_ARGS $SPAWN_ARGS_AJAX -- $MULTIWATCH_BIN -f $NB_WORKERS_AJAX -- $APP_AJAX ;; stop) test -f $PID_MAIN && kill `cat $PID_MAIN` test -f $PID_AJAX && kill `cat $PID_AJAX` esac 

我的nginxconfiguration文件:

 server { listen 8000; server_name v2.localhost; location ^~ /theme/ { root /var/www/site-v2/www/static; } location ^~ /javascript/ { root /var/www/site-v2/www/static; } location ^~ /avatars/ { root /var/www/site-v2/www/static; } location / { include fastcgi_params; proxy_redirect off; proxy_pass http://unix:/run/fastcgi/site-v2.main.sock:; } location /ajax/ { include fastcgi_params; proxy_redirect off; proxy_pass http://unix:/run/fastcgi/site-v2.ajax.sock:; } } 

好的,我很笨。 无论什么原因,我在我的nginxconfiguration文件中使用了proxy_pass而不是fastcgi_pass 。 所以nginx使用了错误的协议,工作人员去了“wtf?” 挂了。

像现在的魅力一样。

 server { listen 8000; server_name v2.localhost; location ^~ /theme/ { root /var/www/site-v2/www/static; } location ^~ /javascript/ { root /var/www/site-v2/www/static; } location ^~ /avatars/ { root /var/www/site-v2/www/static; } location / { include fastcgi_params; fastcgi_pass unix:/run/fastcgi/site-v2.main.sock; } location /ajax/ { include fastcgi_params; fastcgi_pass unix:/run/fastcgi/site-v2.ajax.sock; } }