1

我有一個使用Nginx和Unicorn生產的Rails 3.1應用程序。由於某些原因,我的自定義404和500 html錯誤頁面未顯示。相反,我得到了實際的錯誤信息(例如「路由錯誤」)。顯示在生產中的錯誤消息 - Ruby on Rails 3.1,Nginx,Unicorn

在我production.rb文件,我有config.consider_all_requests_local = false

並配有幾乎相同的配置在同一臺服務器上,我有一個「臨時」的網站,工作得很好。據我所知,唯一的區別是生產者具有SSL,而分段則不具有SSL。

這裏是Nginx的配置生產應用:

upstream unicorn_myapp_prod { 
    server unix:/tmp/unicorn.myapp_prod.sock fail_timeout=0; 
} 

server { 
    listen 80; 

    server_name myapp.com; 

    root /home/deployer/apps/myapp_prod/current/public; 

    location ^~ /assets/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    } 

    try_files $uri/index.html $uri @unicorn; 
    location @unicorn { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://unicorn_myapp_prod; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 


server { 
    listen 443 default; 
    ssl on; 
    ssl_certificate /home/deployer/apps/myapp_prod/shared/ssl_certs/myapp_prod.crt; 
    ssl_certificate_key /home/deployer/apps/myapp_prod/shared/ssl_certs/myapp_prod.key; 


    server_name myapp.com; 

    root /home/deployer/apps/myapp_prod/current/public; 

    location ^~ /assets/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    } 

    try_files $uri/index.html $uri @unicorn; 
    location @unicorn { 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://unicorn_myapp_prod; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 

任何想法?謝謝!

+0

您是否確定使用選項'-E production'開始生產站點的Unicorn進程,如在$ APP_ROOT/bin/unicorn -D -c $ APP_ROOT/config/unicorn.rb -E production中爲例? – emrass

+0

是的,該應用程序肯定是在生產模式下運行。 –

+0

您是否在'production.rb'文件中指定了'config.force_ssl = true'? – Jef

回答

2

https監聽者的location @unicorn塊缺少X-Forwarded-For指令。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

它在你的http偵聽器中,但不在HTTPS監聽器中。

假設Rails的force_ssl正在成功地重定向所有的http請求,並且您唯一的錯誤發生在https請求上,似乎可以解釋它。

另外,非常清楚的是,在Rack/Rails3中有一個關於路由錯誤的問題,您特別提到。

https://rails.lighthouseapp.com/projects/8994/tickets/4444-can-no-longer-rescue_from-actioncontrollerroutingerror

+0

使用$ proxy_add_x_forwarded_for給我重定向錯誤,但使用$計劃工作。謝謝! –

0

不知道這是適用的,但我們也有error_page線後,我們的nginx的配置一個鏈接,處理/500.html頁的位置

位置= /500.html {root/path/to/rails/app/public; }

顯然將您的路徑替換爲Rails應用程序部分的路徑。

2

如果您將haproxy與nginx和獨角獸一起使用(例如您在Engineyard上),則此修復程序將不夠。你需要重寫的Rails與東西這樣的:

class ActionDispatch::Request 
    def local? 
    Rails.env != 'production' 
    end 
end 

祝你好運!

相關問題