Nginx自定义错误页面

2024-09-20 22:00:00
丁国栋
原创 83
摘要:Nginx允许自定义错误页面,如果服务异常了,就可以显示友好的错误页面。如果是Nginx的服务是通过反向代理的方式提供的,需要在反向代理配置中添加一个特殊的指令 proxy_intercept_errors on; 这句指令的意思是如果上游服务的HTTP响应代码大于或等于300时,决定是否将响应代码发送给客户端或者决定是否拦截并重定向到nginx进行错误页面指令error_page处理。默认是关闭的,只有设置为启用才可以在上游服务异常时Nginx做出拦截,接管这些错误。

Nginx有一个检测服务(无论服务的方式是CGI还是代理)是否异常的功能,允许自定义错误页面,这样如果Nginx配置的服务异常了,就可以显示友好的错误页面,例如接管 404、500、502等非正常响应。


要想做到这一点,有两点需要注意:

  1. 如果是Nginx的服务是通过反向代理的方式提供的,那么需要在反向代理配置中添加一个特殊的指令 proxy_intercept_errors on; 这句指令的意思是如果上游服务的HTTP响应代码大于或等于300时,决定是否将响应代码发送给客户端或者决定是否拦截并重定向到nginx进行错误页面指令error_page处理。默认是关闭的,只有设置为启用才可以在上游服务异常时Nginx做出拦截,接管这些错误。
  2. 某些Web应用程序或服务在捕获到错误时,HTTP响应代码还是200,并不是大于300的响应代码。这里需要注意一下,如果上游服务依然给出响应,Nginx还是不会接管这些错误,而是直接发送到客户端。但如果后端服务无响应、超时、无法连接这些异常时Nginx是可以接管的。


示例:

  location / {
    proxy_pass https://upstream-service;
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 3m;
    proxy_send_timeout 3m;
    proxy_read_timeout 3m;
    client_max_body_size 0; # Stream request body to backend
    proxy_intercept_errors on;
    error_page 500 502 /500.html;
  }
  location = /500.html {
    root /var/www/html; # 500.html 需要放到该目录下
    internal;
  }

如果使用的并不是反向代理,比如典型的Nginx + FastCGI,Nginx + uwscgi 等就可以直接使用error_page指令。


root /var/www/html/;
error_page 500 502 /500.html;
--


发表评论
博客分类