在項目運營時,咱們都會遇到一個問題,項目須要更新時,咱們可能需先暫時關閉下服務器來更新。但這可能會出現一些情況:html
1.用戶還在操做,被強迫終止了(咱們能夠看日誌等沒人操做的時候更新,但總可能會有萬一)nginx
2.不知道的用戶可能會想網站是否是被攻擊了,下降了對網站的信任程度,從而致使失去部分潛在客戶,這點尤爲對金融互聯網公司不利。windows
在查了一些資料後,決定採用Tomcat + Nginx + Redis來實現負載均衡和session共享。下面記錄下個人實踐過程,若有錯誤不足之處歡迎大神指點,不喜勿噴。瀏覽器
1.Nginx簡單介紹及開啓緩存
Nginx是一款輕量級兼備高性能的Http和反向代理服務器。所謂反向代理就是指在用戶發起訪問請求,由代理服務器接收,而後將請求轉發給正式服務器,而且將正式服務器處理完的數據返回給客戶端,此時代理服務器就表現爲一個服務器。這麼作看起來多通過了一步,稍顯麻煩,但實則是好處多多,在下面的demo中我會將其體現出來。tomcat
首先咱們去Nginx官網下載個Nginx,我這是在本身電腦上,因此固然下載的是windows版本的。下載完成後直接放在某個盤中便可,不須要安裝。接下去咱們打開cmd,進入nginx的目錄下,輸入start nginx。安全
咱們能夠看到一個窗口一閃而過,這樣nginx就已經被開啓了,咱們在任務管理器中能夠找到它的進程。服務器
如今咱們在瀏覽器中輸入localhost。能夠看到出現一個頁面,雖然簡陋了點,但這確確實實就是nginx的歡迎頁面,就相似tomcat剛啓動完成的locahost:8080的歡迎頁面。session
2.使用Nginx實現反向代理併發
如今咱們搭建一個基於SpringMVC +Spring + Mybaties框架的maven項目,搭建過程不加以贅述。功能很簡單,就是能跳轉到一個頁面就好了,固然也可使用別的框架。
運行demo,我這tomcat端口是8080,在瀏覽器輸入localhost:8080,出現咱們的頁面。
這時咱們仍是直接訪問tomcat服務器的,如今我想經過nginx訪問tomcat,即輸入localhost就能顯示咱們demo的頁面。
這就要咱們去修改nginx的核心配置文件,在其目錄下的conf文件夾下的nginx.conf文件,那麼首先咱們就要了解該文件中一些節點的做用。
worker_processes:工做進程個數,可配置多個
worker_connections:單個進程最大鏈接數
server:每個server至關於一個代理服務器
lister:監聽端口,默認80
server_name:當前服務的域名,能夠有多個,用空格分隔(咱們是本地因此是localhost)
location:表示匹配的路徑,這時配置了/表示全部請求都被匹配到這裏
index:當沒有指定主頁時,默認會選擇這個指定的文件,可多個,空格分隔
proxy_pass:請求轉向自定義的服務器列表
upstream name{ }:服務器集羣名稱
知道了節點做用後,咱們就知道咱們須要修改的文件中的server部分,這是它原有的代碼,我刪除了它註釋部分。如今咱們就能明白爲何輸入localhost,
它訪問的是它歡迎頁面即index.html。
下面咱們對這段代碼進行一些小小修改。就是將請求轉向咱們定義的服務器。
隨後在cmd中輸入命令nginx -s reload便可重啓nginx。
重啓後,咱們再輸入localhost,能夠看到跳轉到的頁面是咱們demo的。
至此,反向代理已完成,這樣全部請求都需通過代理服務器才能訪問到正式服務器,某種程度上能夠保護網站安全。
3.使用Nginx實現負載均衡
負載均衡便是代理服務器將接收的請求均衡的分發到各服務器中。
負載均衡的優點在訪問量少或併發小的時候可能並不明顯,且不說淘寶雙十一、鐵道部搶票這種級別的訪問量、高併發,就是通常網站的搶購活動時,也會給服務器形成很大壓力,可能會形成服務器崩潰。而負載均衡能夠很明顯的減小甚至消除這種狀況的出現,下面咱們說說實現方法。
首先咱們再開啓一個tomcat服務器,這裏區分一下就叫tomcat2吧,原先的叫tomcat1。將tomcat1上的項目,拷貝到tomcat2上,稍微修改下頁面上的文字以便等下區分咱們的請求被分發到了哪一個tomcat上。tomcat2端口我這裏爲8081。在瀏覽器中輸入localhost:8081。
服務器準備好了,咱們要在server外部定義個服務器集羣,即用到了上文中提到的upstream 標籤。服務器集羣名字取爲test。
同時咱們須要再修改下server,將定向的路徑轉到問你服務器集羣上。
重啓下nginx,在瀏覽器輸入localhost,再多刷新幾回,能夠看到兩個頁面在來回切換。
這樣即實現了負債均衡。假設咱們服務器在運行過程當中,其中一個tomcat掛了,仍然還有另外一個能夠訪問。更新的時候也能先關閉只其中一個,輪流更新。另外還能有效緩解服務器壓力,是否是很棒呢?
固然,以上nginx的配置是簡單化的,實際上咱們還能夠配置nginx對靜態資源的緩存等等,在此就很少加演示了。
4.小結
花了好些時間,總算陸陸續續要寫好了,在此小結一下。
nginx做爲一個反向代理服務器,能緩存咱們項目的靜態文件,並實現反向代理與均衡負載,能夠有效減小服務器壓力,即便項目不大,也可使用。
你們另外應該都還發現了個問題,雖然這樣請求能分別請求到兩個tomcat上,若是是通常不需身份校檢的或什麼認證的方法尚可,但若是出現這類狀況:
咱們在tomcat1上進行了登陸,這時用戶session固然是存在tomcat1上的,而這時進入我的中心的請求請求到tomcat2上了,這時就會出現問題了。tomcat2會告訴你還未登陸,這顯然不是咱們想看到的。
這就涉及到session共享了,如何讓兩個服務器上的session共用。我這裏放到下次再說,做爲碼農比較忙,可能要過個好幾天。另外我將此次的demo源碼上傳了,下次還要用,nginx配置就不傳了,你們本身多動手試驗。