MENU

使用nginx的proxy_next_upstream遇到的问题

2018 年 06 月 29 日 • 杂乱文章

下午,部署了一套项目,在使用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"}';
       }
最后编辑于: 2019 年 05 月 06 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码