Nginx正向代理和反向代理

大致的概念

正向代理

代理服務(wù),也稱為正向代理服務(wù)。
如果把局域網(wǎng)外Internet想象成一個(gè)巨大的資源庫(kù),那么資源就分布在Internet的各個(gè)站點(diǎn)上,局域網(wǎng)內(nèi)的客戶端要訪問(wèn)這個(gè)庫(kù)里的資源必須統(tǒng)一通過(guò)代理服務(wù)器才能對(duì)各個(gè)站點(diǎn)進(jìn)行訪問(wèn)。
也就是說(shuō)正向代理服務(wù)器不支持外部對(duì)內(nèi)部網(wǎng)絡(luò)的訪問(wèn)請(qǐng)求。

反向代理

與正向代理相反,如果局域網(wǎng)向Internet提供資源,讓Internet上的其他用戶可以訪問(wèn)局域網(wǎng)內(nèi)的資源,也可以設(shè)置使用一個(gè)代理服務(wù)器,它提供的服務(wù)就叫反向代理服務(wù)。

總結(jié):

正向代理服務(wù)器用來(lái)讓局域網(wǎng)客戶機(jī)接入外網(wǎng)以訪問(wèn)外網(wǎng)資源,反向代理服務(wù)器用來(lái)讓外網(wǎng)的客戶端接入局域網(wǎng)中的站點(diǎn)以訪問(wèn)點(diǎn)中的資源。

Nginx配置正向代理

配置指令

resolver 指令:指定DNS服務(wù)器的IP地址。

resolver address ... [valid=time]

參數(shù)解析:
address : DNS服務(wù)器的IP地址。如果不指定端口號(hào),默認(rèn)使用53端口。
time : 設(shè)置數(shù)據(jù)包在網(wǎng)絡(luò)中的有效時(shí)間。這個(gè)命令的主要原因是,在訪問(wèn)站點(diǎn)時(shí),有很多情況使得數(shù)據(jù)包在一定時(shí)間內(nèi)不能被傳遞到目的地,但是又不能讓該數(shù)據(jù)包無(wú)限制的存在,于是就需要設(shè)定一段時(shí)間,當(dāng)數(shù)據(jù)包在這段時(shí)間內(nèi)沒(méi)有到達(dá)目的地,就會(huì)被丟棄,然后發(fā)送者會(huì)接收到一個(gè)消息,并決定是否要重發(fā)該數(shù)據(jù)包。

例子:

resolver 127.0.0.1 [::1]:5353 valid=30s

resolver_timeout 指令:該指令用于設(shè)置DNS服務(wù)器域名解析超時(shí)時(shí)間。

resolver_timeout 30s;

proxy_pass 指令:該指令用于設(shè)置代理服務(wù)器的協(xié)議和地址,它不僅僅用于Nginx服務(wù)器的代理服務(wù),更主要用于反向代理。

proxy_pass http://$http_host$request_uri;

正向代理配置例子:

...
server {
    resolver 8.8.8.8;
    listen 82;
    location / {
        proxy_pass proxy_pass http://$http_host$request_uri;
    }

}
...

注意:server塊中 不要設(shè)置 server_name 指令,既不要設(shè)置虛擬主機(jī)的名稱或者IP。但是resolver 指令是必須的,如果沒(méi)有這個(gè)指令,Nginx服務(wù)器無(wú)法處理接收到的域名。

Nginx反向代理配置

配置指令

1. proxy_pass 指令:用來(lái)設(shè)置被代理服務(wù)器的地址,包括傳輸協(xié)議、主機(jī)名稱或者IP地址加端口號(hào)、URI等要素。還可以接受以“unix”開(kāi)始的UNIX-domain套接字路徑。

proxy_pass http://www.xxx.com/uri;
proxy_pass http://localhost:8080/uri;
proxy_pass http://unix:/tmp/backend.socket:/uri/;

代理一組服務(wù)器例子:

.....
# 配置后端服務(wù)器組
upstream my_proxy {
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
    # server http://192.168.1.3:8001/uri/;
}
server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass my_proxy;
   } 
}
.....

注意:使用這個(gè) proxy_pass 指令的時(shí)候,如果代理的URL中是否包含了URI,Nginx服務(wù)器處理方式都不相同。如果URL中不包含URI,Nginx服務(wù)器不會(huì)改變?cè)刂返腢RI;但是如果包含了URI,Nginx服務(wù)器將會(huì)使用新的URI代替原來(lái)的URI。
看下面例子:

比如指定了URI

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass http://192.168.1.1:8001/loc/;
   } 
}

那么請(qǐng)求 “http://www.my.com/server/” 發(fā)起請(qǐng)求,,Nginx服務(wù)器會(huì)把地址轉(zhuǎn)向 "http://192.168.1.1:8001/loc/" 就把 "/server/" 替換掉為 "/loc/"

比如沒(méi)有指定了URI

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass http://192.168.1.1:8001;
   } 
}

