Назад | Перейти на главную страницу

Nginx + Единорог

Я работаю над переходом с nginx + пассажира на 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;
}

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

Это происходит на моем сервере, когда nginx запущен, а единорог - нет. Причина в том, что 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

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

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.