大致的概念
正向代理
代理服務(wù),也稱為正向代理服務(wù)涌攻。
如果把局域網(wǎng)外Internet想象成一個巨大的資源庫现横,那么資源就分布在Internet的各個站點上,局域網(wǎng)內(nèi)的客戶端要訪問這個庫里的資源必須統(tǒng)一通過代理服務(wù)器才能對各個站點進行訪問壳影。
也就是說正向代理服務(wù)器不支持外部對內(nèi)部網(wǎng)絡(luò)的訪問請求。
反向代理
與正向代理相反弥臼,如果局域網(wǎng)向Internet提供資源宴咧,讓Internet上的其他用戶可以訪問局域網(wǎng)內(nèi)的資源,也可以設(shè)置使用一個代理服務(wù)器径缅,它提供的服務(wù)就叫反向代理服務(wù)掺栅。
總結(jié):
正向代理服務(wù)器用來讓局域網(wǎng)客戶機接入外網(wǎng)以訪問外網(wǎng)資源,反向代理服務(wù)器用來讓外網(wǎng)的客戶端接入局域網(wǎng)中的站點以訪問點中的資源纳猪。
Nginx配置正向代理
配置指令
resolver 指令:指定DNS服務(wù)器的IP地址氧卧。
resolver address ... [valid=time]
參數(shù)解析:
address : DNS服務(wù)器的IP地址。如果不指定端口號氏堤,默認使用53端口沙绝。
time : 設(shè)置數(shù)據(jù)包在網(wǎng)絡(luò)中的有效時間。這個命令的主要原因是,在訪問站點時闪檬,有很多情況使得數(shù)據(jù)包在一定時間內(nèi)不能被傳遞到目的地星著,但是又不能讓該數(shù)據(jù)包無限制的存在,于是就需要設(shè)定一段時間粗悯,當(dāng)數(shù)據(jù)包在這段時間內(nèi)沒有到達目的地虚循,就會被丟棄,然后發(fā)送者會接收到一個消息为黎,并決定是否要重發(fā)該數(shù)據(jù)包邮丰。
例子:
resolver 127.0.0.1 [::1]:5353 valid=30s
resolver_timeout 指令:該指令用于設(shè)置DNS服務(wù)器域名解析超時時間。
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è)置虛擬主機的名稱或者IP斗蒋。但是resolver 指令是必須的,如果沒有這個指令笛质,Nginx服務(wù)器無法處理接收到的域名泉沾。
Nginx反向代理配置
配置指令
1. proxy_pass 指令:用來設(shè)置被代理服務(wù)器的地址,包括傳輸協(xié)議妇押、主機名稱或者IP地址加端口號跷究、URI等要素。還可以接受以“unix”開始的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;
}
}
.....
注意:使用這個 proxy_pass 指令的時候俊马,如果代理的URL中是否包含了URI,Nginx服務(wù)器處理方式都不相同肩杈。如果URL中不包含URI柴我,Nginx服務(wù)器不會改變原地址的URI;但是如果包含了URI扩然,Nginx服務(wù)器將會使用新的URI代替原來的URI艘儒。
看下面例子:
比如指定了URI:
server {
...
listen 80;
server_name www.myweb.com;
location / {
proxy_pass http://192.168.1.1:8001/loc/;
}
}
那么請求 “http://www.my.com/server/” 發(fā)起請求,夫偶,Nginx服務(wù)器會把地址轉(zhuǎn)向 "http://192.168.1.1:8001/loc/" 就把 "/server/" 替換掉為 "/loc/"
比如沒有指定了URI:
server {
...
listen 80;
server_name www.myweb.com;
location / {
proxy_pass http://192.168.1.1:8001;
}
}
那么請求 “http://www.my.com/server” 發(fā)起請求界睁,,Nginx服務(wù)器會把地址轉(zhuǎn)向 "http://192.168.1.1:8001/server", 原有的URI不變
proxy_pass 指令的URL末尾是否加 "/" 的問題:
#配置1
proxy_pass http://192.168.1.1;
#配置2
proxy_pass http://192.168.1.1/;
測試實例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/;
}
}
在這個配置中 localhost 塊使用 "/" 作為 uri 變量的值來匹配不包含URI的請求URL索守。由于請求URL中不包含URI晕窑,因此配置1 和 配置 2 的效果一樣。比如 "http://www.myweb.com/index.html"卵佛,配置1 和 配置2 都會轉(zhuǎn)向到 "http://192.168.1.1/index.html"
測試實例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/;
}
}
在這個配置中,localhost塊使用 “/server/” 作為 uri 變量的值來匹配包含URI “/server/” 的請求URL。
這時候使用配置1 和 配置2 的轉(zhuǎn)向結(jié)果就不一樣了截汪。使用配置1的時候疾牲,不會改變原地址的URI;使用配置2的時候衙解,proxy_pass 指令中的URI變量包含了URI “/”阳柔,Nginx服務(wù)器就會將原地址的URI替換為“/”.
比如 "http://www.myweb.com/server/index.html",使用配置2的時候蚓峦,會轉(zhuǎn)向到 "http://192.168.1.1/index.html"舌剂,原地址的 /server/ 會被替換掉!
proxy_pass 在上面所述的替換URI的問題, 所替換的URI是針對 localhost 匹配的URI替換暑椰。
比如:
配置
localhost /server/ {
proxy_pass http://127.0.0.1:8080/
}
那么請求 http://www.xxxx.com/server/name/index.html 的時候霍转,只會把 /server/ 給 截斷/替換 掉,不會把 /name 給 截斷/替換 掉一汽!最終 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)時避消,隱藏一些頭域信息。
該指令可用于 http塊召夹、server塊或者localhost塊
proxy_hide_header field;
3. proxy_pass_header 指令:默認情況下岩喷,Nginx服務(wù)器發(fā)送響應(yīng)報文時,報文頭信息中不包含 "Date"监憎、"Server"纱意、"X-Accel"等來自被代理服務(wù)器的頭域信息。該指令可以設(shè)置這些頭域信息以被發(fā)送鲸阔。
proxy_pass_header field;
4. proxy_pass_request_body 指令:用于配置是否將客戶端請求的請求頭發(fā)送給代理服務(wù)器偷霉。
proxy_pass_request_body on | off;
默認設(shè)置為開啟(on),可以在http塊隶债、server塊或者location塊中進行配置腾它。
5. proxy_pass_request_headers 指令:指令用于配置是否將客戶端請求的請求頭發(fā)送給代理服務(wù)器。
proxy_pass_request_headers on | off;
默認設(shè)置為開啟(on)死讹,開關(guān)可以在http塊瞒滴、server塊或者localhost塊中進行配置。
6. proxy_set_header 指令:指令可以更改Nginx服務(wù)器接收到的客戶端請求的請求頭信息赞警,然后將新的請求頭發(fā)送給被代理的服務(wù)器妓忍。
proxy_set_header field value;
field 要更改的信息所在的頭域
value 更改的值
默認情況下,該指令的設(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ù)器接收到的客戶端請求的請求體信息愧旦,然后將新的請求體發(fā)送給被代理的服務(wù)器世剖。
proxy_set_body value;
value 支持使用文本、變量或者變量的組合
8.proxy_bind 指令 :強制將與代理主機的連接綁定到指定的IP地址笤虫。通俗來講就是旁瘫,在配置了多個基于名稱或者基于IP的主機的情況下祖凫,如果我們希望代理連接由指定的主機處理,就可以使用這個配置酬凳。
proxy_bind address;
address 為主機的IP地址
注意:Nginx 版本在0.8.22 及 以上支持該指令惠况。
9.proxy_connect_timeout 指令:指令配置Nginx服務(wù)器與后端被代理服務(wù)器嘗試建立連接的超時時間。
proxy_connect_timeout time;
time 為設(shè)置的超時時間宁仔,默認為 60s
10.proxy_read_timeout指令:指令配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出read請求后稠屠,等待響應(yīng)的超時時間。
proxy_read_timeout time;
time 為設(shè)置的超時時間翎苫,默認為 60s
11.proxy_send_timeout指令:指令配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出write請求后权埠,等待響應(yīng)的超時時間。
proxy_send_timeouttime;
time 為設(shè)置的超時時間煎谍,默認為 60s
12.proxy_http_version 指令:用于設(shè)置Nginx服務(wù)器提供代理服務(wù)的HTTP協(xié)議版本攘蔽。
proxy_http_version 1.0 | 1.1;
13.proxy_method 指令:用于設(shè)置Nginx服務(wù)器請求被代理服務(wù)器時使用的請求方法,一般為POST 或者 GET粱快。設(shè)置了該指令秩彤,客戶端的請求方法將被忽略。
proxy_method method;
method 的值可以設(shè)置為 POST 或者 GET
14.proxy_ignore_client_abort 指令:用于設(shè)置在客戶端中斷網(wǎng)絡(luò)請求時事哭,Nginx服務(wù)器是否中斷對被代理服務(wù)器的請求漫雷。
proxy_ignore_client_abort on | off;
默認設(shè)置為 off,當(dāng)客戶端中斷網(wǎng)絡(luò)請求時鳍咱,Nginx服務(wù)器中斷對代理服務(wù)器的請求降盹。
可配置的指令太多了,就不一一列出來了谤辜。
均衡負載配置
主要使用proxy_pass指令和upstream指令
配置一:對請求一般輪詢
.....
# 配置后端服務(wù)器組
upstream my_proxy {
# 默認 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;
}
}
.....
配置二:對請求進行加權(quán)輪詢
.....
# 配置后端服務(wù)器組
upstream my_proxy {
# 默認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;
}
}
.....
配置三:對特定資源實現(xiàn)均衡負載
.....
# 配置后端服務(wù)器組
upstream video_proxy {
# 默認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 {
# 默認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;
# 針對 video 請求
location /video/ {
proxy_pass video_proxy;
}
# 針對 file 請求
location /file/ {
proxy_pass file_proxy ;
}
}
.....
配置四:針對不同域名實現(xiàn)均衡負載
.....
# 配置后端服務(wù)器組
upstream bbs_proxy {
# 默認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 {
# 默認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;
# 允許請求地址跨域 * 做為通配符
add_header Access-Control-Allow-Origin * always;
# 允許跨域的請求方法
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;
}
}
}