spawn-fcgi + multiwatch + nginx + ruby: рабочие не отвечают
Я сделал сайт с Ruby и FastCGI, и он прекрасно работает под Apache. Я хотел бы перейти на nginx, но не могу заставить его работать.
Сайт состоит из двух процессов: один заботится о вызовах AJAX, другой заботится об остальных.
До сих пор я понял, что должен использовать 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
сокет вообще не отображается, но кажется, что он используется, потому что если я попытаюсь запустить мой стартовый скрипт дважды, он скажет spawn-fcgi: socket is already in use, can't spawn
,
И последнее: если я запускаю свой стартовый скрипт и не пытаюсь запросить страницу, процессы с несколькими часами и рабочие корректно завершаются одним kill
для нескольких часов. Но если я запрашиваю страницу, мульти-часы должны отправить ответ, и все его работники-дети как бы зависают. Мне пришлось 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 ответ
Хорошо я тупой По какой-то причине я использовал proxy_pass
вместо fastcgi_pass
в моем файле конфигурации nginx. Таким образом, 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;
}
}