Nginx + Единорог

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

Скорее всего, ваша конфигурация Unicorn настроена неправильно.

Это происходит на моем сервере, когда nginx запущен, а unicorn нет. Причина в том, что nginx пытается передать запрос в сокет, но unicorn там нет, чтобы его получить.

По умолчанию unicorn прослушивает только порт 8080. Вы можете изменить настройки unicorn для прослушивания другого порта или сокета.

Если вы используете файл конфигурации Unicorn ( 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

Чтобы запустить unicorn на рабочем веб-сервере, необходимо выполнить команду, подобную следующей:

bundle exec unicorn -E production -c config/unicorn.rb

Здесь используется файл конфигурации unicorn. См.http://unicorn.bogomips.org/Unicorn/Configurator.htmlдля примера файла конфигурации.

Если вы не используете файл конфигурации Unicorn, необходим ключ командной строки в формате:

-l, --listen ADDRESS

Например:

bundle exec unicorn -l tmp/sockets/unicorn.sock

Обратите внимание, что я использую относительный путь, поскольку pwdя использую корневой каталог rails.

Связанный контент