一、代理服務與反向代理
什么是代理服務
-
代理-代理辦理(代理理財、代理收貨、代理購物等等)。
一般情況下,如果沒有特別說明,代理技術默認說的是正向代理技術。關於正向代理的概念如下:
正向代理(forward)是一個位於客戶端【用戶A】和原始服務器(origin server)【服務器B】之間的服務器【代理服務器Z】,為了從原始服務器取得內容,用戶 A 向代理服務器 Z 發送一個請求並指定目標(服務器B),然后代理服務器 Z 向服務器 B 轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
HTTP請求沒有代理服務的模型圖
HTTP請求具有代理服務的模型圖
代理分類
-
正向代理
-
反向代理
正向代理
-
當局域網不能上網時,可以在瀏覽器設置正向代理滿足上網要求
-
當我們想通過FQ訪問國外網站查詢資料,可以在瀏覽器設置正向代理
-
當服務器只允許某個端的IP訪問(比如googe),所以我們需要請求運行訪問的那個客戶端,在讓其幫我們轉發請求
正向代理模型圖
反向代理
-
服務端有很多工程模塊的時候,需要通過Nginx代理實現流量的分發
反向代理模型圖
反向代理模型圖解釋:
-
客戶端需要自己去請求DNS獲取服務端地址;
-
代理是為服務端服務的;
-
紅色虛線表示防火牆;
-
配置在服務端,分發客戶端請求到不同的服務端
-
主要用於服務器集群分布式部署的情況下,反向代理隱藏了服務器的信息
代理區別
區別在於代理的對象不一樣 正向代理代理的對象是客戶端 反向代理代理的對象是服務端
反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據后,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。
二、代理模式和模塊介紹
常見的Nginx作為反向代理支持的協議
反向代理模式與Nginx代理模塊
常見的Nginx作為正向代理支持的協議
注意:
-
不能支持使用HTTPS協議
-
Nginx使用HTTP協議作為正向代理的協議
-
Nginx使用正向代理范圍比較窄
三、nginx 反向代理
代理服務proxy_pass配置語法
-
Syntax: proxy_pass
URL
; -
Default: —
-
Context:
location
,if in location
,limit_except
URL 可以是 http://localhost:8000/uri/ https://192.168.1.1:8000/uri/ http://unix:/tmp/backend.socket:/uri/;(socket)
反向代理場景需求
1、統一訪問入口,作為堡壘機,多套業務系統需使用同一個ip或者域名進行訪問,以不同后綴進行區分,需要一台NGINX服務器做統一的訪問入口。使用反向代理功能,將所有NGINX服務器作為外網或內網用戶統一的訪問入口,然后根據設置的localtion規則匹配不同的后綴轉發至不同的業務服務器。
2、業務服務器不能直接被外部網絡訪問,即不能直接映射外網ip,需要一台代理服務器,而代理服務器能被外部網絡訪問同時又和業務服務器網絡聯通。使用反向代理功能,將NGINX服務器映射外網ip,業務服務器無需映射外網ip,外網用戶訪問時首先訪問NGINX服務器,然后再由NGINX服務器訪問業務服務器資源后轉發給用戶,目前主流推薦采用此方案,這樣既滿足了業務需外網訪問的需求,又滿足業務服務器的安全。
3、作為緩存服務器,負載均衡,通過反向代理服務器來優化網站的負載,使用反向代理和負載均衡2個功能,根據配置的url后綴規則轉發至upstream中各服務器列表,默認按輪詢策略,同時還支持權重和ip_hash ,有redis緩存登錄seesion的方案中推薦使用輪詢策略,否則使用ip_hash策略實現同一ip的用戶請求固定至后端同一台服務器。
反向代理原理
• 1) 客戶端通過瀏覽器發起請求到代理服務器
• 2)代理服務器 接受請求
• 3) 代理服務器 發起請求到 業務服務器
• 4)業務服務器接受請求
• 5)業務服務器 處理理請求
• 6) 業務服務器 響應請求到代理服務器
• 7)代理服務器 響應請求到客戶端
• 8)客戶端通過瀏覽器渲染請求並展示給用戶
反向代理模擬
需求:假設有兩個服務一個對外暴露,一個不對外暴露只能內部訪問,對外暴露的端口是80,在內部訪問的端口是8080,通過訪問對外暴露的80服務來訪問8080服務
創建HTML靜態資源文件
[root@localhost nginx]# mkdir htmladmin htmlservice [root@localhost nginx]# echo htmladmin >htmladmin/index.html
配置虛擬主機
修改 /usr/local/nginx
目錄下的 nginx.conf 配置文件:
只有內部才能訪問的8080服務
... http{ ... # 配置虛擬主機 192.168.199.228 server { listen 8080; server_name 127.0.0.1; location / { allow 127.0.0.1; allow 192.168.199.228; deny all; root /usr/local/nginx/htmladmin; index index.html index.htm; } } }
重啟nginx,驗證下
[root@localhost nginx]# elinks http://192.168.199.228:8080 --dump htmladmin
配置對外暴露的反向代理
...
http{
...
# 配置虛擬主機 192.168.199.228 server { listen 8080; server_name 127.0.0.1; location / { allow 127.0.0.1; allow 192.168.199.228; deny all; root /usr/local/nginx/htmladmin; index index.html index.htm; } } #配置對外暴露的反向代理 server { listen 80; location /{ proxy_pass http://127.0.0.1:8080; } } }
重啟nginx后驗證效果
[root@localhost nginx]# elinks http://192.168.199.228 --dump htmladmin
Nginx作為代理服務_代理配置語法補充
proxy-緩沖區
-
Syntax: proxy_buffering on | off;
-
Default: proxy_buffering on;
-
Context: http, server, location
擴展:
proxy_buffer_size-設置緩沖區大小(內存頁大小)
proxy_buffers-設置緩沖區數量和大小(內存頁數量和大小)
proxy_busy_buffers_size-設置最大緩沖區大小
proxy-重定向
-
Syntax: proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement;
-
Default: proxy_redirect default;
-
Context: http, server, location
proxy-頭信息
-
Syntax: proxy_set_header field value;
-
Default: proxy_set_header Host $proxy_host; proxy_set_header Connection close;
-
Context: http, server, location
擴展:
proxy_hide_header-設置隱藏頭信息字段
proxy_set_body-設置請求體返回信息
proxy-超時
-
Syntax: proxy_connect_timeout time;
-
Default: proxy_connect_timeout 60s;
-
Context: http, server, location
擴展:
proxy_read_timeout-從代理服務器讀取響應的超時時間
proxy_send_timeout-設置將請求傳輸到代理服務器的超時時間
代理配置及配置規范
代理通用配置
location / { proxy_pass http://127.0.0.1:8080; include proxy_params; }
proxy_params
proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffering on; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k;
代理配置詳解:
proxy_redirect default;
-
沒有重定向就配置成默認,除非后端返回301情況下設置成具體重定向地址
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-
設置字段重新定義或附加到傳遞給代理服務器的請求頭,通過X-Forwarded-For獲取用戶真實IP
proxy_connect_timeout 30;
-
設置代理連接超時時間
proxy_read_timeout 60;
-
設置從代理服務器讀取響應的超時時間
proxy_send_timeout 60;
-
設置向代理服務器發送請求的超時時間
proxy_buffering on;
-
設置啟用或禁用來自代理服務器的響應緩沖
proxy_buffer_size 32k;
-
設置用於讀取從代理服務器接收的響應的第一部分的緩沖區的大小
proxy_buffers 4 128k
-
設置用於從代理服務器讀取響應的緩沖區的數量和大小,用於單個連接。
proxy_busy_buffers_size 256k;
-
設置當啟用來自代理服務器的響應緩沖時,限制可能忙於向響應客戶端發送響應的緩沖區的總大小,而響應尚未完全讀取。
proxy_max_temp_file_size 256k;
-
設置當啟用來自代理服務器的響應緩沖,並且整個響應不適合proxy_buffer_size和proxy_buffers指令設置的緩沖區時,響應的一部分可以保存到臨時文件中。 該指令設置臨時文件的最大大小。 一次寫入臨時文件的數據大小由proxy_temp_file_write_size指令設置。
location / { index index.jsp; proxy_pass http://hello; #在這里設置一個代理,和upstream的名字一樣 #以下是一些反向代理的配置可刪除 proxy_redirect off; #后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #允許客戶端請求的最大單文件字節數 client_body_buffer_size 128k; #緩沖區代理緩沖用戶端請求的最大字節數 proxy_connect_timeout 300; #nginx跟后端服務器連接超時時間(代理連接超時) proxy_send_timeout 300; #后端服務器數據回傳時間(代理發送超時) proxy_read_timeout 300; #連接成功后,后端服務器響應時間(代理接收超時) proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩沖區大小 proxy_buffers 4 32k; #proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置 proxy_busy_buffers_size 64k; #高負荷下緩沖大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 } }
參考資料