Проблема с обслуживанием приложения Rails 3 с nginx + единорог на EC2 - PullRequest
3 голосов
/ 30 января 2012

Когда я указываю своему браузеру «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

В одном посте, который я прочитал, сказано, что мне нужно убедиться, что правильная версия ruby ​​доступна для пользовательских www-данных, что я и сделал. У меня есть владельцы каталогов для rails_app, установленные для пользователя и группы на www-data, и разрешения, установленные на 775. Я вижу, что HTTP-запросы достигают nginx, просматривая журнал доступа. У меня есть настройки DNS для моего доменного имени rails_app.com, чтобы указать на AWS Elastic IP-адрес, который является Elastic 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

Вот мой единорог.рб:

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:

UPDATE 2 - В этом post сказано, что наличие $ uri / в try_files вызывает ошибку 403, потому что nginx не может вывести каталог. Поэтому я удалил $ uri / из try_files, и теперь я получаю ошибку 500, при этом ничего не отображается в журналах ошибок nginx или единорога. Есть идеи, как это отладить?

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, ни в файле журнала ошибок единорога.

Обновление 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. Добавил это и продолжаю отлаживать.

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

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

0 голосов
/ 10 апреля 2012

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

).

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

0 голосов
/ 08 февраля 2012

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

...