那么請(qǐng)求 “http://www.my.com/server” 發(fā)起請(qǐng)求,,Nginx服務(wù)器會(huì)把地址轉(zhuǎn)向 "http://192.168.1.1:8001/server", 原有的URI不變

proxy_pass 指令的URL末尾是否加 "/" 的問(wèn)題:

#配置1 
proxy_pass http://192.168.1.1;
#配置2 
proxy_pass http://192.168.1.1/;

測(cè)試實(shí)例1:

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      #配置1 
      proxy_pass http://192.168.1.1;
      #配置2 
      proxy_pass http://192.168.1.1/;
   } 
}

在這個(gè)配置中 localhost 塊使用 "/" 作為 uri 變量的值來(lái)匹配不包含URI的請(qǐng)求URL。由于請(qǐng)求URL中不包含URI,因此配置1 和 配置 2 的效果一樣。比如 "http://www.myweb.com/index.html",配置1 和 配置2 都會(huì)轉(zhuǎn)向到 "http://192.168.1.1/index.html"

測(cè)試實(shí)例2:

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location /server/ {
      #配置1 
      proxy_pass http://192.168.1.1;
      #配置2 
      proxy_pass http://192.168.1.1/;
   } 
}

在這個(gè)配置中,localhost塊使用 “/server/” 作為 uri 變量的值來(lái)匹配包含URI “/server/” 的請(qǐng)求URL。
這時(shí)候使用配置1 和 配置2 的轉(zhuǎn)向結(jié)果就不一樣了。使用配置1的時(shí)候,不會(huì)改變?cè)刂返腢RI;使用配置2的時(shí)候,proxy_pass 指令中的URI變量包含了URI “/”,Nginx服務(wù)器就會(huì)將原地址的URI替換為“/”.
比如 "http://www.myweb.com/server/index.html",使用配置2的時(shí)候,會(huì)轉(zhuǎn)向到 "http://192.168.1.1/index.html",原地址的 /server/ 會(huì)被替換掉!

proxy_pass 在上面所述的替換URI的問(wèn)題, 所替換的URI是針對(duì) localhost 匹配的URI替換。

比如:
配置

localhost /server/ { 
  proxy_pass http://127.0.0.1:8080/ 
}

那么請(qǐng)求 http://www.xxxx.com/server/name/index.html 的時(shí)候,只會(huì)把 /server/ 給 截?cái)?替換 掉,不會(huì)把 /name 給 截?cái)?替換 掉!最終 http://www.xxxx.com/server/name/index.html 變成 http://127.0.0.1:8080/name/index.html

2. proxy_hide_header 指令:該指令用于設(shè)置Nginx在發(fā)送HTTP響應(yīng)時(shí),隱藏一些頭域信息。
該指令可用于 http塊、server塊或者localhost塊

proxy_hide_header field;

3. proxy_pass_header 指令:默認(rèn)情況下,Nginx服務(wù)器發(fā)送響應(yīng)報(bào)文時(shí),報(bào)文頭信息中不包含 "Date"、"Server"、"X-Accel"等來(lái)自被代理服務(wù)器的頭域信息。該指令可以設(shè)置這些頭域信息以被發(fā)送。

proxy_pass_header field;

4. proxy_pass_request_body 指令:用于配置是否將客戶端請(qǐng)求的請(qǐng)求頭發(fā)送給代理服務(wù)器。

proxy_pass_request_body on | off;

默認(rèn)設(shè)置為開(kāi)啟(on),可以在http塊、server塊或者location塊中進(jìn)行配置。

5. proxy_pass_request_headers 指令:指令用于配置是否將客戶端請(qǐng)求的請(qǐng)求頭發(fā)送給代理服務(wù)器。

proxy_pass_request_headers on | off;

默認(rèn)設(shè)置為開(kāi)啟(on),開(kāi)關(guān)可以在http塊、server塊或者localhost塊中進(jìn)行配置。

6. proxy_set_header 指令:指令可以更改Nginx服務(wù)器接收到的客戶端請(qǐng)求的請(qǐng)求頭信息,然后將新的請(qǐng)求頭發(fā)送給被代理的服務(wù)器。

proxy_set_header field value;

field 要更改的信息所在的頭域
value 更改的值

默認(rèn)情況下,該指令的設(shè)置為:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

例子:

proxy_set_header Host $http_host; # 將目前Host頭域的值填充成客戶端的地址
proxy_set_header Host $host; # 將目前l(fā)ocaltion 塊的 server_name指令值填充到Host頭域
proxy_set_header Host $host:$proxy_port; # 將目前l(fā)ocaltion 塊的 server_name指令值和listener指令值填充到Host頭域

7.proxy_set_body 指令 :可以更改Nginx服務(wù)器接收到的客戶端請(qǐng)求的請(qǐng)求體信息,然后將新的請(qǐng)求體發(fā)送給被代理的服務(wù)器。

proxy_set_body value;

value 支持使用文本、變量或者變量的組合

