nginx没有提供我的error_page

时间:2012-01-03 16:10:20

标签: nginx custom-error-pages

我有一个使用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,我收到错误的页面仍然是“内部服务器错误”。

我的错误是什么?

4 个答案:

答案 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;做了诀窍......