使用nginx的proxy_next_upstream遇到的问题
下午,部署了一套项目,在使用nginx做代理的时候遇到了点问题,使用ngx_http_proxy_module
模块的proxy_next_upstream
指令,这个指令干嘛的就不多BB了,我设置了timeout 、error、503、会自动转发到另一个节点,配置文件如下。
location / {
proxy_set_header Host $host;
proxy_pass http://www_server1_plools;
proxy_next_upstream error timeout http_503;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
因为是有一个项目比较特殊,在有些特定情况下会直接返回503,而在他返回503的时候就需要将请求转发的其他节点,配置完之后我手动试了一下可以,是没有问题的,返回503,让后让我同事调用了一下接口,返回的直接是502了,而且看log请求也没有被转发到别的节点,没图,因为现在已经开始跑了,最后的最后发现我发的是GET请求,而调用接口发的是POST请求,而nginx默认不转发POST,官方原文。
non_idempotent
normally, requests with a non-idempotent method (POST
, LOCK
, PATCH
) are not passed to the next server if a request has been sent to an upstream server (1.9.13); enabling this option explicitly allows retrying such requests;
所以加上non_idempotent
参数就可以了。
proxy_next_upstream error timeout http_503 non_idempotent;
然后把全部代理的服务器都加了一下,之前居然没发现这个问题@(喷)
nginx错误页面返回json
需求是除了404页面,其他的错误页面都要返回json,而且在外界看来是正常的,所以说白了就是后端服务器返回了我定义的错误状态码,需要在nginx这里做一个转换,转换到200,用户看到的是200,其实!=200,这事我几乎没插手,开发的大哥搞定的,大概是酱紫。
error_page 503 502 500 504 501 =200 /error.json;
location = /error.json{
default_type application/json;
return 200 '{"retCode":"1001","retMsg":"invoke failed"}';
}
第四行是一个返回json的数据,可以自己定义,还有就是反向代理默认不支持自定义错误页面,所以还要加个参数。
proxy_intercept_errors on;
附完整域名location
location / {
proxy_intercept_errors on;
proxy_set_header Host $host;
proxy_pass http://www_server3_plools;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_503 non_idempotent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 =200 /error.json;
location = /error.json{
default_type application/json;
return 200 '{"retCode":"1001","retMsg":"invoke failed"}';
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。