8.proxy_bind 指令 :強(qiáng)制將與代理主機(jī)的連接綁定到指定的IP地址。通俗來(lái)講就是,在配置了多個(gè)基于名稱或者基于IP的主機(jī)的情況下,如果我們希望代理連接由指定的主機(jī)處理,就可以使用這個(gè)配置。

proxy_bind  address;

address 為主機(jī)的IP地址
注意:Nginx 版本在0.8.22 及 以上支持該指令。

9.proxy_connect_timeout 指令:指令配置Nginx服務(wù)器與后端被代理服務(wù)器嘗試建立連接的超時(shí)時(shí)間。

proxy_connect_timeout time;

time 為設(shè)置的超時(shí)時(shí)間,默認(rèn)為 60s

10.proxy_read_timeout指令:指令配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出read請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間。

proxy_read_timeout time;

time 為設(shè)置的超時(shí)時(shí)間,默認(rèn)為 60s

11.proxy_send_timeout指令:指令配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出write請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間。

proxy_send_timeouttime;

time 為設(shè)置的超時(shí)時(shí)間,默認(rèn)為 60s

12.proxy_http_version 指令:用于設(shè)置Nginx服務(wù)器提供代理服務(wù)的HTTP協(xié)議版本。

proxy_http_version 1.0 | 1.1;

13.proxy_method 指令:用于設(shè)置Nginx服務(wù)器請(qǐng)求被代理服務(wù)器時(shí)使用的請(qǐng)求方法,一般為POST 或者 GET。設(shè)置了該指令,客戶端的請(qǐng)求方法將被忽略。

proxy_method method;

method 的值可以設(shè)置為 POST 或者 GET

14.proxy_ignore_client_abort 指令:用于設(shè)置在客戶端中斷網(wǎng)絡(luò)請(qǐng)求時(shí),Nginx服務(wù)器是否中斷對(duì)被代理服務(wù)器的請(qǐng)求。

proxy_ignore_client_abort on | off;

默認(rèn)設(shè)置為 off,當(dāng)客戶端中斷網(wǎng)絡(luò)請(qǐng)求時(shí),Nginx服務(wù)器中斷對(duì)代理服務(wù)器的請(qǐng)求。

可配置的指令太多了,就不一一列出來(lái)了。

均衡負(fù)載配置

主要使用proxy_pass指令和upstream指令

配置一:對(duì)請(qǐng)求一般輪詢

.....
# 配置后端服務(wù)器組
upstream my_proxy {
    # 默認(rèn) weight = 1
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
}
server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass my_proxy;

   } 
}
.....

配置二:對(duì)請(qǐng)求進(jìn)行加權(quán)輪詢

.....
# 配置后端服務(wù)器組
upstream my_proxy {
    # 默認(rèn)weight = 1
    server http://192.168.1.1:8001 weight = 5;
    server http://192.168.1.2:8001 weight = 2;
    server http://192.168.1.4:8001;
}
server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass my_proxy;

   } 
}
.....

配置三:對(duì)特定資源實(shí)現(xiàn)均衡負(fù)載

.....
# 配置后端服務(wù)器組
upstream video_proxy {
    # 默認(rèn)weight = 1
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
}

# 配置后端服務(wù)器組
upstream file_proxy {
    # 默認(rèn)weight = 1
    server http://192.168.1.5:8001;
    server http://192.168.1.6:8001;
    server http://192.168.1.7:8001;
}

server {
   ...
   listen 80;
   server_name www.myweb.com;

   # 針對(duì) video 請(qǐng)求
   location /video/ {
      proxy_pass video_proxy;

   } 

   # 針對(duì) file 請(qǐng)求
   location /file/ {
      proxy_pass file_proxy ;

   } 
}
.....

配置四:針對(duì)不同域名實(shí)現(xiàn)均衡負(fù)載

.....
# 配置后端服務(wù)器組
upstream bbs_proxy {
    # 默認(rèn)weight = 1
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
}

# 配置后端服務(wù)器組
upstream home_proxy {
    # 默認(rèn)weight = 1
    server http://192.168.1.5:8001;
    server http://192.168.1.6:8001;
    server http://192.168.1.7:8001;
}

server {
   ...
   listen 80;
   server_name www.myHome.com;

   location / {
      proxy_pass home_proxy;
   } 

}

server {
   ...
   listen 81;
   server_name www.myBbs.com;

   location / {
      proxy_pass bbs_proxy ;
   } 

}
.....

配置五:處理跨域

server {

   listen 81;
   server_name localhost;

   location / {
            proxy_pass http://localhost:8188/;
            # 設(shè)置是否允許 cookie 傳輸
            add_header Access-Control-Allow-Credentials true;
            # 允許請(qǐng)求地址跨域 * 做為通配符
            add_header Access-Control-Allow-Origin * always;
            # 允許跨域的請(qǐng)求方法
            add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

            if ($request_method = 'OPTIONS') {
                return 204;
            }
        }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容