首先探討一下為什麼要使用nginx:
1、類似於apache+resin,nginx用於提供靜態頁面服務,比java伺服器要強。雖然這些java伺服器的效能都不賴,tomcat新版甚至還支援了epoll,但是用nginx來處理靜態檔案是一定比這些伺服器更穩妥並更快速的。
2、nginx在配合java應用伺服器時相比apache耦合度更低,所以它可以用相同的方
式連上所有能支援http服務能力的java應用伺服器,無論是tomcat、resin、weblogic、jetty、websphere……,並且
可以輕易地將一個應用同時串連不相同的伺服器。譬如一台跑tomcat,一台跑resin,這一點在切換或測試生產環境時非常有用。另外耦合度的降低,將
使nginx和這些伺服器之間的相互影響降到最低,這樣兩者就能各盡其責,apache一般是採用一個模組來和java應用伺服器打交道,這個模組是會對
apache的運行或多或少產生影響的,nginx告訴我們這些模組是多麼的雞肋,java伺服器要不就往fastcgi協議支援方面發展會更好。
3、nginx的一些特性可以保住脆弱的java伺服器。其中可以點名的:1是可細緻定製的負載平衡策略;2是超強的故障屏蔽功能可以做到不遺漏任何一個請求;3是用戶端串連的非同步處理;4是比java伺服器強上百倍的負荷能力。
綜合這些優點,一般的java應用伺服器,接上一個nginx後,在服務穩定性上將可匹敵數萬美金的大型java叢集伺服器,java開發人員就不用再為java效能方面發愁了。
如果決定試用一下nginx,那接下來的事就比吐口水輕鬆得多了。
nginx可以用兩種方式去接java後台:
1、將jsp副檔名的請求發往後台,這是比較傳統的方式
2、將所有請求都發往後台,而將一些靜態檔案的目錄留下
3、將所有請求都發往後台,而將某種副檔名的連結留下
這三種方式都是利用連結特徵處理的,舉例說明(例子中是伺服器是單機):
首先配置一個upstream,這是通用的:
upstream www.sudone.com {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
127.0.0.1:8081和127.0.0.1:8082就是後端伺服器了,resin支
持兩種方式服務,一種是引擎方式用於串連apache和IIS,另一種是http
server方式,一定要啟動的是http伺服器方式的,這樣這兩個連接埠才有效。tomcat我不太清楚,如果有兩種方式,也一定要啟動http
server方式,檢查的辦法是通過一個連結要能夠直接存取得到頁面。
針對副檔名的策略的配置:
server {
listen 80;
server_name www.sudone.com;
location / {
root /data/html/;
rewrite "^/([0-9]+)\.html$" /a.jsp?id=$1 last;
}
location ~ (\.jsp)|(\.do)$ {
proxy_pass http://www.sudone.com;
}
}
需要注意的事項是:
1、location ~
(\.jsp)|(\.do)$這一段中的proxy_pass標籤後面一定不要寫/,也不能多寫/jsp,例如不能寫成proxy_pass
http://www.sudone.com/;,原因是location如果用到Regex,則不能在proxy_pass中含有連結路徑。
2、server_name
www.sudone.com;指定的是使用者訪問nginx時用的網域名稱,proxy_pass
http://www.sudone.com;這個是nginx
upstream的名稱,同時是nginx訪問後台用的網域名稱,多數情況下用相同名稱就可以了,有一些特殊情況需要用到不相同名稱的,則要確保後台不會因為
這一點惹出亂子。
3、rewrite直接寫在location /下面就可以了,不能寫在location ~ (\.jsp)|(\.do)$裡面,注意rewrite後面的參數在這裡一定要是last。
4、我在此配置裡僅僅配置了jsp和do,當然java還不只支援這麼多,所以要找到所有java連結規則才可以。
把所有請求都發往背景配置(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/;
}
}
這兩種配置和針對jsp副檔名的原理剛好是反的,注意事項:
1、和針對jsp副檔名不同,在proxy_pass http://www.sudone.com;這裡,因為沒有用到Regex,所以可以在後面寫/,亦可支援/jsp。
2、location /images/這一段用alias會能看得比較清楚,也可以用root標籤,不過這時就應該寫成:root /data/html/,提前一級。
3、location ~ (\.jpg)|(\.gif)|(\.png)$這一段只能用root標籤,不能寫alias,location用正則後再用alias的話nginx不支援,我也想不清楚用alias的話邏輯會是怎樣的。
以上配置都是最簡化的配置,還有很多參數可以調整,我在我其他文章裡會有所講述。另外提醒,要好好測試,有問題先思考,這些配置都不是萬能配置還不足以能解決所有情況,同時這幾種配置也沒有優劣之說,如果不確定用哪種,採用第一種方式就可以了。