Проблемы с обслуживанием приложения Rails 3 с помощью nginx + unicorn на EC2

Когда я указываю свой браузер на «rails_app.com», я могу просматривать rails_app/public/index.html в экземпляре EC2, но когда я удаляю rails_app/public/index.html, я получаю ошибку nginx 403,

      directory index of "/home/www-data/rails_app/public/" is forbidden, 

вместо того, чтобы видеть мой Rails 3.0.3 rails_app. я использую

Nginx Version 0.8.54
Unicorn_rails Version 3.4.0

В одном сообщении, которое я прочитал, говорилось, что мне нужно убедиться, что для пользовательских www-данных доступна правильная версия ruby, что я и сделал. У меня есть владельцы каталогов для rails_app, установленные для пользователя и группы на www-data, а разрешения установлены на 775. Я вижу, что HTTP-запросы достигают nginx, просматривая журнал доступа. У меня есть настройка DNS для моего доменного имени «rails_app.com», чтобы указать на эластичный IP-адрес AWS, который является эластичным IP-адресом экземпляра EC2, на котором я запускаю nginx + unicorn с моим приложением rails.

Я думаю, что устранил эту ошибку 403 выше, как описано в обновлении 2 ниже. Теперь получаю ошибку 500. Я исправил ошибку 500, как описано в обновлении 4 ниже.

Я запускаю nginx с

/usr/sbin/nginx -c /home/www-data/rails_app/config/nginx.conf

и я запускаю единорога с

bundle exec unicorn_rails -p 8000 -E production -c /home/www-data/rails_app/config/unicorn.rb -D

Вот мой unicorn.rb:

worker_processes 1
preload_app true
main_dir = '/home/www-data/rails_app'
working_directory '/home/www-data/rails_app'
listen 8000, :tcp_nopush => true
listen "/tmp/shop.socket", :backlog => 2048
timeout 30
user 'www-data'
shared_path = "#{main_dir}/shared"
pid "#{shared_path}/pids/unicorn.pid"
stderr_path "#{shared_path}/log/unicorn.stderr.log"
stdout_path "#{shared_path}/log/unicorn.stdout.log"

ОБНОВЛЕНИЕ 1. Я упростил свой nginx.conf после прочтения этой ссылки на Nginx Подводные камни. Вот мой nginx.conf:

ОБНОВЛЕНИЕ 2. В этом сообщении говорится, что наличие $uri/ в try_files вызывает ошибку 403, потому что nginx не может вывести каталог. Итак, я удалил $uri/ из try_files, и теперь я получаю ошибку 500, при этом ничего не отображается в журналах ошибок nginx или unicorn. Любые идеи, как это отладить?

user www-data www-data;
worker_processes 2;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
  worker_connections  1024;
  accept_mutex on;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  sendfile    on;

  tcp_nopush  on;
  tcp_nodelay off;

  keepalive_timeout   65;
  client_body_timeout 120;
  upstream app_server {
 #   server 127.0.0.1:8000 fail_timeout=0;
    server unix:/tmp/shop.socket fail_timeout=0;
  } 

  log_format main '\$remote_addr - \$remote_user [\$time_local] \$request '
                  '"\$status" \$body_bytes_sent "\$http_referer" '
                  '"\$http_user_agent" "\$http_x_forwarded_for"';

  access_log /var/log/nginx/access.log main;

  server {
    listen 0.0.0.0:80 ;
    server_name rails_app.com *.rails_app.com;
    index index.html index.htm index.php;
    root /home/www-data/rails_app/public;

    client_max_body_size 50M;

    location /    {
      try_files $uri/index.html $uri.html $uri @app;
    }

    location @app    {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;

    }   # location /

    error_page 500 502 503 504 /500.html;
    location = /50x.html {
        root /home/www-data/rails_app/public;
    }

 }  # server

}   # http

Используя TCP-порт для единорога, я вижу, что единорог прослушивает, используя

netstat -natp

Теперь я получаю сообщение об ошибке: отображается страница 500.html:

   We're sorry, but something went wrong.

В файле журнала ошибок nginx или в файле журнала ошибок unicorn ошибок нет.

Обновление 3 –

Когда я углубляюсь в это, я думаю, что проблема может быть с единорогом. Когда я запускаю приложение rails в этом примере, оно работает нормально, но это Приложение rails использует sqlite3 вместо mysql. Также этот пример допускает развертывание с нулевым временем простоя, используя здесь код before_fork и after_fork:

 before_fork do |server, worker|
   defined?(ActiveRecord::Base) and
     ActiveRecord::Base.connection.disconnect!
 end

 after_fork do |server, worker|
   defined?(ActiveRecord::Base) and
     ActiveRecord::Base.establish_connection
 end

Когда я пытаюсь запустить свое rails_app с помощью mysql и использую приведенный выше код before_fork, after_fork в моем файле unicorn.rb, это не удается, и я получаю сообщение об ошибке:

active_record/connection_adapters/abstract/connection_pool.rb:316:in `retrieve_connection': ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished)

Обновление 4 –

Я добавил -d (отладка) в командную строку unicorn_rails как

bundle exec unicorn_rails -p 8000 -E production -c /home/www-data/rails_app/config/unicorn.rb -d -D  

и обнаружил ряд ошибок, первая из которых заключалась в том, что в config/application.rb отсутствовал config.secret_token. Добавил это и продолжай отлаживать.


person Community    schedule 30.01.2012    source источник


Ответы (3)


Наконец заработало. Последняя проблема заключалась в том, что Unicorn жаловался на отсутствие маршрутов для «/». Запуск «bundle exec rake route» ничего не дал. После того, как 'bundle exec rake route' создал маршруты, как объяснено ">здесь, потом появился сайт.

person Community    schedule 14.02.2012
comment
Направил меня в нужном направлении. В моем случае я удалил $uri/ из строки try_files, и это сработало. - person kervin; 09.08.2013

Мне кажется, что это может быть вызвано невозможностью установить «preload_app true» в вашем файле конфигурации.

person Blockpusher    schedule 08.02.2012
comment
dmw - Что вы имеете в виду под местоимением -this- в конце вашего предложения? У меня было preload_app true в моем конфигурационном файле unicorn.rb, когда я включал код before_fork и after_fork, и я все еще получал ошибку ConnectionNotEstablished в connection_pool.rb. - person James Testa; 08.02.2012
comment
Да, это то, что я имел в виду. Поскольку preload_app для вас верен, очевидно, проблема имеет другую причину. - person Blockpusher; 08.02.2012

У меня возникает та же проблема. На самом деле я смог временно обойти это, запустив webrick из каталога приложения ($ rails s), а затем подключившись к моему серверу через порт 3000 (http://example.com:3000).

p.s. должен ли файл unicorn.log зацикливаться/прокручиваться без остановки? Мне кажется странным, когда я не запускаю приложение.

person Community    schedule 10.04.2012