一、常見內置變量
內置變量 | 說明 |
---|---|
$uri | 請求的URL,不包括主機和參數 |
$request_uri | 請求的URL,包括主機和參數 |
$host | 請求的主機名 |
$http_user_agent | 客戶端信息,瀏覽器和操作系統 |
$remote_addr | 客戶端IP地址 |
$remote_port | 客戶端端口 |
$server_addr | 服務端IP地址 |
$server_port | 服務端端口 |
$request_method | 請求方式 |
$scheme | 請求協議 |
$request_filename | 請求的資源路徑 |
$doucument_root | 請求的資源根目錄 |
X-Real-IP | 客戶端的真實IP地址 |
X-Forwarded-For | 客戶端IP地址和代理IP地址 |
二、代理
代理是客戶端和服務端的中間人,客戶端通過代理訪問服務端。代理又分為正向代理和反向代理。從網絡參考模型的角度來看,正向代理屬于七層代理,反向代理包括四層代理和七層代理。
四層代理和七層代理的區別:
- 四層代理是基于TCP的代理轉發,基于IP地址和端口的形式實現代理。四層代理無法獲取HTTP請求中的URL信息,只能進行數據轉發。四層代理是由內核進行轉發,速度更快。
- 七層代理是基于HTTP的代理轉發,可以處理HTTP的請求和響應,收到HTTP請求后,會根據代理方式將HTTP請求轉發到服務端。可以對HTTP請求進行分析、處理,對請求內容做路由、流量控制、內容過濾等。七層代理是基于應用層代、用戶態處理,速度較慢,但是更加安全可靠。
目前能夠同時進行四層代理和七層代理的應用只有Nginx、Haproxy。
1. 正向代理
正向代理需要對請求進行處理,屬于七層代理。正向代理是面向客戶端的,代理客戶端、隱藏客戶端。客戶端想要訪問網頁,但是無法直接訪問,可以通過正向代理訪問。服務端只知道代理IP地址,不知道客戶端IP地址;客戶端知道代理和服務端的IP地址。
1.1 固定地址正向代理
-
新增一個Nginx的server模塊,具體配置如下。
server {listen 8888;server_name localhost;# 設置DNS解析地址resolver 218.2.135.1 valid=300 ipv6=off;# 設置解析服務超時時間resolver_timeout 3s;# 設置代理服務器讀取數據超時時間proxy_read_timeout 30s;# 設置代理服務器發送數據超時時間proxy_send_timeout 30s;# 設置代理服務器連接服務端超時時間proxy_connect_timeout 30s;# 固定代理地址set $url "www.baidu.com";location / {# 請求轉發proxy_pass http://$url;# 正向代理緩存配置# 設置緩沖區的個數和單個大小proxy_buffers 256 4k;# 不保存響應數據的臨時文件,防止文件過多proxy_max_temp_file_size 0;# 狀態碼是200和302的緩存有效期是1分鐘proxy_cache_valid 200 302 1m;# 狀態碼是301的緩存有效期是1小時proxy_cache_valid 301 1h;# 其他狀態碼的緩存有效期是1分鐘proxy_cache_valid any 1m;} }
-
保存文件后,檢查配置語法是否存在問題,重啟Nginx服務。
nginx -t systemctl restart nginx
-
在主機的瀏覽器中輸入本機IP和端口,或者使用curl命令獲取網頁,查看是否實現正向代理。
curl 192.168.1.128:8888
1.2 變化地址正向代理
-
新增一個Nginx的server模塊,具體配置如下。
server {listen 8889;resolver 218.2.135.1;resolver_timeout 3s;location / {# 自動設置代理的請求地址proxy_pass $scheme://$http_host$request_uri;# 在請求頭中傳遞客戶端的host信息proxy_set_header Host $http_host;# 設置客戶端請求中包含真實IP地址proxy_set_header X-Real-IP $remote_addr;# 設置客戶端經過的代理地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 傳遞客戶端請求的協議信息proxy_set_header X-Forwarded-Proto $scheme;# 傳遞客戶端的主機名proxy_set_header X-Forwarded-Host $host;# 傳遞客戶端的請求端口proxy_set_header X-Forwarded-Port $server_port;proxy_buffers 256 4k;proxy_max_temp_file_size 0;proxy_cache_valid 200 302 1m;proxy_cache_valid 301 1h;proxy_cache_valid any 1m;} }
-
保存文件后,檢查配置語法是否存在問題,重啟Nginx服務。
nginx -t systemctl restart nginx
-
使用curl命令通過傳參的方式獲取網頁,查看是否實現正向代理。
# curl -x 代理URL 目標URL curl -x 192.168.1.128:8889 www.baidu.com
2. 反向代理
反向代理包含四層代理和七層代理,代理服務端、隱藏服務端。客戶端向代理發起請求,代理根據一定的策略(負載)將請求發送到服務端。客戶端不知道請求的服務端具體IP,代理服務器隱藏了服務端具體的IP地址。
負載均衡是一種流量分發機制,根據算法將流量分發到不同的后端服務器,以實現服務端的高可用,也就是備災。
負載均衡的常見算法:
- 輪詢:負載均衡默認算法,會將請求輪流分發給后端服務器,適用于后端服務器處理能力相近時。
- 加權輪詢:根據后端服務器的處理能力賦予不同的權重,處理能力高的服務器權重高,處理能力低的服務器權重低。流量高峰時期可以實現流量分發優化,適用于后端服務器處理能力差異大時。
- IP Hash:請求后端服務器,會使用Hash算法計算出IP地址的Hash值,然后再把請求發送到對應的后端服務器。如果客戶端IP地址一致,下一次的請求會再次發送到對應的服務端,保證會話的穩定。因此要實現會話保持可以使用ip Hash算法。
- 最小鏈接數:將請求發送到當前連接較少的后端服務器,這種算法適用于后端服務器處理任務耗時不同的情況,可以有效避免請求集中在處理能力更強的后端服務器。
- URL Hash:根據URL路徑來計算Hash值,請求的URL路徑相同,客戶端的請求會被發送到同一臺服務器上。
負載均衡的特點:
- 根據算法將流量分發給不同的后端服務器。
- 客戶端訪問的是代理地址,響應也是來自代理服務器。
- 客戶端不了解后端服務器情況,不知道具體的IP地址。
- 提高了安全性,后端服務器是隱藏的。
- 負載均衡是有緩存的,可以直接訪問緩存,提高響應速度。
2.1 七層反向代理
七層反向代理使用upstream語法,配置在http模塊中,進行請求中的HTTP處理。
-
輪詢基本配置。
在http模塊中定義一個upstream模塊,然后在location模塊調用。輪詢是負載均衡的默認策略,可以不用進行設置。
upstream backend {server 192.168.1.129;server 192.168.1.130; }location / {root html;index index.html index.htm;proxy_pass http://backend; }
-
加權輪詢基本配置。
在http模塊中定義一個upstream模塊,然后在location模塊調用。通過weight設置權重。
upstream backend {server 192.168.1.129 weight=3;server 192.168.1.130 weight=1; }location / {root html;index index.html index.htm;proxy_pass http://backend; }
-
IP Hash基本配置。
在http模塊中定義一個upstream模塊,然后在location模塊調用。使用ip_hash開啟IP Hash策略。
upstream backend {ip_hash;server 192.168.1.129;server 192.168.1.130; }location / {root html;index index.html index.htm;proxy_pass http://backend; }
-
最小連接數基本配置。
在http模塊中定義一個upstream模塊,然后在location模塊調用。使用least_conn開啟最小連接數策略,通常還會和權重weight搭配使用。
upstream backend {least_conn;server 192.168.1.129 weight=3;server 192.168.1.130 weight=2; }location / {root html;index index.html index.htm;proxy_pass http://backend; }
-
URL Hash基本配置。
在http模塊中定義一個upstream模塊,然后在location模塊調用。使用hash設置根據URL路徑計算hash值。
upstream backend {hash $request_uri;server 192.168.1.129;server 192.168.1.130; }location / {root html;index index.html index.htm;proxy_pass http://backend; }
2.2 四層反向代理
四層反向代理使用stream語法,配置全局模塊中。用于流量的轉發,不涉及請求的處理,所以只允許輪詢、加權輪詢和最小連接數等策略。
在配置文件的全局模塊中新增一個stream模塊,其中包括upstream模塊和server模塊。需要注意的是端口號不能夠和http模塊中的server模塊設置的端口號相同,否則會產生端口占用,導致Nginx服務無法正常啟動。
-
輪詢基本配置。
stream {upstream backend {server 192.168.1.129:80;server 192.168.1.130:80;}server {listen 81;proxy_pass backend;} }
-
加權輪詢基本配置。
stream {upstream backend {server 192.168.1.129:80 weight=3;server 192.168.1.130:80 weight=1;}server {listen 81;proxy_pass backend;} }
-
最小連接數基本配置。
stream {upstream backend {least_conn;server 192.168.1.129:80;server 192.168.1.130:80;}server {listen 81;proxy_pass backend;} }