我有一个使用Unicorn托管的Sinatra应用程序,并且前面有nginx。当Sinatra应用程序出错(返回500)时,我想提供一个静态页面,而不是默认的“内部服务器错误”。我有以下nginx配置:
server {
listen 80 default;
server_name *.example.com;
root /home/deploy/www-frontend/current/public;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_pass http://127.0.0.1:4701/;
}
error_page 500 502 503 504 /50x.html;
}
error_page指令在那里,我已经sudo'd作为www-data(Ubuntu)并且验证了我可以cat
该文件,因此它不是权限问题。使用上面的配置文件和service nginx reload
,我收到错误的页面仍然是“内部服务器错误”。
我的错误是什么?
答案 0 :(得分:75)
error_page
处理由nginx生成的错误。默认情况下,无论http状态代码如何,nginx都将返回代理服务器返回的内容。
您正在寻找的是proxy_intercept_errors
该指令决定nginx是否会拦截HTTP响应 状态代码为400或更高。
默认情况下,所有响应都将按原样从代理服务器发送。
如果将此设置为on,则nginx将拦截状态代码 由error_page指令显式处理。回复状态 与error_page指令不匹配的代码将按原样发送 来自代理服务器。
答案 1 :(得分:16)
您可以为该位置设置proxy_intercept_errors
location /some/location {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_pass http://127.0.0.1:4701/;
proxy_intercept_errors on; # see http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
error_page 400 500 404 ... other statuses ... =200 /your/path/for/custom/errors;
}
您可以在其他情况下设置200所需的状态
答案 2 :(得分:4)
使用FastCGI作为其上游的人需要打开此参数
fastcgi_intercept_errors on;
对于我的PHP应用程序,我在上游配置块中使用它
location ~ .php$ { ## Execute PHP scripts
fastcgi_pass php-upstream;
fastcgi_intercept_errors on;
error_page 500 /500.html;
}
答案 3 :(得分:0)
正如Stephen in this response所提到的,使用public class LoggedSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
protected override bool ShouldRetryOn(Exception exception)
{
var shouldRetry = base.ShouldRetryOn(exception);
if (shouldRetry)
{
// log exception
}
return shouldRetry;
}
}
可以正常工作。
虽然在我的情况下,如in this answer所示,使用proxy_intercept_errors on;
做了诀窍......