Nginx + Единорог
Я работаю над миграцией с nginx + passenger на nginx + unicorn, и я достиг точки, где я немного застрял.
Когда я пытаюсь просмотреть свой тестовый сервер, я получаю только страницу 404. Я уверен, что у меня что-то не так в моей конфигурации vhost, но я просто не вижу, в чем проблема.
Любая помощь с этим очень ценится.
Это текущая версия моего файла vhost
upstream unicorn-staging {
server unix:/data/appname/staging/current/tmp/sockets/unicorn-staging.sock fail_timeout=0;
}
server {
listen 80 deferred;
listen 443;
ssl on;
root /data/appname/staging/current/public;
server_name foo;
access_log /data/appname/staging/current/log/unicorn-staging-access.log;
error_log /data/appname/staging/current/log/unicorn-staging-error.log;
client_max_body_size 4G;
ssl_certificate /data/appname/staging/shared/certs/appname.crt;
ssl_certificate_key /data/appname/staging/shared/certs/appname.key;
location / {
proxy_pass http://unicorn-staging;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https; # for SSL, add this
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
index index.html index.htm;
}
location ~ \.(jpg|png|mp3|ogg)$ {
valid_referers server_names;
if ($invalid_referer) {
return 403;
}
}
location ~ \.(jpg|png|mp3|ogg|js|css|html|gif)$ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
location ~ ^/(images|javascripts|stylesheets|assets)/ {
root /data/appname/staging/current/public; # for asset pipeline and other static files
expires max;
break;
}
# redirect server error pages to the stat
error_page 500 502 503 504 /50x.html;
}
1 ответ
Ваша конфигурация единорога, скорее всего, настроена неправильно.
Это происходит на моем сервере, когда nginx работает, а Unicorn - нет. Причина в том, что nginx пытается передать запрос в сокет, но единорог не может его получить.
По умолчанию единорог слушает только порт 8080. Вы можете изменить настройки единорога для прослушивания через другой порт или сокет.
Если вы используете файл конфигурации единорога (config/unicorn.rb
), то внутри этого файла у вас должно быть что-то вроде (обратите внимание, вам придется изменить путь к сокету):
listen File.expand_path("tmp/sockets/unicorn.sock", RAILS_ROOT)
В целях отладки я также заставляю его слушать порт.
listen File.expand_path("tmp/sockets/unicorn.sock", RAILS_ROOT)
listen 3000, :tcp_nopush => true
Чтобы запустить единорога на вашем рабочем веб-сервере, необходимо выполнить команду, подобную следующей:
bundle exec unicorn -E production -c config/unicorn.rb
Это использует файл конфигурации единорога. См. http://unicorn.bogomips.org/Unicorn/Configurator.html для примера файла конфигурации.
Если вы не используете файл конфигурации единорога, переключатель командной строки требуется в формате:
-l, --listen ADDRESS
Например:
bundle exec unicorn -l tmp/sockets/unicorn.sock
Обратите внимание, что я использую относительный путь, потому что pwd
Я использую это корневую директорию rails.