背景
開發有一個服務部署在阿里云上,依賴阿里云的CLB(傳統型負載均衡)暴露服務,因特殊要求,CLB和后端服務之間需要通過自建Nginx做代理,拓撲圖如下,
應用拓撲
操作
客戶端的請求經過了兩層代理,這里CLB和Nginx都要做配置。
1,配置CLB
CLB的配置比較簡單,在配置“監聽”時,要附加“X-Forwarded-For”HTTP頭字段
附加X-Forwarded-For HTTP頭字段
大多數情況下,并沒有CLB這層代理,但加入這層后,我們對后面知識的理解將更加透徹。
2,nginx配置
直接上配置文件,
server {listen 80;server_name www.example.com;set_real_ip_from 100.64.0.0/10;real_ip_header X-Forwarded-For;access_log /data/logs/nginx/access.log;error_log /data/logs/nginx/error.log;location / {proxy_pass http://10.x.x.x:12345; //后端服務地址proxy_set_header Host $host;proxy_set_header X-REAL-IP $remote_addr;allow 120.79.x.x/32; //對外服務,做好限制deny all;
實現將客戶端的真實IP傳遞給后端服務,依賴這三行,
set_real_ip_from 100.64.0.0/10;real_ip_header X-Forwarded-For;proxy_set_header X-REAL-IP $remote_addr;
知識
因為有阿里CLB和Nginx兩層代理,需要用“set_real_ip_from”來輔助取得客戶的真實IP,該選項后面的IP是第一層代理即CLB的IP,可以從Nginx訪問日志中得到(在未配置選項“set_real_ip_from”的情況下),下圖中第一列就是CLB的IP,因為阿里云CLB的IP隨時變動,配置中用了IP段的方式。
nginx的訪問日志
“real_ip_header X-Forwarded-For”,含義是使用HTTP頭部域“X-Forwarded-For”的值作為客戶端的IP,如果沒有配置選項“set_real_ip_from”,該值將是CLB的IP。
“proxy_set_header X-REAL-IP $remote_addr”,Nginx設置發送到后端服務的HTTP請求頭X-REAL-IP,值為變量“remote_addr”的值,即客戶端的真實IP。
最后說明一下,HTTP請求頭“X-Forwarded-For”的格式如下:
X-Forwarded-For: , ,
最左邊的值是客戶端的IP,后面的值是代理服務器的IP,時間順序上,最右邊的代理IP是最后訪問的代理。這也就是為什么我們要加入選項“set_real_ip_from”的原因。