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