問題描述:
在Web分布式系統中,一般會搭建復雜的load blance系統來提供高性能的web服務。
load blance有4層網絡的,也有7層網絡的。再經過這樣的分布式網絡之后,后面真正提供服務的
程序可能會喪失掉client的網絡信息,也就是IP地址以及TCP端口。
解決方法:
為了解決這樣的問題,存在着這樣一種協議。叫做 Proxy Protocol。
正文
1. 協議實現
在三次握手之后,會增加一個TCP payload包,包payload長度48字節。如圖:
示例,如下圖所示的第四個包就是proxy protocol的包。
payload格式,根據V1,V2兩個版本有所不同。如下是V1版本,是ASCII碼格式:
PROXY TCP4 202.112.144.236 10.210.12.10 5678 80\r\n PROXY TCP6 2001:da8:205::100 2400:89c0:2110:1::21 6324 80\r\n PROXY UKNOWN\r\n
V2的略。(可參考文后的鏈接)
2. nginx proxy的配置方法
stream { server { listen 12345; proxy_pass backend.example.com:8080; proxy_protocol on; } }
3. nginx server的配置方法
http { log_format elb_log '$proxy_protocol_addr'; server { listen 8080 proxy_protocol; root /usr/local/nginx/html; index index.html index.htm; server_name hello-world.com; set_real_ip_from 192.168.10.0/24; real_ip_header proxy_protocol; } location / { try_files $uri $uri/ /index.html; proxy_pass http://backend.example2.com:8088; proxy_set_header X-Forwarded-For $proxy_protocol_addr; } access_log /usr/local/nginx/stream.log elb_log; }
參考資料:
https://www.jianshu.com/p/cc8d592582c9