nginx之旅(第三篇):代理、正向代理、反向代理、代理的原理、nginx反向代理場景、nginx反向代理配置、nginx反向代理語法


一、代理服務與反向代理

什么是代理服務

  • 代理-代理辦理(代理理財、代理收貨、代理購物等等)。

 

一般情況下,如果沒有特別說明,代理技術默認說的是正向代理技術。關於正向代理的概念如下:

正向代理(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服務器傳
    }
}

  

 

 

參考資料

[1]https://www.jianshu.com/p/d14c2e7e63d4

[2]https://www.cnblogs.com/crazymagic/p/11029137.html


免責聲明!

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



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