Nginx $proxy_add_x_forwarded_for 實現多租戶判斷


背景:

在多租戶系統實現中,如下圖,由於租戶的服務器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;

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM