web-dev-qa-db-ja.com

spawn-fcgi + multiwatch + nginx + Ruby:ワーカーが応答しない

RubyとFastCGIを使用してWebサイトを作成しましたが、Apacheでうまく機能します。nginxに切り替えたいのですが、機能しません。

ウェブサイトは2つのプロセスで構成されています。1つはAJAX呼び出しを処理し、もう1つは残りを処理します。

これまでのところ、spawn-fcgiを使用してワーカーを起動し、ソケットにバインドする必要があると考えました。複数のワーカーが欲しいので、マルチウォッチも使用しています。

問題は、ページにアクセスしようとすると、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はソケットをまったく表示しませんが、開始スクリプトを2回起動しようとすると、spawn-fcgi: socket is already in use, can't spawnと表示されるため、使用中のようです。

最後にもう1つ、開始スクリプトを起動してページをリクエストしようとしない場合、マルチウォッチプロセスとワーカーはマルチウォッチへの1つのkillで適切に終了します。しかし、私がページを要求すると、マルチウォッチは応答を送信することになっていて、allその子ワーカーは一種のハングアップを起こします。私はそれらすべてを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

私のnginx構成ファイル:

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:;
    }
}
1
Pikrass

わかりました、私はばかです。何らかの理由で、nginx構成ファイルで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;
    }
}
0
Pikrass