Nginx-5 Nginx 的4层反向代理
Nginx-5 Nginx 的4层反向代理
Nginx 的4层反向代理即指在 OSI 传输层(TCP、UDP)提供的反向代理。
stream 模块处理请求的7个阶段
不过需要注意的是,这与 http 11个处理阶段的方式有所不同,4层反向代理中没有 http 中的概念,自然也无法通过 header 传递 IP 地址,以及通过 limit request 限制请求数。
因此,4层反向代理使用 proxy protocal 来传递 IP 地址。
realip
功能:通过 proxy_protocal 协议取出客户端真实地址,并写入 remote_addr 及 remote_port 变量,同时使用 reaiip_remote_addr 和 realip_remote_port 保留 TCP 连接中的对端地址和端口。
模块:ngx_stream_realip_module ,需要通过 --with 指令手动编译进 nginx。
Limit conn
功能:限制客户端并发连接数
limit_conn_zone key zone=name:size;limit_conn zone number;limit_conn_log_level info|notice|warn|error;
access
功能:根据客户端地址决定连接访问权限
allow 127.0.0.1;
deny all;
UDP 的反向代理
透传 IP 地址
目的:使上游服务拿到真实的客户端 IP
方法:
- protocol 协议
- 修改 IP 报文
- IP 地址透传,仍由 nginx 转发给客户端
- DSR,上游服务直接转发给客户端(仅UDP)
IP 地址透传
- nginx 转发上游服务时修改源地址为客户端地址
- 上游服务配置网关地址为 nginx
- nginx 监听上游服务发的报文转发给真实的客户端 A
DSR 方案1
- nginx 转发上游服务时修改源地址为客户端地址
- 上游服务配置网关地址为 nginx
- nginx 直接配置源地址为上游服务的报文修改源地址为本级地址后转发(借助 Linux 内核)
DSR 方案2
- nginx 转发上游服务时修改源地址为客户端地址
- 上游服务直接发送响应给对应客户端
DSR 方案会有这样的问题:
- nginx 会检测不到上游服务是否回包,导致负载均衡策略(判断上游服务是否存活)受限