當我將瀏覽器指向「rails_app.com」時,我可以在EC2實例上查看rails_app/public/index.html,但是當我刪除rails_app/public/index .html我得到了nginx 403錯誤,在EC2上使用nginx +獨角獸服務Rails 3應用程序的問題
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的數據,我做到了。我將rails_app設置爲用戶和組的目錄所有者爲www-data,權限設置爲775.通過查看訪問日誌,我可以看到HTTP請求正在到達nginx。我爲我的域名「rails_app.com」設置了DNS設置,以指向AWS Elastic IP地址,這是我使用我的Rails應用運行nginx +獨角獸的EC2實例的彈性IP地址。
我想我解決了上面的403錯誤,如下面更新2所述。現在我得到一個500錯誤。我修正了500錯誤,如下面更新4所述。
我runnng 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 -這post,說有$ URI /在try_files導致403錯誤,因爲nginx的不能列出目錄。所以我從try_files中刪除了$ uri /,現在我得到一個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
當我嘗試用MySQL和使用before_fork運行我rails_app,after_fork以上代碼在我的麒麟。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。補充說,並繼續調試。
指出我在正確的方向。在我的情況下,我從try_files行中刪除了「$ uri /」,它工作。 – kervin 2013-08-09 02:41:23