Tomcat服務器是一個免費的開源web應用服務器,屬於輕量級應用服務器,在中小型系統和併發用戶不是不少的場合中被廣泛使用,是開發和測試JSP程序的首選。通常來講,Tomcat雖然和apache或者Nginx這些web服務器同樣,具備處理HTML頁面的功能,然而因爲其處理靜態頁面的能力遠不如apache或者Nginx,因此Tomcat通常是做爲一個servlet和JSP容器,單獨運行在後端,Tomcat應用場景以下:html
用戶訪問的永遠是apache/Nginx服務器,而後由apache/Nginx服務器轉交給Tomcat服務器處理,全部服務器都鏈接着共享存儲服務器,以便使用戶每次訪問到數據是同樣的,apache/Nginx是用來作調度的,也就是熟知的負載均衡,關於負載均衡很少解釋了。。。java
一般狀況下,一臺Tomcat站點因爲可能出現單點故障及沒法應付過多的客戶複雜多樣的請求等問題,不能單獨應用於生產環境下,因此須要使用負載均衡來解決這些問題。nginx
Nginx是一個很是優秀的http服務器軟件,它可以支持高達50000個併發鏈接數的響應,擁有強大的靜態資源處理能力,運行穩定,而且內存、CPU等系統資源消耗很是低。目前不少大型網站都應用Nginx服務器做爲後端網站程序的反向代理及負載均衡器,來提高整個站點的負載併發能力。web
開始準備工做,搭建下面的環境,爲了簡化,就不部署共享存儲服務器了,環境以下:apache
1、部署前準備:bootstrap
三臺服務器均使用centos7來部署,部署過程當中所用到的軟件以下:vim
2、配置Tomcat服務器:後端
這篇博文以實現最終效果爲目的,若想了解關於Tomcat配置文件的說明及做用,能夠參考博文:http://www.javashuo.com/article/p-xvmpnkif-kq.html 。centos
一、開始在192.168.1.1服務器上部署Tomcat(關於防火牆的配置這裏就省略了,請自行配置防火牆以放行相關流量,我這裏直接停掉了防火牆,Tomcat默認使用的端口號是8080;Nginx默認使用的端口號是80):tomcat
[root@localhost ~]# java -version #查看JDK是否安裝,若沒有,自行安裝 openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) [root@localhost media]# tar zxf apache-tomcat-8.5.16.tar.gz -C /usr/src #解壓Tomcat包 [root@localhost media]# cd /usr/src/ [root@localhost src]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8 #Tomcat不用編譯安裝,解壓後便可用 [root@localhost src]# mkdir -p /web/webapp1 #創建Java的web站點,用於存放網站文件 [root@localhost src]# vim /web/webapp1/index.jsp #創建一個index.jsp的測試頁面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test1 page</title> </head> <body> <% out.println("www.test1111.com");%> </body> </html> [root@localhost src]# vim /usr/local/tomcat8/conf/server.xml #修改Tomcat的主配置文件 ...................................... <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> #定位到該行,而後添加下面兩行內容 <Context docBase="/web/webapp1" path="" reloadable="false"> </Context> #docBase:web應用的文檔默認目錄; #path=""設置默認「類;」 #reloadable設置監視「類」是否變化; [root@localhost ~]# /usr/local/tomcat8/bin/startup.sh #啓動服務,中止服務的話,只需將startup.sh換爲shutdown.sh便可。 Using CATALINA_BASE: /usr/local/tomcat8 Using CATALINA_HOME: /usr/local/tomcat8 Using CATALINA_TMPDIR: /usr/local/tomcat8/temp Using JRE_HOME: /usr Using CLASSPATH: /usr/local/tomcat8/bin/usr/local/tomcat8/bin/tomcat-juli.jar Tomcat started. [root@localhost src]# netstat -antp | grep 8080 #查看默認端口8080是否在監聽狀態 tcp6 0 0 :::8080 :::* LISTEN 13220/java
本機測試訪問:192.168.1.1:8080,看到以下測試頁面:
至此,192.168.1.1的Tomcat就已經配置完成了,另外一臺Tomcat服務器192.168.1.2的配置和192.168.1.1的配置徹底同樣,將上面的配置在192.168.1.2服務器上配置一遍便可,不過爲了測試的時候能夠看出負載均衡的效果,讓咱們能夠看出每次訪問的服務器都不是同一臺,須要將192.168.1.2的Tomcat服務器的測試頁面和192.168.1.1的頁面不同。
不過在實際生產環境中,兩臺Tomcat訪問的必定是使用同一個共享存儲服務器,不論是哪臺服務器向用戶提供服務,用戶接受到的頁面必定是同樣的。
本身在192.168.1.2的服務器上將上面的配置來一遍吧,將192.168.1.2服務器的測試頁面內容更改一下,以下:
[root@localhost src]# vim /web/webapp1/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test1 page</title> </head> <body> <% out.println("www.test22222222222222.com");%> </body> </html>
3、配置Nginx服務器(IP:192.168.1.1):
一、安裝Nginx:
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel #安裝依賴包 [root@localhost ~]# useradd www -s /bin/false #建立運行用戶 [root@localhost media]# tar zxf nginx-1.12.0.tar.gz -C /usr/src #解包 [root@localhost media]# cd /usr/src/nginx-1.12.0/ #切換至該目錄 [root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module && make && make install #編譯安裝 [root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf #編輯主配置文件 ............................. #gzip on; #定位到該行,寫入下面四行 upstream tomcat_server { server 192.168.1.1:8080 weight=1; server 192.168.1.2:8080 weight=1; } #寫到這裏結束 #weight參數表示權重,權重越高,表示被分配到的機率越大。 #爲了測試效果明顯,這裏將權重設置爲同樣 server { listen 80; server_name localhost; ...................... location / { root html; index index.html index.htm; proxy_pass http://tomcat_server; #定位到該{ }中,寫入該行,「http://」後面的名字要和上面添加的upstream項後面的名字一致,纔可實現調度。 }
二、優化Nginx的控制:
[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #建立主程序的連接文件 [root@localhost ~]# vim /etc/init.d/nginx #編輯服務腳本 #!/bin/bash # chkconfig: - 99 20 PROG="/usr/local/nginx/sbin/nginx" PIDF="/usr/local/nginx/logs/nginx.pid" case "$1" in start) $PROG ;; stop) kill -s QUIT $(cat $PIDF) ;; restart) $0 stop $0 start ;; reload) kill -s HUP $(cat $PIDF) ;; *) echo "USAGE:$0 {start | stop | restart | reload}" exit 1 esac exit 0 [root@localhost ~]# chmod +x /etc/init.d/nginx #添加執行權限 [root@localhost ~]# chkconfig --add nginx #添加爲系統服務 [root@localhost nginx-1.12.0]# nginx -t #檢查主配置文件是否有誤 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@localhost ~]# systemctl start nginx #啓動Nginx服務,以確認腳本的正常運行 [root@localhost ~]# netstat -anpt | grep nginx #查看80端口是否處於監聽狀態 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 90475/nginx: master
4、訪問測試:
至此,部署工做已經完成,如今使用客戶機訪問Nginx服務器192.168.1.1測試,效果以下:
第一次訪問將會看到以下界面:
刷新一下網頁將會看到以下界面
能夠看到,咱們訪問的是Nginx服務器,真正處理訪問請求的是Tomcat服務器,並且每次訪問請求都是不一樣的Tomcat服務器來處理,效果也就顯而易見了。
5、寫在最後:部署過程當中遇到的小小問題:
在更改完Tomcat服務器的配置文件後,訪問測試時,看到訪問的依然是Tomcat自帶的默認頁面,有點摸不着頭腦,試着使用以下命令來對Tomcat服務進行幾回啓停後,就行了:
[root@localhost webapp1]# /usr/local/tomcat8/bin/shutdown.sh #中止服務 Using CATALINA_BASE: /usr/local/tomcat8 Using CATALINA_HOME: /usr/local/tomcat8 Using CATALINA_TMPDIR: /usr/local/tomcat8/temp Using JRE_HOME: /usr Using CLASSPATH:/usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar [root@localhost webapp1]# /usr/local/tomcat8/bin/startup.sh #啓動服務 Using CATALINA_BASE: /usr/local/tomcat8 Using CATALINA_HOME: /usr/local/tomcat8 Using CATALINA_TMPDIR: /usr/local/tomcat8/temp Using JRE_HOME: /usr Using CLASSPATH:/usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar Tomcat started.
多是這個服務啓停的問題,沒有深究,這個服務與別的服務都不太同樣:
Nginx服務中止後,查端口號是查不到的,以下:
[root@localhost ~]# systemctl stop nginx [root@localhost ~]# netstat -anpt | grep nginx #Nginx服務中止後,什麼都查不到 [root@localhost ~]#
而Tomcat服務中止後,查端口號會發現,狀態以下(啓動時的Listen狀態變成了TIME_WAIT狀態),等待片刻後,才查不到相關信息:
[root@localhost webapp1]# netstat -antp | grep 8080 tcp6 0 0 ::1:56448 ::1:8080 TIME_WAIT
不深究了,最後效果出來就行了,並且也是第一次碰見這種狀況。