nginx負載均衡以及靜態資源的反向代理實施方案html
做者:袁旭雲前端
nginx (發音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。 其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站用戶有:新浪、網易、 騰訊,另外知名的微網誌Plurk也使用nginx。java
本文全部的配置都基於win7 64位操做系統進行相關配置,不適用與其餘類型的操做系統。nginx下配置兩臺tomcat,結構以下圖:nginx
所用到的資源清單以下git
nginx/Windows-1.10.1 Windows系統穩定版github
Tomcat7 (後面高級部分有session同步機制 因此tomcat須要使用7 )web
jdk7 64位redis
(不須要session同步時不須要)apache
Redis-x64-3.2.100windows
commons-pool2-2.0.jar
jedis-2.5.2.jar
tomcat-redis-session-manager1.2.jar
不管是高併發仍是通常大應用程序,經過nginx來處理靜態頁面要比經過Tomcat處理在性能方面好不少,因此用nginx處理靜態資源理論上可以提高系統性能的。單機部署項目雖然可以節省硬件成本,可是在產品更新迭代的時候因爲系統不得不關閉,或者是因爲硬件故障形成服務器宕機,多多少少會給用戶的使用帶來必定的影響。高併發下單機部署服務器壓力會更大,這個時候負載均衡顯得尤爲重要。經過nginx能夠實現單服務器的靜態資源本地化,也能夠實現tomcat集羣的負載均衡,配合其餘資源還能實現session的共享等等。基於上面這些特性,能夠輕鬆的實現負載均衡,更新迭代能零宕機,作到用戶體驗和性能的雙提高。
無session同步,無靜態文件本地化,只作負載均衡。tomcat X 2 + nginx,jdk、tomcat相關配置及下載自行查閱相關資料,本文不作介紹
http://nginx.org/en/download.html ,這裏咱們推薦下載穩定版(stable versions)
nginx-
|_ conf 配置目錄
|_ contrib
|_ docs 文檔目錄
|_ logs 日誌目錄
|_ temp 臨時文件目錄
|_ html 靜態頁面目錄
|_ nginx.exe 主程序
window下安裝Nginx極其簡單,解壓縮到一個無空格的英文目錄便可(我的習慣,擔憂中文出問題),雙擊nginx啓動,這裏我解壓縮到到:C:\service目錄。
DOS環境啓動
若是想中止nginx,dos環境運行命令:nginx -s stop
從新加載配置 nginx -s reload
nginx配置文件默認在conf目錄,主要配置文件爲nginx.conf,下面是nginx做爲前端反向代理服務器的配置。
多的就再也不截圖,文件在這裏
對於tomcat你們都很熟悉,只須要修改server.xml配置文件便可,這裏咱們以apache-tomcat-7.0.70爲例,注意:一臺服務器開多tomcat須要修改,若是是不在一臺服務器,則不用。
第一處端口修改:
<!-- 修改port端口:18006 倆個tomcat不能重複,端口隨意,別過小-->
<Server port="18006" shutdown="SHUTDOWN">
第二處端口修改:
<!-- port="18081" tomcat監聽端口,隨意設置,別過小 -->
<Connector port="18081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
第三處端口修改:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
首先測試nginx配置是否正確,測試命令:nginx -t (默認驗證:conf\nginx.conf),也能夠指定配置文件路徑。
其次驗證tomcat,啓動兩個tomcat,不出現端口衝突即爲成功(tomcat依賴的java等搞「挨踢」的就廢話不說了)
最後驗證配置負載均衡設置,http://localhost/ 或http://localhost/index.jsp 。我修改了index.jsp頁面,增長日誌輸出信息,便於觀察。注意:左上角小貓頭上的:access tomcat二、access tomcat1。說明訪問了不一樣的tomcat。
至此window下nginx+tomcat負載均衡配置結束,關於tomcat Session的問題一般是採用memcached,或者採用nginx_upstream_jvm_route ,他是一個 Nginx 的擴展模塊,用來實現基於 Cookie 的 Session Sticky 的功能。若是tomcat過多不建議session同步,server間相互同步session很耗資源,高併發環境容易引發Session風暴。請根據本身應用狀況合理採納session解決方案。
採用這種方式,能夠隨機的訪問到某一臺服務器,減輕服務器壓力,同時在進行程序更新的時候(server 127.0.0.1:7001 down;),也能保證有一臺服務器在處於工做狀態,對新登陸系統的用戶不受影響。
無session同步,靜態文件本地化+負載均衡,Tomcat在高併發環境下處理動態請求時性能很低,而在處理靜態頁面更加脆弱。雖然Tomcat的最新版本支持epoll,可是經過Nginx來處理靜態頁面要比經過Tomcat處理在性能方面好不少。
假設分析發現系統將ext2部署在同級目錄中,ext2文件夾下所有爲靜態文件;
首先拷貝ext2文件夾到磁盤,如圖
展開看看 如圖
那麼如何將以/ext2請求的文件攔截下來呢?這時候就要說一說nginx的url攔截配置了。如圖
詳細的解釋官方文檔也有說明,這裏就很少說了。
本文配置以下
location ^~ /ext2/ {
root F:/statics;
expires 30d;
}
這裏特別要注意,ext2這個文件夾是必定要存在的 而且要在 statics文件夾裏面,這也就是root F:/statics; 的緣由了,最終當帶有ext2的url就會指向 F:/statics /ext2下面了,若是root F:/statics/ext2,這是不對了,這樣會404,這裏相信有很多人遇到,重點說下。
在cmd窗口執行(關閉tomcat 試試)
nginx -s reload
訪問xxx/ ext2/index.html,看到了吧 成功出現下面的頁面如圖
看到了沒,靜態文件成功的指向了本地磁盤;
採用這種方式,能夠隨機的訪問到某一臺服務器,減輕服務器壓力,同時在進行程序更新的時候(server 127.0.0.1:7001 down;),也能保證有一臺服務器在處於工做狀態,對新登陸系統的用戶不受影響。同時經過Nginx來處理靜態頁面要比經過Tomcat處理在性能方面好不少。
session共享+靜態文件本地化+負載均衡,memcached(嘗試失敗),或者採用nginx_upstream_jvm_route(沒有windows版本的),本文采用基於nginx + tomcat redis分佈式web應用的session共享配置,這裏有記點先說明下,首先咱們是要在windows系統下進行這些工做的,前面文檔開頭就有說的,這裏在再說下,win7 64 位,非64位 下面的步驟就不用嘗試了,本文中tomcat-redis-session-manager1.2.jar 只能在tomcat7下使用,這個是本身編譯好的;
Redis對於Linux是官方支持的,安裝和使用沒有什麼好說的,普通使用按照官方指導,5分鐘之內就能搞定。詳情請參考:http://redis.io/download ,但有時候又想在windows下折騰下Redis,能夠從redis下載頁面看到以下提示(在頁面中搜索 "windows"):
[plain] view plain copy
Win64 Unofficial The Redis project does not directly support Windows,
however the Microsoft Open Tech group develops and maintains
an Windows port targeting Win64.
大意就是 Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上開發了一個Win64的版本,項目地址是:
https://github.com/MSOpenTech/redis
打開之後,能夠直接使用瀏覽器下載,或者git克隆。
下載地址: https://github.com/MSOpenTech/redis/releases
網上參考了一些資料,發覺可使用,也就沒有深究,直接拿來主義: 閱讀原文
要求把新開發的代碼推送到到生產系統中部署,生產系統要可以零宕機、對使用用戶零影響。個人設想是使用集羣來搞定,經過通知負載均衡Nginx,取下集羣中的Tomcat節點,而後對Tomcat上的應用進行升級,再通知負載均衡Nginx,把Tomcat節點從新加載上去。依次這麼作,把集羣中的全部Tomcat都替換一次便可。那麼問題來了,在取下Tomcat節點和加載新Tomcat節點時如何作到對用戶無影響呢?方法很簡單,共享Session。咱們要使用tomcat-redis-session-manager這樣的第三方庫,主頁見:
https://github.com/jcoleman/tomcat-redis-session-manager
要注意此庫並不是開箱即用的,使用時須要作一些調整你須要下載源碼,並在更新了依賴庫的版本後重建項目。構建過程這裏就很少寫 。
正式開始配置tomcat,先拷貝jar到lib目錄哪幾個jar 見下圖
開始配置tomcat 打開 context.xml 編輯
加入下面代碼 (注意了 tomcat-redis-session-manager 你若是直接用官方的話, 這裏啓動tomcat以後就會保錯的 這個要你本身編譯的 )
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />
開始測試了
啓動 nginx 、redis、tomcat一、 tomcat2
訪問
xxx/s.jsp(s.jsp 本身寫的一個 顯示session的)
運行截圖以下
session id同樣了,這就說明兩臺服務器session實現了共享,取下一臺服務器,咱們看看能不能正常切過來,取下一個節點,例如
#server 127.0.0.1:9090 weight=2 max_fails=2 fail_timeout=10s;
server 127.0.0.1:9090 down;
再訪問看看有會不會有錯誤呢
取下前
取下後
看到了吧 session不變,都轉發到tomcat2了,重啓tomcat1 以後再看看,如圖
採用這種方式,能夠隨機的訪問到某一臺服務器,減輕服務器壓力,同時在進行程序更新的時候(server 127.0.0.1:7001 down;),也能保證有一臺服務器在處於工做狀態,可以零宕機、對使用用戶零影響。同時經過Nginx來處理靜態頁面要比經過Tomcat處理在性能方面好不少。