示意圖
#https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/pic.md
Nginx正向代理
#https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md
Nginx反向代理
#https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/f_proxy.md
#緩沖和緩存 https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/bu_ca.md
Nginx正向代理配置
Nginx正向代理使用場景并不多見。
需求場景1:
如果在機房中,只有一臺機器可以聯(lián)網(wǎng),其他機器只有內(nèi)網(wǎng),內(nèi)網(wǎng)的機器想用使用yum安裝軟件包,在能能聯(lián)網(wǎng)的機器上配置一個正向代理即可。
Nginx正向代理配置文件
server {
listen 80 default_server;
resolver 119.29.29.29;
location /
{
proxy_pass http://$host$request_uri;
}
}
Nginx正向代理配置執(zhí)行說明
resolver
語法:resolver address;
address為DNS服務(wù)器的地址,國內(nèi)通用的DNS 119.29.29.29為dnspod公司提供。 國際通用DNS 8.8.8.8或者8.8.4.4為google提供。
其他可以參考 http://dns.lisect.com/
示例:resolver 119.29.29.29;
default_server
之所以要設(shè)置為默認虛擬主機,是因為這樣就不用設(shè)置server_name了,任何域名解析過來都可以正常訪問。
proxy_pass
該指令用來設(shè)置要代理的目標url,正向代理服務(wù)器設(shè)置就保持該固定值即可。關(guān)于該指令的詳細解釋在反向代理配置中。
我們線上用到的正向代理proxy_pass 后面加的是一個具體的接口地址,內(nèi)網(wǎng)環(huán)境只用來訪問這個內(nèi)網(wǎng)地址如下圖
Nginx反向代理配置
Nginx反向代理在生產(chǎn)環(huán)境中使用很多的。
場景1:
域名沒有備案,可以把域名解析到香港一臺云主機上,在國外云主機做個代理,而網(wǎng)站數(shù)據(jù)是在大陸的服務(wù)器上。
示例1:
server
{
listen 80;
server_name aminglinux.com;
location /
{
proxy_pass http://123.23.13.11/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置說明
在正向代理中,已經(jīng)使用過該指令。
格式很簡單: proxy_pass URL;
其中URL包含:傳輸協(xié)議(http://, https://等)、主機名(域名或者IP:PORT)、uri。
示例如下:
proxy_pass http://www.aminglinux.com/;
proxy_pass http://192.168.200.101:8080/uri;
proxy_pass unix:/tmp/www.sock;
對于proxy_pass的配置有幾種情況需要注意。
示例2:
location /aming/
{
proxy_pass http://192.168.1.10;
...
}
示例3:
location /aming/
{
proxy_pass http://192.168.1.10/;
...
}
示例4:
location /aming/
{
proxy_pass http://192.168.1.10/linux/;
...
}
示例5:
location /aming/
{
proxy_pass http://192.168.1.10/linux;
...
}
假設(shè)server_name為www.aminglinux.com
當請求http://www.aminglinux.com/aming/a.html的時候,以上示例2-5分別訪問的結(jié)果是
示例2:http://192.168.1.10/aming/a.html
示例3:http://192.168.1.10/a.html
示例4:http://192.168.1.10/linux/a.html
示例5:http://192.168.1.10/linuxa.html
proxy_set_header用來設(shè)定被代理服務(wù)器接收到的header信息。
語法:proxy_set_header field value;
field為要更改的項目,也可以理解為變量的名字,比如host
value為變量的值
如果不設(shè)置proxy_set_header,則默認host的值為proxy_pass后面跟的那個域名或者IP(一般寫IP),
比如示例4,請求到后端的服務(wù)器上時,完整請求uri為:http://192.168.1.10/linux/a.html
如果設(shè)置proxy_set_header,如 proxy_set_header host $host;
比如示例4,請求到后端的服務(wù)器完整uri為:http://www.aminglinux.com/linux/a.html
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用來設(shè)置被代理端接收到的遠程客戶端IP,如果不設(shè)置,則header信息中并不會透傳遠程真實客戶端的IP地址。
可以用如下示例來測試:
示例6(被代理端)
server{
listen 8080;
server_name www.aminglinux.com;
root /tmp/123.com_8080;
index index.html;
location /linux/ {
echo "$host";
echo $remote_addr;
echo $proxy_add_x_forwarded_for;
}
}
示例7(代理服務(wù)器上)
server {
listen 80;
server_name www.aminglinux.com;
location /aming/
{
proxy_pass http://192.168.1.10:8080/linux/;
proxy_set_header host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
該指令用來修改被代理服務(wù)器返回的響應(yīng)頭中的Location頭域和“refresh”頭域。
語法結(jié)構(gòu)為:
proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
示例8:
server {
listen 80;
server_name www.aminglinux.com;
index index.html;
location /
{
proxy_pass http://127.0.0.1:8080;
proxy_set_header host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
當請求的鏈接為 http://www.aminglinux.com/aming
結(jié)果會返回301,定向到了 http://www.aminglinux.com:8080/aming/
注意:返回301有幾個先決條件
雖然,這4個條件挺苛刻,但確實會遇到類似的請求。解決方法是,加一行proxy_redirect http://$host:8080/ /;
示例9:
server {
listen 80;
server_name www.aminglinux.com;
index index.html;
location /
{
proxy_pass http://127.0.0.1:8080;
proxy_set_header host $host;
proxy_redirect http://$host:8080/ /;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx的proxy_buffering和proxy_cache
兩個都是nginx代理中內(nèi)存設(shè)置相關(guān)的參數(shù)。
proxy_buffering設(shè)置
proxy_buffering主要是實現(xiàn)被代理服務(wù)器的數(shù)據(jù)和客戶端的請求異步。
為了方便理解,我們定義三個角色,A為客戶端,B為代理服務(wù)器,C為被代理服務(wù)器。
當proxy_buffering開啟,A發(fā)起請求到B,B再到C,C反饋的數(shù)據(jù)先到B的buffer上,
然后B會根據(jù)proxy_busy_buffer_size來決定什么時候開始把數(shù)據(jù)傳輸給A。在此過程中,如果所有的buffer被寫滿,
數(shù)據(jù)將會寫入到temp_file中。
相反,如果proxy_buffering關(guān)閉,C反饋的數(shù)據(jù)實時地通過B傳輸給A。
以下配置,都是針對每一個http請求的。
proxy_buffering on;
該參數(shù)設(shè)置是否開啟proxy的buffer功能,參數(shù)的值為on或者off。
如果這個設(shè)置為off,那么proxy_buffers和proxy_busy_buffers_size這兩個指令將會失效。
但是無論proxy_buffering是否開啟,proxy_buffer_size都是生效的
proxy_buffer_size 4k;
該參數(shù)用來設(shè)置一個特殊的buffer大小的。
從被代理服務(wù)器(C)上獲取到的第一部分響應(yīng)數(shù)據(jù)內(nèi)容到代理服務(wù)器(B)上,通常是header,就存到了這個buffer中。
如果該參數(shù)設(shè)置太小,會出現(xiàn)502錯誤碼,這是因為這部分buffer不夠存儲header信息。建議設(shè)置為4k。
proxy_buffers 8 4k;
這個參數(shù)設(shè)置存儲被代理服務(wù)器上的數(shù)據(jù)所占用的buffer的個數(shù)和每個buffer的大小。
所有buffer的大小為這兩個數(shù)字的乘積。
對于B上buffer里的數(shù)據(jù)何時傳輸給A,我個人的理解是這樣的:
1)如果完整數(shù)據(jù)大小小于busy_buffer大小,當數(shù)據(jù)傳輸完成后,馬上傳給A;
2)如果完整數(shù)據(jù)大小不少于busy_buffer大小,則裝滿busy_buffer后,馬上傳給A;
例:proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
其中/usr/local/nginx/proxy_temp為臨時文件所在目錄,1表示層級1的目錄名為一個數(shù)字(0-9),2表示層級2目錄名為2個數(shù)字(00-99)
proxy_max_temp_file_size
設(shè)置臨時文件的總大小,例如 proxy_max_temp_file_size 100M;
proxy_buffer示例
server
{
listen 80;
server_name www.aminglinux.com;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 2 4k;
proxy_busy_buffers_size 4k;
proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
proxy_max_temp_file_size 20M;
proxy_temp_file_write_size 8k;
location /
{
proxy_pass http://192.168.10.110:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
proxy_cache設(shè)置
proxy_cache將從C上獲取到的數(shù)據(jù)根據(jù)預(yù)設(shè)規(guī)則存放到B上(內(nèi)存+磁盤)留著備用,
A請求B時,B會把緩存的這些數(shù)據(jù)直接給A,而不需要再去向C去獲取。
proxy_cache相關(guān)功能生效的前提是,需要設(shè)置proxy_buffering on;
proxy_cache主要參數(shù)
默認為off,即關(guān)閉proxy_cache功能,zone為用于存放緩存的內(nèi)存區(qū)域名稱。
例:proxy_cache my_zone;
從nginx 0.7.66版本開始,proxy_cache機制開啟后會檢測被代理端的HTTP響應(yīng)頭中的"Cache-Control"、"Expire"頭域。
如,Cache-Control為no-cache時,是不會緩存數(shù)據(jù)的。
該參數(shù)設(shè)定,什么情況下的請求不讀取cache而是直接從后端的服務(wù)器上獲取資源。
這里的string通常為nginx的一些變量。
例:proxy_cahce_bypass $cookie_nocache $arg_nocache$arg_comment;
意思是,如果$cookie_nocache $arg_nocache$arg_comment這些變量的值只要任何一個不為0或者不為空時,
則響應(yīng)數(shù)據(jù)不從cache中獲取,而是直接從后端的服務(wù)器上獲取。
該參數(shù)和proxy_cache_bypass類似,用來設(shè)定什么情況下不緩存。
例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
表示,如果$cookie_nocache $arg_nocache $arg_comment的值只要有一項不為0或者不為空時,不緩存數(shù)據(jù)。
定義cache key,如: proxy_cache_key $scheme$proxy_host$uri$is_args$args; (該值為默認值,一般不用設(shè)置)
path設(shè)置緩存數(shù)據(jù)存放的路徑;
levels設(shè)置目錄層級,如levels=1:2,表示有兩級子目錄,第一個目錄名取md5值的倒數(shù)第一個值,第二個目錄名取md5值的第2和3個值。如下圖:
image
keys_zone設(shè)置內(nèi)存zone的名字和大小,如keys_zone=my_zone:10m
inactive設(shè)置緩存多長時間就失效,當硬盤上的緩存數(shù)據(jù)在該時間段內(nèi)沒有被訪問過,就會失效了,該數(shù)據(jù)就會被刪除,默認為10s。
max_size設(shè)置硬盤中最多可以緩存多少數(shù)據(jù),當?shù)竭_該數(shù)值時,nginx會刪除最少訪問的數(shù)據(jù)。
例:proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g
proxy_cache示例
http
{
...;
proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
...;
server
{
listen 80;
server_name www.aminglinux.com;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 2 4k;
proxy_busy_buffers_size 4k;
proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
proxy_max_temp_file_size 20M;
proxy_temp_file_write_size 8k;
location /
{
proxy_cache my_zone;
proxy_pass http://192.168.10.110:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
說明:核心配置為proxy_cache_path那一行。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。