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