1、Nginx介紹
Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務(wù)器,也是一個 IMAP/POP3/SMTP 代理服務(wù)器 。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的Rambler.ru 站點(diǎn)開發(fā)的,它已經(jīng)在該站點(diǎn)運(yùn)行超過四年多了。Igor 將源代碼以類BSD許可證的形式發(fā)布。自Nginx 發(fā)布四年來,Nginx 已經(jīng)因為它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名了。目前國內(nèi)各大門戶網(wǎng)站已經(jīng)部署了Nginx,如新浪、網(wǎng)易、騰訊等;國內(nèi)幾個重要的視頻分享網(wǎng)站也部署了Nginx,如六房間、酷6等。新近發(fā)現(xiàn)Nginx 技術(shù)在國內(nèi)日趨火熱,越來越多的網(wǎng)站開始部署Nginx。
2、為什么使用Nginx
Nginx 是一個高性能Web和反向代理服務(wù)器, 它具有有很多非常優(yōu)越的特性(主要是基于Linux系統(tǒng)闡述的):
l 在高連接并發(fā)的情況下,Nginx是Apache服務(wù)器不錯的替代品: Nginx在美國是做虛擬主機(jī)生意的老板們經(jīng)常選擇的軟件平臺之一. 能夠支持高達(dá) 50,000 個并發(fā)連接數(shù)的響應(yīng), 感謝Nginx為我們選擇了 epoll and kqueue 作為開發(fā)模型.
l Nginx作為負(fù)載均衡服務(wù)器: Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP 程序?qū)ν膺M(jìn)行服務(wù), 也可以支持作為 HTTP代理 服務(wù)器對外進(jìn)行服務(wù). Nginx采用C進(jìn)行編寫, 不論是系統(tǒng)資源開銷還是CPU使用效率都比 Perlbal 要好很多.
l 作為郵件代理服務(wù)器: Nginx 同時也是一個非常優(yōu)秀的郵件代理服務(wù)器(最早開發(fā)這個產(chǎn)品的目的之一也是作為郵件代理服務(wù)器), Last.fm 描述了成功并且美妙的使用經(jīng)驗.
l Nginx 是一個 [#installation 安裝] 非常的簡單 , 配置文件 非常簡潔(還能夠支持perl語法), Bugs 非常少的服務(wù)器: Nginx 啟動特別容易, 并且?guī)缀蹩梢宰龅?*24不間斷運(yùn)行,即使運(yùn)行數(shù)個月也不需要重新啟動. 你還能夠 不間斷服務(wù)的情況下進(jìn)行軟件版本的升級 。
以上都是官方的一些說法,看看網(wǎng)上的一些意見:“4GB內(nèi)存的服務(wù)器+Apache(prefork模式)一般只能處理3000個并發(fā)連接,因為它們將占用3GB以上的內(nèi)存,還得為系統(tǒng)預(yù)留1GB的內(nèi)存。我曾經(jīng)就有兩臺Apache服務(wù)器,因為在配置文件中設(shè)置的MaxClients為4000,當(dāng)Apache并發(fā)連接數(shù)達(dá)到3800時,導(dǎo)致服務(wù)器內(nèi)存和Swap空間用滿而崩潰。而這臺 Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 服務(wù)器在3萬并發(fā)連接下,開啟的10個Nginx進(jìn)程消耗100M內(nèi)存(20MB*10=100M),開啟的250個php-cgi進(jìn)程消耗1G內(nèi)存(4MB*250≈1GB),加上系統(tǒng)自身消耗的內(nèi)存,總共才消耗2GB內(nèi)存。如果服務(wù)器內(nèi)存較小,完全可以只開啟25個php-cgi進(jìn)程,這樣php-cgi消耗的總內(nèi)存數(shù)才100M。在開啟25個php-cgi進(jìn)程的情況下,每分鐘的處理能力只比開啟250個php-cgi進(jìn)程時低了不到一半。”
3、Nginx的安裝
基于李,楊家用的1臺主機(jī),操作系統(tǒng)是Win2003版本的,進(jìn)行安裝配置。
Windows的安裝比較簡單,直接到http://wiki.nginx.org/NginxInstall下載需要的壓縮包,解壓到相應(yīng)目錄(假如是C:/nginx),點(diǎn)擊目錄下面的nginx.exe即可啟動。
4、動靜分離和負(fù)載均衡的準(zhǔn)備工作
l Host配置:
127.0.0.1 yangli.com
l 服務(wù)器:win2003 1臺
l Web容器:Tomcat 6(8888端口)、Resin(8080端口)
Tomcat和resin都部署相同應(yīng)用,getUsers.jsp作為測試頁面。
l 反向代理服務(wù)器:Nginx-0.8.34.zip
靜態(tài)目錄路徑:e:/home/htmlfile/getUsers.html
l 項目部署:普通web項目,例如:example
Ø Resin-3.0.26配置:
<host id="yangli.com" root-directory=".">
<web-app id="/" document-directory="E:/example/webapp"/>
</host>
Ø Apache-tomcat-6.0.26 配置文件:
D:\apache-tomcat-6.0.26\webapps\examples
修改:D:\apache-tomcat-6.0.26\conf\server.xml
增加:
<Host name="yangli.com" appBase="D:\apache-tomcat-6.0.26\webapps\examples"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="D:\apache-tomcat-6.0.26\webapps\examples">
</Context>
</Host>
主要是為了解決訪問tomcat服務(wù)器的時候,
不需要http://yangli.com:8888/examples/getUser.jsp
可以直接訪問:http://yangli.com:8888/getUser.jsp
具體說明,可以上網(wǎng)搜搜。
l 實(shí)現(xiàn)原理圖:
配置原理圖
5、動靜分離
假設(shè)后端只有一臺web服務(wù)器,配置如下:
upstream yangli.com {
server 127.0.0.1:8888;
#tomcat
}
server {
listen 2010;
server_name yangli.com;
access_log off;
location / {
root e:/home/htmlfile;
index index.html index.htm;
if (!-f $request_filename) {
rewrite ^/([a-zA-Z]+).html /$1.jsp last;
proxy_pass http://yangli.com;
break;
}
}
}
注明:如果是靜態(tài)文件將定位到:e:/home/htmlfile; 目錄
如果e:/home/htmlfile不存在該文件,則請求到后端服務(wù)器:
這里使用了rewrite規(guī)則rewrite ^/([a-zA-Z]+).html /$1.jsp last;
if (!-f $request_filename) {
rewrite ^/([a-zA-Z]+).html /$1.jsp last;
proxy_pass http://yangli.com;
break;
}
當(dāng)我們請求:
此時:訪問的是E:\home\htmlfile\2010.html
當(dāng)我們訪問:
根據(jù)rewrite規(guī)則,實(shí)際請求到了:127.0.0.1:8888上的tomcat進(jìn)行處理,這樣子就實(shí)現(xiàn)了動靜分離,而對于用戶來說,感覺只是僅僅訪問了html頁面。
同樣測試Resin,也是成功的。
6、負(fù)載均衡
1. Nginx 負(fù)載均衡基礎(chǔ)知識
nginx的upstream目前支持4種方式的分配
1)、輪詢(默認(rèn))
每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動剔除。
2)、weight
指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況。
2)、ip_hash
每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題。
3)、fair(第三方)
按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。
4)、url_hash(第三方)
在需要使用負(fù)載均衡的server中增加
proxy_pass http://yangli.com;
每個設(shè)備的狀態(tài)設(shè)置為:
a) down 表示單前的server暫時不參與負(fù)載
b) weight 默認(rèn)為1.weight越大,負(fù)載的權(quán)重就越大。
c) max_fails :允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤
d) fail_timeout:max_fails次失敗后,暫停的時間。
e) backup: 其它所有的非backup機(jī)器down或者忙的時候,請求backup機(jī)器。所以這臺機(jī)器壓力會最輕。
修改配置如下:
upstream yangli.com {
server 127.0.0.1:8888;
#tomcat
server 127.0.0.1:8080 backup;
#resin
}
下面來測試一下:
實(shí)際上訪問了:
由于:resin設(shè)為backup,那么當(dāng)tomcat宕機(jī)了,nginx會將請求發(fā)送到resin服務(wù)器,此時resin接管了tomcat,為外界提供服務(wù)。
測試如下:
1、關(guān)閉tomcat服務(wù)器
執(zhí)行:D:\apache-tomcat-6.0.26\bin\shutdown.bat
表明tomcat已經(jīng)被關(guān)閉
2、訪問http://yangli.com:2010/getUsers.html
請求到resin服務(wù)器上了。
3、啟動tomcat服務(wù)器:
D:\apache-tomcat-6.0.26\bin\startup.bat
頁面訪問正常
4、訪問http://yangli.com:2010/getUsers.html
由于tomcat工作正常,于是又接管,作為主服務(wù)器進(jìn)行工作。
7、總結(jié)
本文主要闡述了利用Nginx實(shí)現(xiàn)動靜分離和負(fù)載均衡,其中后端服務(wù)器使用了Resin和Tomcat,旨在表明Nginx并不關(guān)心后端服務(wù)器類型,只要后端服務(wù)器部署了相同的應(yīng)用,訪問正常即可。
最后附上nginx配置:
upstream yangli.com {
server 127.0.0.1:8888;
server 127.0.0.1:8080 backup;
}
server {
listen 2010;
server_name yangli.com;
access_log off;
location / {
root e:/home/htmlfile;
index index.html index.htm;
if (!-f $request_filename) {
rewrite ^/([a-zA-Z]+).html /$1.jsp last;
proxy_pass http://yangli.com;
break;
}
}
}
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/jooben/archive/2010/04/06/5454995.aspx