Nginx捕获并自定义proxy_pass返回错误
需求
实际情况:
后端图片存储服务对接华为存储,把数据写在华为上。
上级会不定时的对图片进行抽查考核,要求5s内必须返回数据,但是图片服务不定时会挂掉,由于代码年代久远已无人维护,只好在图片服务前端再部署个nginx,通过proxy_pass代理后端服务,当后端返回404或5xx错误时,对proxy_pass进行捕获,实现自定义输出。
解决方法
upstream DGIMediaServer { server 172.24.49.xxx:6551 fail_timeout=3s; } server { listen 8888; server_name _; root html; sent_timeout 5s; #将下面几个错误码跳转到/200.jpg error_page 404 500 502 =200 /200.jpg; location = /200.jpg { root html; } location / { #使用自定义捕获,不开启则无法捕获proxy_pass的错误 proxy_intercept_errors on; #连接服务器超时设置 proxy_connect_timeout 3s; #发送数据超时设置 proxy_send_timeout 3s; #返回数据超时设置 proxy_read_timeout 3s; #自定义错误处理 error_page 404 500 502 503 504=200 /200.jpg; } index index.html index.php; charset UTF-8; }
Nginx的proxy_pass、root、alias的说明
代理配置
1、root
root配置代理路径时,会在代理的地址后拼接配置字段:
location /static { root static/image; }
在访问http://ip:port/static/*.*时会映射到http://ip:port/static/static/image/*.*
2、alias(只能用于location)
alias配置代理路径时,直接替换代理地址:
location /static { alias static/image; }
在访问http://ip:port/static/*.*时会映射到http://ip:port/static/image/*.*
3、proxy_pass
proxy_pass配置代理路径时,直接替换整个代理路径,包括ip地址的端口等:
location /static { proxy_pass http://ip_two:port_two/static; }
在访问http://ip:port/static/*.*时会映射到http://ip_two:port_two/static/static/*.*
- 代理路径后不带斜杠时,配置路径会替代原本的ip和端口等,并拼接代理地址。
- 代理路径后带斜杠时,配置路径会替代原本的ip和端口等,不拼接代理地址。
location /static/ { proxy_pass http://ip_two:port_two/abc/; }
在访问http://ip:port/static/*.*时会映射到http://ip_two:port_two/abc/*.*
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。