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;
}
}
}
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倍還多。