Когда я указываю свой браузер на «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. Добавил это и продолжай отлаживать.