首先探討一下為什么要使用nginx:
1、類似于apache+resin,nginx用于提供靜態(tài)頁(yè)面服務(wù),比java服務(wù)器要強(qiáng)。雖然這些java服務(wù)器的性能都不賴,tomcat新版甚至還支持了epoll,但是用nginx來(lái)處理靜態(tài)文件是一定比這些服務(wù)器更穩(wěn)妥并更快速的。
2、nginx在配合java應(yīng)用服務(wù)器時(shí)相比apache耦合度更低,所以它可以用相同的方式連上所有能支持http服務(wù)能力的java應(yīng)用服務(wù)器,無(wú)論是tomcat、resin、weblogic、jetty、websphere……,并且可以輕易地將一個(gè)應(yīng)用同時(shí)連接不相同的服務(wù)器。譬如一臺(tái)跑tomcat,一臺(tái)跑resin,這一點(diǎn)在切換或測(cè)試生產(chǎn)環(huán)境時(shí)非常有用。另外耦合度的降低,將使nginx和這些服務(wù)器之間的相互影響降到最低,這樣兩者就能各盡其責(zé),apache一般是采用一個(gè)模塊來(lái)和java應(yīng)用服務(wù)器打交道,這個(gè)模塊是會(huì)對(duì)apache的運(yùn)行或多或少產(chǎn)生影響的,nginx告訴我們這些模塊是多么的雞肋,java服務(wù)器要不就往fastcgi協(xié)議支持方面發(fā)展會(huì)更好。
3、nginx的一些特性可以保住脆弱的java服務(wù)器。其中可以點(diǎn)名的:1是可細(xì)致定制的負(fù)載均衡策略;2是超強(qiáng)的故障屏蔽功能可以做到不遺漏任何一個(gè)請(qǐng)求;3是客戶端連接的異步處理;4是比java服務(wù)器強(qiáng)上百倍的負(fù)荷能力。
綜合這些優(yōu)點(diǎn),一般的java應(yīng)用服務(wù)器,接上一個(gè)nginx后,在服務(wù)穩(wěn)定性上將可匹敵數(shù)萬(wàn)美金的大型java集群服務(wù)器,java開發(fā)者就不用再為java性能方面發(fā)愁了。
如果決定試用一下nginx,那接下來(lái)的事就比吐口水輕松得多了。
nginx可以用兩種方式去接java后臺(tái):
1、將jsp擴(kuò)展名的請(qǐng)求發(fā)往后臺(tái),這是比較傳統(tǒng)的方式
2、將所有請(qǐng)求都發(fā)往后臺(tái),而將一些靜態(tài)文件的目錄留下
3、將所有請(qǐng)求都發(fā)往后臺(tái),而將某種擴(kuò)展名的鏈接留下
這三種方式都是利用鏈接特征處理的,舉例說(shuō)明(例子中是服務(wù)器是單機(jī)):
首先配置一個(gè)upstream,這是通用的:
upstream
www.sudone.com {
server 127.0.0.1:8081;
server127.0.0.1:8082;
}
127.0.0.1:8081和127.0.0.1:8082就是后端服務(wù)器了,resin支持兩種方式服務(wù),一種是引擎方式用于連接apache和IIS,另一種是httpserver方式,一定要啟動(dòng)的是http服務(wù)器方式的,這樣這兩個(gè)端口才有效。tomcat我不太清楚,如果有兩種方式,也一定要啟動(dòng)httpserver方式,檢查的辦法是通過(guò)一個(gè)鏈接要能夠直接訪問(wèn)得到頁(yè)面。
針對(duì)擴(kuò)展名的策略的配置:
server {
listen80;
server_name
www.sudone.com;location/ {
root /data/html/;
rewrite "^/([0-9]+)\.html$" /a.jsp?id=$1last;
}
location ~ (\.jsp)|(\.do)$ {
proxy_pass
http://www.sudone.com;}
}
需要注意的事項(xiàng)是:
1、location ~(\.jsp)|(\.do)$這一段中的proxy_pass標(biāo)簽后面一定不要寫/,也不能多寫/jsp,例如不能寫成proxy_pass
http://www.sudone.com/;,原因是location如果用到正則表達(dá)式,則不能在proxy_pass中含有鏈接路徑。
2、server_name
www.sudone.com;指定的是用戶訪問(wèn)nginx時(shí)用的域名,proxy_pass
http://www.sudone.com;這個(gè)是nginxupstream的名稱,同時(shí)是nginx訪問(wèn)后臺(tái)用的域名,多數(shù)情況下用相同名稱就可以了,有一些特殊情況需要用到不相同名稱的,則要確保后臺(tái)不會(huì)因?yàn)檫@一點(diǎn)惹出亂子。
3、rewrite直接寫在location /下面就可以了,不能寫在location ~(\.jsp)|(\.do)$里面,注意rewrite后面的參數(shù)在這里一定要是last。
4、我在此配置里僅僅配置了jsp和do,當(dāng)然java還不只支持這么多,所以要找到所有java鏈接規(guī)則才可以。
把所有請(qǐng)求都發(fā)往后臺(tái)的配置(2和3一起寫了):
server{
listen 80;
server_name
www.sudone.com;location / {
proxy_pass
http://www.sudone.com;}
location/images/ {
alias /data/html/images/;
}
location ~(\.jpg)|(\.gif)|(\.png)$
{
root /data/html/;
}
}
這兩種配置和針對(duì)jsp擴(kuò)展名的原理剛好是反的,注意事項(xiàng):
1、和針對(duì)jsp擴(kuò)展名不同,在proxy_pass
http://www.sudone.com;這里,因?yàn)闆](méi)有用到正則表達(dá)式,所以可以在后面寫/,亦可支持/jsp。
2、location/images/這一段用alias會(huì)能看得比較清楚,也可以用root標(biāo)簽,不過(guò)這時(shí)就應(yīng)該寫成:root /data/html/,提前一級(jí)。
3、location ~(\.jpg)|(\.gif)|(\.png)$這一段只能用root標(biāo)簽,不能寫alias,location用正則后再用alias的話nginx不支持,我也想不清楚用alias的話邏輯會(huì)是怎樣的。
以上配置都是最簡(jiǎn)化的配置,還有很多參數(shù)可以調(diào)整,我在我其他文章里會(huì)有所講述。另外提醒,要好好測(cè)試,有問(wèn)題先思考,這些配置都不是萬(wàn)能配置還不足以能解決所有情況,同時(shí)這幾種配置也沒(méi)有優(yōu)劣之說(shuō),如果不確定用哪種,采用第一種方式就可以了