[英]Error Messages Showing in Production - Ruby on Rails 3.1, Nginx, Unicorn
我有一个使用Nginx和Unicorn在生产中运行的Rails 3.1应用程序。 由于某种原因,我的自定义404和500 html错误页面没有显示。 相反,我得到实际的错误消息(例如,“路由错误”)。
在我的production.rb文件中,我有config.consider_all_requests_local = false
在具有几乎相同配置的同一台服务器上,我有一个“暂存”网站,工作得很好。 据我所知,唯一的区别是生产者有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;
}
有任何想法吗? 谢谢!
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中存在一个关于路由错误的众所周知的问题,您特别提到。
如果你正在使用haproxy以及nginx和unicorn(例如你在Engineyard),这个修复是不够的。 你需要重写Rails的像这样的东西 :
class ActionDispatch::Request
def local?
Rails.env != 'production'
end
end
祝好运!
不确定这是否适用但我们的nginx配置中有一个链接在error_page行之后处理/500.html页面的位置
location = /500.html {root / path / to / rails / app / public; }
显然用您的路径替换rails应用程序部分的路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.