NGINX作为反向代理时504网关超时重定向配置方法
解决NGINX代理GlassFish超时(504)时重定向到CDN的配置方案
我来帮你搞定这个NGINX超时重定向的问题!你现在的情况是已经处理了GlassFish返回的50x错误,但超时触发的504网关超时没被覆盖,其实只要调整error_page的配置,加上对504的捕获,再配合命名location就能解决,和你处理404的逻辑完全一致。
核心配置思路
- 先设置合理的代理超时参数(这是触发504错误的前提)
- 用
error_page指令同时捕获500/502/503/504错误,指向自定义的重定向逻辑 - 开启
proxy_intercept_errors让NGINX能拦截并处理后端返回的错误码
修改后的完整Server配置片段
server { listen *:80; # 保留你原有的其他配置(比如server_name、日志路径等) # 第一步:设置代理超时参数(根据业务需求调整时间,单位可选s/ms) proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; # 第二步:定义统一的错误重定向逻辑(和你现有的@redir_404格式一致) location @redir_error_to_cdn { # 替换成你的CDN目标地址,$request_uri会保留原请求路径,确保资源匹配 return 302 https://your-cdn-domain.com$request_uri; # 若需永久重定向可改用301,建议临时场景用302 } # 第三步:代理GlassFish的核心配置块(根据你的实际路径调整location) location / { proxy_pass http://your-glassfish-server:8080; # 替换成你的GlassFish地址和端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 关键:捕获所有50x错误(包括超时导致的504),跳转到自定义重定向逻辑 error_page 500 502 503 504 = @redir_error_to_cdn; # 必须开启这个指令,否则NGINX会直接把后端的错误码返回给客户端,error_page不生效 proxy_intercept_errors on; } # 保留你原有的404重定向配置(如果有的话) # location @redir_404 { # return 302 https://your-cdn-domain.com/404-fallback.html; # } }
关键配置说明
proxy_intercept_errors on;:默认NGINX会直接透传后端返回的错误码给用户,开启这个指令后,NGINX才会用error_page定义的规则处理这些错误。- 超时参数:
proxy_read_timeout是最关键的,它定义了NGINX等待后端响应的最长时间,超过这个时间就会返回504,你可以根据GlassFish的业务响应时间调整。 $request_uri变量:能保留用户原请求的路径和参数,比如用户请求/static/js/main.js,重定向后会指向CDN的对应路径,确保资源匹配。
测试建议
你可以故意让GlassFish超时(比如在后端接口加延迟),然后用curl -v http://你的域名/test-path测试,看是否会跳转到CDN地址。如果测试不生效,可以检查NGINX的错误日志(一般在/var/log/nginx/error.log),排查是否是超时参数设置过长,或者代理地址配置错误。
内容的提问来源于stack exchange,提问作者JUP
相关产品推荐
相关产品推荐

