背景:
在多租戶系統實現中,如下圖,由於租戶的服務器IP是固定的,租戶服務器直接訪問管理台Nginx,其IP在Nginx是可視的,可以通過 \$remote_addr 直接取到,當然如果已經配置了 \$host 也可根據 \$host 的值判斷請求來自於哪個租戶服務器,實現動態設置租戶號。
實施中,出於安全考慮,在租戶服務器和管理台服務中添加一層中轉服務(Nginx),但是這樣的話,租戶服務器的IP對於管理台Nginx就不是可見的了,管理台Nginx讀取到的 \$remote_addr 值為中轉Nginx的IP,Nginx中 \$proxy_add_x_forwarded_for 可以實現Nginx間的值傳遞,所以對其進行部分修改。
測試環境請求流轉如下:
租戶A(36.0.15.16)請求——>中轉nginx所在服務器(36.10.8.44)——>管理台nginx所在服務器(36.10.10.118)——>后台服務
步驟:
中轉服務器(36.10.8.44)添加如下配置,賦值客戶端ip
location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://36.10.10.118:9015; }
2. 管理台(36.10.10.118)添加如下配置,根據客戶端ip進行設置租戶號
server { listen 9015; server_name localhost; client_max_body_size 30M; #set $tenantId "815"; if ($http_x_forwarded_for = "36.0.15.16") { set $tenantId "815"; } access_log /oscf/log/gateway-web-access.log; error_log /oscf/log/gateway-web-error.log; location ^~ /api/v4/ { proxy_http_version 1.1; proxy_set_header Connection ""; #limit_req zone=mylimit burst=30 nodelay; #limit_req_status 598; proxy_next_upstream http_404 http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://zeus.admin.web/; proxy_set_header tenant-id $tenantId; proxy_buffer_size 64k; proxy_buffers 4 256k; proxy_busy_buffers_size 512k; proxy_connect_timeout 75; proxy_send_timeout 12000; proxy_read_timeout 12000; }
}
3. 36.0.15.16服務器模擬訪問
4.多租戶判斷
后續增加其他租戶,在管理台nginx進行判斷設置即可,方法如下:
server { listen 9015; server_name localhost; client_max_body_size 30M; if ($http_x_forwarded_for = "36.0.15.16") { set $tenantId "815"; } if ($http_x_forwarded_for = "36.0.15.17") { set $tenantId "816"; } access_log /oscf/log/gateway-web-access.log; error_log /oscf/log/gateway-web-error.log; location ^~ /api/v4/ { proxy_http_version 1.1; proxy_set_header Connection ""; #limit_req zone=mylimit burst=30 nodelay; #limit_req_status 598; proxy_next_upstream http_404 http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://zeus.admin.web/; proxy_set_header tenant-id $tenantId; proxy_buffer_size 64k; proxy_buffers 4 256k; proxy_busy_buffers_size 512k; proxy_connect_timeout 75; proxy_send_timeout 12000; proxy_read_timeout 12000; }