2012-01-30 88 views
3

當我將瀏覽器指向「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。補充說,並繼續調試。

回答

1

終於搞定了。最後一個問題是,Unicorn抱怨沒有「/」路線。運行'bundle exec rake routes'不會產生任何結果。一旦'捆綁執行耙路線'產生的路線,如解釋here,然後網站出現。

+1

指出我在正確的方向。在我的情況下,我從try_files行中刪除了「$ uri /」,它工作。 – kervin 2013-08-09 02:41:23

0

在我看來,未能在配置文件中設置「preload_app true」可能觸發此操作。

+0

dmw - 你說什麼是由代詞 - 這個 - 在你的句子結尾?當我包含before_fork和after_fork代碼時,我確實在我的unicorn.rb配置文件中有preload_app true,並且我仍然在connection_pool.rb中收到ConnectionNotEstablished錯誤。 – 2012-02-08 03:10:53

+0

是的,這就是我所指的。由於preload_app對你來說是真的,顯然這個問題有不同的原因。 – dmw 2012-02-08 04:17:32

0

我得到同樣的問題。我實際上可以通過從應用程序目錄($ rails s)運行webrick,然後在端口3000(http://example.com:3000)打我的服務器來臨時解決它。

p.s. unicorn.log文件應該循環/滾動而不停止?當我沒有擊中應用程序時,看起來很奇怪。

相關問題