
一、nginx
Nginx (發音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。 其特點是占有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁伺服器中表現較好。目前中國大陸使用nginx網站用戶有:新浪、網易、 騰訊,另外知名的微網志Plurk也使用nginx。
廢話不多說, 先上圖...

二、Tomcat
tomcat服務器就不用多說了吧。我們可以准備2、3個tomcat服務器進行測試。廢話不多說,准備環境走起...
三、環境准備
1、 jdk 1.8.0_102
2、nginx 1.12.0(在官網上下一個解壓就行,官網:http://nginx.org/);
3、2個或多個tomcat 6.x 7.x 8.x 9.x 都可以(比如我准備的是3個一模一樣的8.x版本,只是配置文件改了而已,一會會詳細怎么改 ,官網:http://tomcat.apache.org/)
四、nginx配置文件
路徑:\nginx-1.12.0\conf\nginx.conf
配置如下:
五、Tomcat配置文件
apache-tomcat-8.5.16.1\conf\server.xml
...
<Server port="18006" shutdown="SHUTDOWN">
...
<Connector port="18081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
...
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
...
apache-tomcat-8.5.16.2\conf\server.xml
...
<Server port="18007" shutdown="SHUTDOWN">
...
<Connector port="18082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
...
<Connector port="28009" protocol="AJP/1.3" redirectPort="8443" />
...
apache-tomcat-8.5.16.3\conf\server.xml
...
<Server port="18008" shutdown="SHUTDOWN">
...
<Connector port="18083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
...
<Connector port="38009" protocol="AJP/1.3" redirectPort="8443" />
...
OK,需要配置的就配置好了,我們再做一件事,我們選用歡迎頁,為了區別歡迎頁,我們修改一下index.jsp頁面,apache-tomcat-8.5.16.1\webapps\ROOT\index.jsp,隨意區分一下就好。然后分別啟動nginx和三個tomcat(nginx.exe、startup.bat)


(因為編譯器不讓我放圖片,放一個網上找的,真的日狗,在網頁上復制圖片粘貼可以,更日血的是,自己寫一個簡單靜態頁面加載截圖不能復制圖片粘貼。。。)
因為我們在上面說了,改tomcat的歡迎頁,所以每次刷新的時候呢,三個歡迎頁就會輪流替換,在實際項目中也是一樣的原理,但是有一點不足,session共享問題,這么做session是不共享的。也是不滿足高並發,這只是一個演示的demo。
查了一些資料,看了一些別人寫的文檔,總結如下,實現nginx session的共享
服務器有多台,用nginx做負載均衡,這樣同一個IP訪問同一個頁面會被分配到不同的服務器上,如果session不同步的話,就會出現很多問題,比如說最常見的登錄狀態,下面提供了幾種方式來解決session共享的問題:
1、不使用session,換用cookie session是存放在服務器端的,cookie是存放在客戶端的,我們可以把用戶訪問頁面產生的session放到cookie里面,就是以cookie為中轉站。你訪問web服務器A,產生了session然后把它放到cookie里面,當你的請求被分配到B服務器時,服務器B先判斷服務器有沒有這個session,如果沒有,再去看看客戶端的cookie里面有沒有這個session,如果也沒有,說明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到服務器B,這樣就可以實現session的同步了。
說明:這種方法實現起來簡單,方便,也不會加大數據庫的負擔,但是如果客戶端把cookie禁掉了的話,那么session就無從同步了,這樣會給網站帶來損失;cookie的安全性不高,雖然它已經加了密,但是還是可以偽造的。
2、session存在數據庫(MySQL等)中 后台可以配置將session保存在數據庫中,這種方法是把存放session的表和其他數據庫表放在一起,如果mysql也做了集群了話,每個mysql節點都要有這張表,並且這張session表的數據表要實時同步。
說明:用數據庫來同步session,會加大數據庫的IO,增加數據庫的負擔。而且數據庫讀寫速度較慢,不利於session的適時同步。
3、session存在memcache或者Redis中 memcache可以做分布式,配置文件中設置存儲方式為memcache,這樣會建立一個session集群,將session數據存儲在memcache中。
說明:以這種方式來同步session,不會加大數據庫的負擔,並且安全性比用cookie大大的提高,把session放到內存里面,比從文件中讀取要快很多。但是memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。
4、nginx中的ip_hash技術能夠將某個ip的請求定向到同一台后端,這樣一來這個ip下的某個客戶端和某個后端就能建立起穩固的session,ip_hash是在upstream配置中定義的:
ip_hash是容易理解的,但是因為僅僅能用ip這個因子來分配后端,因此ip_hash是有缺陷的,不能在一些情況下使用:
1.nginx不是最前端的服務器。 ip_hash要求nginx一定是最前端的服務器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那么nginx取ip時只能得到squid的服務器ip地址,用這個地址來作分流是肯定錯亂的。
2.nginx的后端還有其它方式的負載均衡。 假如nginx后端又有其它負載均衡,將請求又通過另外的方式分流了,那么某個客戶端的請求肯定不能定位到同一台session應用服務器上。這么算起來,nginx后端只能直接指向應用服務器,或者再搭一個squid,然后指向應用服務器。最好的辦法是用 location作一次分流,將需要session的部分請求通過ip_hash分流,剩下的走其它后端去。
5、upstream_hash 為了解決ip_hash的一些問題,可以使用upstream_hash這個第三方模塊,這個模塊多數情況下是用作url_hash的,但是並不妨礙將它用來做session共享。它的原理是這樣的:瀏覽器A去訪問nginx,nginx根據IP的hash去訪問某一個服務器,至此,以后的每次訪問都會是這個服務器在運作,所以才有的session同步,瀏覽器B、C、D...也去訪問nginx,nginx還會根據B、C、D的IP_hash訪問的服務器可能還是原來的服務器也有可能是新的服務器。它們之后的訪問都會是各自第一次訪問你的服務器,只有服務器崩了,才會去別的服務器,從而實現session共享。