nginx反向代理

nginx反向代理

Nginx反向代理

Nginx的工作模式是通知機制,nginx一個進程可以派生出多個線程,依賴線程給用戶提供服務的,一個線程的併發連接請求最大是65535,所以nginx可以提供大量的併發連接請求,但是nginx不如apache穩定,而apache的最大連接請求是1000。如果nginx結合apache共同爲用戶提供請求的話,效果會事半功倍,nginx做反向代理,把用戶的請求轉發給後方的apache,然後把apache發回的結果轉交給用戶。如果是單純的使用反向代理的話,每秒的併發連接請求數並不高,還沒有直接訪問nginx的併發連接請求多,只是可以提供大量的請求,請求數變多,但效率變低了。

反向代理的語法:proxy_passURL;

例子1

在同一局域網中,前端的nginx服務器所在的linux系統的ip地址是192.168.20.200,後方的apache的地址是192.168.20.100.

默認值:

上下文:location,ifinlocation,limit_except

server{

listen80;

server_namewww.abc.com;

#charsetkoi8-r;

#access_loglogs/host.access.logmain;

location/{

roothtml;

indexindex.phpindex.htmlindex.htm;

proxy_passhttp://192.168.20.100;

}

例子2:

server{

listen80;

server_namewww.abc.com;

#charsetkoi8-r;

#access_loglogs/host.access.logmain;

location/name/{

proxy_passhttp://127.0.0.1/remote/;

}

設置後端服務器的協議和地址,還可以設置可選的URI以定義本地路徑和後端服務器的映射關係。這條指令可以設置的協議是http或者https,而地址既可以使用域名或者IP地址加端口(可選)的形式來定義:

proxy_passhttp://localhost:8000/uri/;

又可以使用UNIX域套接字路徑來定義。該路徑接在unix字符串後面,兩端由冒號所包圍,比如:

proxy_passhttp://unix:/tmp/backend.socket:/uri/;

如果解析一個域名得到多個地址,所有的地址都會以輪轉的方式被使用。當然,也可以使用服務器組來定義地址。

請求URI按下面規則傳送給後端服務器:

?如果proxy_pass使用了URI,當傳送請求到後端服務器時,規範化以後的請求路徑與配置中的路徑的匹配部分將被替換爲指令中定義的URI:

location/name/{

proxy_passhttp://127.0.0.1/remote/;

}

?如果proxy_pass沒有使用URI,傳送到後端服務器的請求URI一般客戶端發起的原始URI,如果nginx改變了請求URI,則傳送的URI是nginx改變以後完整的規範化URI:

location/some/path/{

proxy_passhttp://127.0.0.1;

}

在1.1.12版以前,如果proxy_pass沒有使用URI,某些情況下,nginx改變URI以後,會錯誤地將原始URI而不是改變以後的URI發送到後端服務器。

某些情況下,無法確定請求URI中應該被替換的部分:

?使用正則表達式定義路徑。

這種情況下,指令不應該使用URI。

?在需要代理的路徑中,使用rewrite指令改變了URI,但仍使用相同配置處理請求(break):

location/name/{

rewrite/name/([^/]+)/users?name=$1break;

proxy_passhttp://127.0.0.1;

}

這種情況下,本指令設置的URI會被忽略,改變後的URI將被髮送給後端服務器。

後端服務器的地址,端口和URI中都可以使用變量:

proxy_passhttp://$host$uri;

甚至像這樣:

proxy_pass$request;

這種情況下,後端服務器的地址將會在定義的服務器組中查找。如果查找不到,nginx使用resolver來查找該地址。

爲反向代理增加緩

語法:proxy_cache_pathpath[levels=levels]keys_zone=name:size[inactive=time][max_size=size][loader_files=number][loader_sleep=time][loader_threshold=time];

1,proxy_cache_pathpath

上下文:http

設置緩存的路徑和其他參數。緩存數據是保存在文件中的,緩存的鍵和文件名都是在代理URL上執行MD5的結果。levels參數定義了緩存的層次結構。比如,下面配置

proxy_cache_path/data/nginx/cachelevels=1:2keys_zone=one:10m;

把緩存的東西放在/data/nginx/cache這個目錄下面,緩存的目錄級別一級目錄二級目錄,開闢的內存空間10M,用於存放被緩存的數據的符號連接、innod。

2,語法:proxy_set_headerfieldvalue;

默認值:proxy_set_headerHost$proxy_host;proxy_set_headerConnectionclose;

上下文:http,server,location

允許重新定義或者添加發往後端服務器的請求頭。value可以包含文本、變量或者它們的組合。當且僅當當前配置級別中沒有定義proxy_set_header指令時,會從上面的級別繼承配置。默認情況下,只有兩個請求頭會被重新定義:

proxy_set_headerHost$proxy_host;

proxy_set_headerConnectionclose;

如果不想改變請求頭Host的值,可以這樣來設置:

proxy_set_headerHost$http_host;

3,語法:proxy_cachezone|off;

默認值:proxy_cacheoff;

上下文:http,server,location

指定用於頁面緩存的共享內存。同一塊共享內存可以在多個地方使用。off參數可以屏蔽從上層配置繼承的緩存功能。

4,語法:proxy_cache_valid[code...]time;

默認值:

上下文:http,server,location

爲不同的響應狀態碼設置不同的緩存時間。比如,下面指令

proxy_cache_valid20030210m;響應狀態碼是200302的數據被緩存10分鐘

proxy_cache_valid4041m;響應狀態碼是404的數據被緩存10分鐘

設置狀態碼爲200和302的響應的緩存時間爲10分鐘,狀態碼爲404的響應的緩存時間爲1分鐘。

如果僅僅指定了time,

proxy_cache_valid5m;

那麼只有狀態碼爲200、300和302的響應會被緩存。

如果使用了any參數,那麼就可以緩存任何響應:

proxy_cache_valid20030210m;

proxy_cache_valid3011h;

proxy_cache_validany1m;

緩存參數也可以直接在響應頭中設定。這種方式的優先級高於使用這條指令設置緩存時間。X-Accel-Expires響應頭可以以秒爲單位設置響應的緩存時間,如果值爲0,表示禁止緩存響應,如果值以@開始,表示自1970年1月1日以來的秒數,響應一直會被緩存到這個絕對時間點。如果不含X-Accel-Expires響應頭,緩存參數仍可能被Expires或者Cache-Control響應頭設置。如果響應頭含有Set-Cookie,響應將不能被緩存。這些頭的處理過程可以使用指令proxy_ignore_headers忽略。

5,語法:proxy_cache_use_staleerror|timeout|invalid_header|updating|http_500|http_502|http_503|http_504|http_404|off...;

默認值:proxy_cache_use_staleoff;

上下文:http,server,location

如果後端服務器出現狀況,nginx是可以使用過期的響應緩存的。這條指令就是定義何種條件下允許開啓此機制。這條指令的參數與proxy_next_upstream指令的參數相同。

例子

http{

proxy_cache_path/data/nginx/cachelevels=1:2keys_zone=STATIC:10minactive=24hmax_size=1g;

Server{

listen80;

server_namewww.abc.com;

location/{

proxy_set_headerHOST$host;

proxy_cacheSTATIC;

proxy_cache_valid2001d;

proxy_cache_use_staleerrortimeoutinvalid_headerupdatinghttp_500http_502http_503http_504;

}

}

173531799.png

Nginx所在的主機eth0ip地址192.168.20.200eth1ip地址192.168.30.200

後端的apache服務器的地址是192.168.30。100

壓力測試:nginx做緩存測試併發連接請求

Nginx做反向代理和緩存

ab-c100-n1000http://192.168.20.200/

hisisApacheBench,Version2.0.40-dev<$Revision:1.146$>apache-2.0

Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/

Copyright2006TheApacheSoftwareFoundation,http://www.apache.org/

Benchmarking192.168.20.200(bepatient)

Completed100requests

Completed200requests

Completed300requests

Completed400requests

Completed500requests

Completed600requests

Completed700requests

Completed800requests

Completed900requests

Finished1000requests

ServerSoftware:nginx/1.0.11

ServerHostname:192.168.20.200

ServerPort:80

DocumentPath:/

DocumentLength:273bytes

ConcurrencyLevel:100

Timetakenfortests:1.122019seconds1000次連接請求是消耗1.1222019

Completerequests:1000

Failedrequests:0

Writeerrors:0

Totaltransferred:441000bytes

HTMLtransferred:273000bytes

Requestspersecond:891.25[#/sec](mean)

Timeperrequest:112.202[ms](mean)100次併發連接請求是112毫秒

Timeperrequest:1.122[ms](mean,acrossallconcurrentrequests)

Transferrate:383.24[Kbytes/sec]received

ConnectionTimes(ms)

minmean[+/-sd]medianmax

Connect:04930.148120

Processing:28577.65970

Waiting:02515.22657

Total:4710732.1105185

Percentageoftherequestsservedwithinacertaintime(ms)

50%105

66%123

75%133

80%139

90%153

95%160

98%169

99%176

100%185(longestrequest)

Nginx不做反向代理,直接訪問後端的nginx服務器

測試併發連接請求

ab-c100-n1000http://192.168.30.100/

ThisisApacheBench,Version2.0.40-dev<$Revision:1.146$>apache-2.0

Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/

Copyright2006TheApacheSoftwareFoundation,http://www.apache.org/

Benchmarking192.168.30.100(bepatient)

Completed100requests

Completed200requests

Completed300requests

Completed400requests

Completed500requests

Completed600requests

Completed700requests

Completed800requests

Completed900requests

Finished1000requests

ServerSoftware:Apache/2.4.4

ServerHostname:192.168.30.100

ServerPort:80

DocumentPath:/

DocumentLength:273bytes

ConcurrencyLevel:100

Timetakenfortests:17.770227seconds1000次請求一共消耗17秒多

Completerequests:1000

Failedrequests:0

Writeerrors:0

Totaltransferred:458000bytes

HTMLtransferred:273000bytes

Requestspersecond:56.27[#/sec](mean)

Timeperrequest:1777.023[ms](mean)100次併發連接請求是1.7秒多

Timeperrequest:17.770[ms](mean,acrossallconcurrentrequests)

Transferrate:25.15[Kbytes/sec]received

ConnectionTimes(ms)

minmean[+/-sd]medianmax

Connect:027.5052

Processing:2714021529.38159240

Waiting:2613991526.08149239

Total:2814041531.68159266

Percentageoftherequestsservedwithinacertaintime(ms)

50%815

66%1221

75%1681

80%2176

90%3001

95%3716

98%7517

99%7976

100%9266(longestrequest)

所以根據壓力測試,nginx在做反向代理時開啓緩存功能,在接受相同的的併發連接請求時要比直接請求nginx服務器的快17倍還多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章