美文网首页
关于nginx负载转发POST

关于nginx负载转发POST

作者: BoatingTao | 来源:发表于2025-05-16 15:23 被阅读0次

笔者上次进行了GET请求的负载转发,默认是支持的。不需要额外的设置,这次再测试下POST请求。详细观察下文。

两个server端,还是A/B区域。

# server A端
import json

import uvicorn
import datetime
import asyncio

from fastapi import FastAPI, Request
from pydantic import BaseModel

class CountDemo(BaseModel):
    count: int

app = FastAPI()

SERVER_NAME = "A"

@app.get("/get-test")
async def read_root():
    return {
        "Server": SERVER_NAME,
        "Method": "GET",
        "Time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }

@app.post("/post-test")
async def read_root(count_demo: CountDemo):
    return {
        "Server": SERVER_NAME,
        "Method": "Post",
        "Time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "Count": count_demo.count + 1
    }

if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=9090, log_level="info")

请求A端服务,响应A


image.png

请求B端服务,响应B


image.png

GET请求,调用接口还是雨露均沾。这里不配置负载策略,默认轮询。


image.png

Nginx日志打印的负载节点也是A/B分布


image.png

如果某个后端节点响应超时或连接超时,nginx会自动将请求转发给另一个节点。这里直接我们在服务A里面对每个接口都进行sleep操作,模拟一下超时响应。

客户端可以看到所有请求都正常转发,全给了B节点


image.png

Nginx日志可以看到发送给A节点的请求响应504了,后续自动转发给了B节点


image.png

如果客户端进行POST请求,Nginx在转发给节点A的时候504了,不会在转发给节点B


image.png

Nginx这样做的目的也是为了防止后端业务发生异常,因为POST是非幂等请求。如果转发给A节点等到超时又继续转发给B节点,就会出现A/B节点都执行同一个POST动作,而这个动作可能都会对数据库进行操作,造成业务问题。

如果Nginx配置,可以实现POST也继续转发给另一个节点的操作。

# 在location块内添加这个指令
proxy_next_upstream error timeout http_504 non_idempotent;
image.png

如果只认为配置 proxy_next_upstream error timeout http_504; 就能万事大吉,也不是,必须得加上 non_idempotent 整个POST转发才能生效。经过笔者测试,这几个参数是一整套,必须规定一个异常,可以是error,可以是timeout,或者具体的状态码,然后在配合 non_idempotent 参数进行强制转发。

蛋疼的是这几个参数的组合非常麻烦,笔者建议都配上。

proxy_next_upstream http_504 non_idempotent;
# 转发给B节点不生效
proxy_next_upstream error http_504 non_idempotent;
# 转发给B节点不生效
# 
proxy_next_upstream timeout non_idempotent;
# 转发给B节点生效

网上的资料大部分也是都进行了配置

proxy_next_upstream error timeout http_504 non_idempotent;

这里值得注意的是,要配置就配置完善。否则连GET也会失效。

笔者测试:
假设A服务因为某些原因直接停调,而我们只配置了超时转发。proxy_next_upstream timeout non_idempotent;
也就是只有超时才进行转发,那这时候无论GET、POST都不会转发。笔者实测也是如此。

因此如果要对 proxy_next_upstream 指令进行配置,可以进行详细的配置。

没有特殊需求,笔者不建议配置 proxy_next_upstream 指令。

如果需要详细探究这个指令的内容,需要比较复杂情况的测试,可以结合Nginx源码进行参考比较好。

相关文章

  • Nginx杂谈

    nginx可以作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至tomcat服务...

  • 负载均衡与集群的区别和联系

    一、关于负载均衡和集群的概念(区别) 负载均衡:服务器A,比如做了Nginx处理,通过服务器A端口88均衡转发(请...

  • Zuul和Nginx区别

    Nginx是采用服务器实现负载均衡进行转发。 Zuul是通过eureka和ribbon进行本地负载均衡转发。 Zu...

  • Nginx负载 转发到swoole服务器

    Nginx负载 转发到swoole服务器 nginx服务器conf文件中代码如下: 通过 if (!-e $req...

  • 负载均衡之lvs

    1.负载均衡 VS 反向代理区别 1.1 功能(原理) 负载均衡 lvs 请求做转发 反向代理 Nginx Hap...

  • 线上nginx的一次“no live upstreams whi

    抄来的,做下记录 先描述一下环境,前段的负载均衡转发给nginx,nginx再转发给后端的应用服务器。 nginx...

  • Linux搭建nginx负载均衡集群

    负载均衡通过 nginx 配置反向代理实现,这样我们只需要访问 nginx 即可,由 nginx 决定在内部转发到...

  • Linux运维-day56/57-负载均衡之lvs

    一、负载均衡与反向代理的区别 1.1 功能(原理) 负载均衡lvs---请求做转发 反向代理Nginx Hapro...

  • 负载均衡与lvs

    一、负载均衡与反向代理的区别 1.1 功能(原理) 负载均衡lvs---请求做转发 反向代理Nginx Hapro...

  • 深度系统的web应用环境搭建

    nginx+uwsgi环境nginx最初被用为端口转发,可以用于负载均衡,静态文件的代理sudo apt-get ...

网友评论

      本文标题:关于nginx负载转发POST

      本文链接:https://www.haomeiwen.com/subject/ntgwijtx.html