一、Tomcat是什麼
Tomcat是Apache在符合J2EE的JSP、Servlet標準下開發的一個JSP服務器,tomcat側重於servlet引擎,如果以standalone方式運行,可以作爲web服務器來使用,支持JSP;tomcat是由java語言開發的,需要在java虛擬機上進行工作。
二、Tomcat的常見的組件
服務器:Server | Tomcat的一個實例,通常一個JVM只能包含一個Tomcat實例 |
服務:Service | 一個服務組件通常包含一個引擎和與此引擎相關聯的一個或多個連接器 |
連接器:Connector | 負責連接客戶端請求至Servlet容器內的Web應用程序;默認端口爲http協議的8080;ajp協議的8009;https的8443 |
引擎:Engine | 檢查每一個請求的HTTP首部信息以辨別此請求應該發往哪個host或context,並將請求處理後的結果返回的相應的客戶端 |
虛擬主機:Host | 類似於apache的虛擬主機 |
上下文:Context | 配置一個Context最主要的是指定Web應用程序的根目錄,以便Servlet容器能夠將用戶請求發往正確的位置 |
三、Tomcat的配置文件說明
server.xml | Tomcat的主配置文件,包含Service, Connector, Engine,Valve, Hosts主組件的相關配置信息; |
web.xml | 遵循Servlet規範標準的配置文件,用於配置servlet |
catalina.policy | Java相關的安全策略配置文件 |
catalina.properties | Tomcat內部package的定義及訪問相關的控制 |
tomcat-users.xml | 認證時用到的相關角色、用戶和密碼等信息; Tomcat自帶的manager默認情況下會用到此文件 |
logging.properties | 日誌記錄器相關的配置信息 |
四、Tomcat簡單的操作、基於nginx和apache的反向代理實現
前提:在centos7上安裝tomcat軟件包;並啓動,測試訪問!
準備:2臺centos7虛擬主機,node1:172.16.116.231 ; node2:172.16.116.232
# yum install -y tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp # systemctl start tomcat # [root@node1 tomcat]# systemctl start tomcat.service [root@node1 tomcat]# ss -tanl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* LISTEN 0 100 :::8009 :::* LISTEN 0 100 :::8080 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
4.1、部署webapp
deploy:將webapp的源文件放置於目標目錄、配置tomcat服務器能夠基於context.xml文件中定義的路徑來訪問此webapp; 將其特有類通過class loader裝載至tomcat;可以自動部署和手動部署,這裏介紹手動部署中的熱部署,使用Tomcat自帶的manager工具
[root@node1 ~] # cd /etc/tomcat [root@node1 tomcat]# vim tomcat-users.xml <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> [root@node1 tomcat]# systemctl restart tomcat 設置完成後,可以使用tomcat用戶名和對應的密碼訪問Server Status|Manager App|Host Manager
4.2、Host定義
[root@node1 tomcat]# vim server.xml //編輯server.xml文件 <Host name="node1" appBase="/web/webapps" autoDeploy="false"> //添加node1虛擬主機 <Context path="" docBase="" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> //定義日誌格式 </Host> [root@node1 tomcat]# mkdir -pv /web/{logs,webapps} //提供測試頁面 <%@ page language="java" %> <html> <head><title>Tomcat1 on node1</title></head> <body> <h1><font color="red">Tomcat1.node1.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("node1.com","node1.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> ~ windows設置hosts文件: 172.16.116.231 node1
4.3、修改默認虛擬主機的方法
# vim /etc/tomcat/server.xml <Engine name="Catalina" defaultHost="localhost"> //defaultHost設置爲默認的host<name>即可
4.4、LNT實現方法(nginx反向代理用戶請求至tomcat)
[root@node2 ~]# yum install -y nginx //在node2上安裝nginx [root@node2 ~]# vim /etc/nginx/nginx.conf //編輯nginx配置文件,加入下面一句 location / { proxy_pass http://node1:8080/ //將客戶端的所有請求都反向代理至node1 } //如果想動靜分離,靜態請求由nginx響應,動態請求由node1響應,需要進行下面的修改即可 location ~* \.(jsp|do)$ { proxy_pass http://node1:8080/ //動靜分離 }
4.5、LAT實現方法(apache反向代理用戶請求至tomcat)
準備工作;編輯 /etc/httpd/conf/httpd.conf將中心主機的DocumentRoot註釋
4.5.1、mod_proxy_http
[root@node2 ~]# cd /etc/httpd/conf.d/ [root@node2 conf.d]# vim mod_proxy_http.conf <VirtualHost *:80> ServerName node2 //虛擬主機名 ProxyVia On //是否在響應頭部加入via,即代理的主機名 ProxyRequests Off //關閉正向代理 ProxyPreserveHost On <Proxy *> Require all granted //允許所有主機訪問 </Proxy> ProxyPass / http://node1:8080/ ProxyPa***everse / http://node1:8080/ //ProxyPa***everse作用就是反向代理 <Location /> Require all granted </Location> </VirtualHost>
4.5.2、mod_proxy_ajp
AJP(Apache JServ Protocol)是定向包協議。因爲性能原因,使用二進制格式來傳輸可讀性文本。WEB服務器通過 TCP連接 和 SERVLET容器 連接
[root@node2 conf.d]# vim mod_proxy_ajp.conf <VirtualHost *:80> ServerName node2 ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / ajp://node1:8009/ ProxyPa***everse / ajp://node1:8009/ //將協議和端口改爲ajp和8009即可 <Location /> Require all granted </Location> </VirtualHost> //測試沒問題,就不截圖了~~
4.5.3、mod_jk
mod_jk 簡稱JK,是Apache服務器的一個可插入模塊,用以爲Apache提供處理JSP/Servlet的能力。mod_jk實質上是Apache與Tomcat的連接器,並附帶提供集羣和負載均衡的功能。
apxs
是一個爲Apache HTTP服務器編譯和安裝擴展模塊的工具,用於編譯一個或多個源程序或目標代碼文件爲動態共享對象,使之可以用由mod_so提供的LoadModule指令在運行時加載到Apache服務器中。
(1) mod_jk:額外編譯安裝
# yum groupinstall "Development tools" # cd tomcat-connectors-1.2.40-src/native # yum install -y httpd-devel # which apxs /usr/bin/apxs # ./configure --with-apxs=/usr/bin/apxs #make && make install
(2)編輯mod_jk的模板配置文件
[root@node2 conf.d]# vim mod_jk.conf LoadModule jk_module modules/mod_jk.so //讓httpd加載jk模塊 JkWorkersFile /etc/httpd/conf.d/workers.properties //jk的worker文件 JkLogFile logs/mod_jk.log //日誌文件 #JkLogLevel debug JkMount /* Tomcat1 JkMount /status/ stat1
(3)workers配置文件:workers.properties
[root@node2 conf.d]# vim workers.properties worker.list=Tomcat1,stat1 worker.Tomcat1.port=8009 worker.Tomcat1.host=172.16.116.231 worker.Tomcat1.type=ajp13 //mod_jk只能使用ajp13協議 worker.Tomcat1.lbfactor=1 //權重 worker.stat1.type = status //這個頁面最好加入用戶認證
五、tomcat 集羣;實現session會話保持的3種方法介紹
5.1、基於session會話綁定實現方法,nginx和apache測試!
在原來的基礎上再加入一臺虛擬機做反向代理使用;node3:172.16.116.233
5.1.1、nginx負載均衡至後端tomcat方法;基於session會話綁定實現
<1> node1: 172.16.116.231 //配置tomcat1;修改並加入虛擬主機node1 # vim /etc/tomcat/server.xml <Engine name="Catalina" defaultHost="node1"> <Host name="node1" appBase="/web/webapps/" autoDeploy="false" > <Context path="" docBase="" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <2> node2: 172.16.116.232 //配置tomcat2;修改並加入虛擬主機node2, # vim /etc/tomcat/server.xml <Engine name="Catalina" defaultHost="node2"> <Host name="node2" appBase="/web/webapps/" autoDeploy="false" > <Context path="" docBase="" reloadable="true"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <3> node3: 172.16.116.233 //配置nginx負載均衡的反向代理 # vim /etc/nginx/nginx.conf upstream tomcatservs { //在http段加入upstream上游服務器 ip_hash ; //源地址hash,將同一源地址的請求始終定向至某一上游服務器 server node1:8080; //達到session會話綁定的目的 server node2:8080; } location / { //在server段中加入反向代理 proxy_pass http://tomcatservs/ }
5.1.2、apache負載均衡至後端tomcat方法;基於session會話綁定實現
通過apache3種反向代理的方式進行測試
apache: | tomcat |
mod_proxy mod_proxy_http mod_proxy_balancer | http connector //http協議連接器 |
mod_proxy mod_proxy_ajp mod_proxy_balancer | ajp connector //ajp協議連接器 |
mod_jk | ajp connector //ajp協議連接器 |
▲▲▲httpd負載均衡集羣使用到的選項總結▲▲▲
lbfactor表示:後臺服務器負載到由Apache發送請求的權值,該值爲1到100之間的任何值。 BalancerMember:負載均衡集羣中的成員 lbmethod表示:負載載均衡策略。 lbmethod=byrequests 按照請求次數均衡(默認) lbmethod=bytraffic 按照流量均衡 lbmethod=bybusyness 按照繁忙程度均衡(總是分配給活躍請求數最少的服務器) ProxyPass表示:所有請求都會重定向到balancer://lbcluster1/處理。balancer是內置負載。 ProxyPa***everse表示:反向代理,也就是將所有的請求反向代理到負載均衡後的應用url路徑中。 stickysession表示:進行Session複製使用 |
①mod_proxy_http 、http connector
node1 : 172.16.116.231 <Engine name="Catalina" defaultHost="node1" jvmRoute="Tomcat1"> //Engine加入jvmRoute標識 node2 : 172.16.116.232 <Engine name="Catalina" defaultHost="node1" jvmRoute="Tomcat2"> //Engine加入jvmRoute標識 node3 : 172.16.116.233 [root@node3 conf.d]# vim mod_proxy_http.conf header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://lbcluster1> BalancerMember http://172.16.116.231:8080 loadfactor=1 route=Tomcat1 BalancerMember http://172.16.116.232:8080 loadfactor=1 route=Tomcat2 ProxySet stickysession=ROUTEID //根據routeid做session綁定 </proxy> <VirtualHost *:80> ServerName node3 ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://lbcluster1/ //注意,要使用balancer ProxyPa***everse / balancer://lbcluster1/ <Location /> Require all granted </Location> </VirtualHost>
②mod_proxy_ajp、ajp connector
[root@node3 conf.d]# vim mod_proxy_ajp.conf //只需修改這個地方,其它不用修改即可實現 BalancerMember ajp://172.16.116.231:8009 loadfactor=1 route=Tomcat1 BalancerMember ajp://172.16.116.231:8009 loadfactor=1 route=Tomcat1
③mod_jk、ajp connector
[root@node3 conf.d]# vim mod_jk.conf LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/conf.d/workers.properties //集羣worker相關配置 JkLogFile logs/mod_jk.log JkLogLevel error JkMount /* lbcluster1 JkMount /status/ stat1 [root@node3 conf.d]# vim workers.properties worker.list = lbcluster1,stat1 //worker列表 worker.Tomcat1.type = ajp13 //Tomcat1是node1節點上的運行tomcat的jvm標識 worker.Tomcat1.host = 172.16.116.231 //ip或主機名都可以 worker.Tomcat1.port = 8009 worker.Tomcat1.lbfactor = 1 worker.Tomcat2.type = ajp13 //Tomcat2是node2節點上的運行tomcat的jvm標識 worker.Tomcat2.host = 172.16.116.232 //ip或主機名都可以 worker.Tomcat2.port = 8009 worker.Tomcat2.lbfactor = 1 //權重 worker.lbcluster1.type = lb worker.lbcluster1.sticky_session = 0 //是否綁定session會話;0爲不綁定,1爲綁定 worker.lbcluster1.balance_workers = Tomcat1, Tomcat2 //lbcluster1集羣成員 worker.stat1.type = status
5.2、基於session 集羣的方法,也就是session共享
session manager:會話管理器;常用的管理器有4種
StandardManager 標準會話管理器 | |
PersistentManager 持久會話管理器 | FileStore :文件存儲,可以存在nfs服務器上 JDBC :基於jdbc存儲在後端的關係型數據庫中,如mysql |
DeltaManager | Manager用來在節點間拷貝Session,默認使用DeltaManager, DeltaManager採用的一種all-to-all的工作方式,即集羣中的節點會把 Session數據向所有其他節點拷貝,而不管其他節點是否部署了當前應用 |
BackupManager 備用會話管理器 | 當集羣中的節點數量很多並且部署着不同應用時,可以使用 BackupManager,BackManager僅向部署了當前應用的節點拷貝Session |
這裏主要介紹DeltaManager的實現方法:
前端的node3負載均衡的相關配置不需要改變,使用上述3種方式都可以,只需要在tomcat節點上修改;node1:172.16.116.231 ; node2:172.16.116.232 需要做如下的修改 ;根據官方文檔實現
http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
[root@node2 ~]# mkdir /web/webapps/ROOT/{classes,lib,META-INF,WEB-INF} -pv [root@node2 ~]# cp /usr/share/tomcat/webapps/ROOT/WEB-INF/web.xml /web/webapps/ROOT/WEB-INF/ <Host name="node2" appBase="/web/webapps" autoDeploy="false"> <Context path="" docBase="ROOT" reloadable="true"/> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.16.7" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="172.16.116.232" port="4000" autoBind="100" selectorTimeout="5000" </Sender> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> [root@node2 ~]# vim /web/webapps/ROOT/WEB-INF/web.xml <distributable/>
▲▲▲特別要說明的是▲▲▲
tomcat集羣中的session管理,主要有兩種方式:
1).粘性session
表示從同一客戶端發來的請求都將有集羣中的同一個tomcat進行處理。配置方式是在上面的workers.properties文件中
Xml代碼
worker.lbcontroller.sticky_session=1
粘性session的好處在不會在不同的tomcat上來回跳動處理請求,但是壞處是如果處理該session的tomcat崩潰,那麼之後的請求將由其他tomcat處理,原有session失效而重新新建一個新的session,這樣如果繼續從session取值,會拋出nullpointer的訪問異常。
2).session複製
session複製是指tomcat彼此之間通過組播方式將session發到各個tomcat實例上,如果其中一個訪問出錯,則另外tomcat仍然具有有效的session內容,從而能正常接管其session。壞處是當tomcat實例很多,或者用戶在session中有大量操作時,組播發送的信息量十分驚人。session複製配置則是在發佈的web應用程序中的web.xml中添加
Xml代碼
<distributable/>
以上就是這次講到的內容,下次再介紹session服務器的實現方法,基於msm的實現過程! 謝謝O(∩_∩)O~~