nginx 反向代理场景
客户端 A,ip为 A_ip,端口为 A_random_port
反向代理 B,ip 为 B_ip ,监听端口为固定的 443
后端 C,ip 为 C_ip ,监听端口为固定的 443
以一条反向代理连接为例,链路为:
A_ip: A_random_port ----- B_ip:443 ----- B_ip:B_random_port ---- C_ip:443
A:A_random_port ---- B1:443 ---- B2:B_random_port ---- C:443
B1 和B2 ip 相同,监听的端口不同
B1 监听固定端口443,B2监听的是一个随机端口
具体一点:
192.168.1.101:12345 <----> 192.168.1.102:443 <----> 192.168.1.102:45678 <---> 192.168.1.103:443
A是纯粹的客户端 ;B既作为A的服务端,又作为C的客户端;C纯粹的服务端。
B 作为 C的客户端,发起socket连接时,会向反向代理服务器内核申请注册一个空闲的随机端口。
A:A_random_port ---- B1:443 和 B2:B_random_port ---- C:443 这两段链路socket好理解。
但是 B1:443 ---- B2:B_random_port 这段链路 nginx反向代理 是怎么实现的?
对nginx来说就是同一块内存,后面的链接的直接从前面那段链接的结尾的内存地址开始读。
首先上下游都建立好tcp链接,然后上游收到一个报文后会把报文头去掉,把payload临时存到一个地方,然后有个指针指向该内存,接着就会构筑往后发送的报文头,从该指针获取内容,拼接成一个往后发的报文,然后发出去。
image.png
nginx中两个模块有proxy_pass指令,用于反向代理配置项,分别是:
ngx_http_proxy_module
ngx_stream_proxy_module
ngx_http_upstream_module
nginx + vip 反向代理场景
nginx + keepalived,实现反向代理的高可用
image.png用户公网IP:随机端口 ----> www.example.com:20080----(NAT)-->outer_nginx_vip:20080 ----> nginx01_ip:随机端口 -----> upstream:20080
跟没有vip 的代理链路比,outer_nginx_vip:20080 ----> nginx01_ip:随机端口 这段链路ip有了变更,跟后端交互时并不是使用物理nginx01_ip,而是使用虚拟的outer_nginx_vip,这跟keepalived的网络实现有关,当然此处outer_nginx_vip 和nginx01_ip 是同一个mac地址。
参考
tcp四次挥手状态 TIME_WAIT
https://www.jianshu.com/p/3658730d76d7
How to view and edit the ephemeral port range on Linux?
https://stackoverflow.com/questions/28573390/how-to-view-and-edit-the-ephemeral-port-range-on-linux
nginx使用proxy_bind负载tcp socket,解决代理端口耗尽
https://b.sundayle.com/nginx-proxy-65535-port
如何解决使用nginx作为反向代理端口耗尽问题?
https://blog.csdn.net/michaelwoshi/article/details/120170134
Overcoming Ephemeral Port Exhaustion in NGINX and NGINX Plus
https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus
网友评论