Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,按照Sun Microsystems提供的技術規範,實現了對Servlet和JavaServer Page(JSP)的支持,並提供了做爲web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閾等。可是不能將Tomcat和Apache HTTP服務器混淆,Apache HTTP服務器時一個用C語言實現的HTTP web服務器,而Tomcat則是由Java編寫。css
(1)apache安裝html
[root@web~]#yum install -y httpd
java
[root@web~]#systemctl enable httpd
#設置開機啓動mysql
[root@web~]#systemctl start httpd.service
#啓動服務nginx
(2)修改配置文件httpd.confgit
基於http鏈接github
查看是否有支持http協議的代理模塊web
[root@web/etc/httpd/conf]#httpd -M |grep http
redis
proxy_http_module (shared)
編輯配置文件sql
[root@web/etc/httpd/conf.d]#vim host.conf
1 <VirtualHost *:80> 2 ServerName www.test.com 3 ProxyRequests off 關閉正向代理 4 ProxyVia on 是否記錄代理 5 ProxyPreserveHost on #開啓保留主機名 6 <Proxy *> 7 Require all granted 8 </Proxy> 9 ProxyPass / http://192.168.4.61:8080/ 10 ProxyPa***everse / http://192.168.4.61:8080/ 11 <Location /> 12 Require all granted 13 </Location> 14 </VirtualHost>
重啓服務測試
[root@web/etc/httpd/conf.d]#systemctl restart httpd.service
基於AJP協議鏈接
查看是否加載了支持ajp協議的反向代理模塊
[root@web/etc/httpd/conf]#httpd -M |grep ajp
proxy_ajp_module (shared)
編輯配置文件
[root@web/etc/httpd/conf.d]#vim host.conf
1 <VirtualHost *:80> 2 ServerName www.test.com 3 ProxyRequests off 4 ProxyVia on 5 ProxyPreserveHost on 6 <Proxy *> 7 Require all granted 8 </Proxy> 9 ProxyPass / ajp://192.168.4.61:8009/ 10 ProxyPa***everse / ajp://192.168.4.61:8009/ 11 <Location /> 12 Require all granted 13 </Location> 14 </VirtualHost>
重啓服務測試
後續的安裝和LNMT的安裝方法同樣,就再也不累述。
[root@mysql~]#yum install -y mariadb-server
#安裝mariadb服務
[root@mysql~]#systemctl enable mariadb.service
#設置爲開機啓動
[root@mysql~]#systemctl start mariadb
#啓動服務
[root@mysql~]#mysql_secure_installation
#安全初始化
[root@mysql~]#mysql -uroot -p
#建立使用的數據庫
MariaDB [(none)]> CREATE DATABASE jsprun; MariaDB [(none)]> GRANT ALL ON jsprun.* TO joah@'192.168.4.63' IDENTIFIED By '123456';
tomcat
[root@tomcat~]#yum install -y java-1.8.0-openjdk
#安裝java運行環境
[root@tomcat~]#java -version
#查看是否安裝成功
[root@tomcat~]#yum install -y tomcat tomcat-admin-webapp tomcat-docs-webapp tomcat-lib tomcat-webapps
#安裝所須要的包
[root@tomcat~]#unzip JspRun\!_6.0.0_Source_UTF8.zip
#解壓此包
[root@tomcat~]#cp JspRun\!_6.0.0_Source_UTF8/source/WebRoot/ /usr/share/tomcat/webapps/jsprun -a
#將此目錄下的文件複製到指定目錄下
[root@tomcat/usr/share/tomcat/webapps/jsprun]#vim config.properties
#修改數據庫信息
[root@tomcat/etc/tomcat]#vim server.xml
#修改server.xml文件
[root@tomcat/etc/tomcat]#vim tomcat-users.xml
#開啓管理功能
[root@tomcat/etc/tomcat]#systemctl enable tomcat.service
#設置爲開機啓動
[root@tomcat/etc/tomcat]#systemctl start tomcat.service
#啓動tomcat服務
nginx
安裝並啓動服務
[root@nginx~]#yum install -y nginx
[root@nginx~]#systemctl enable nginx
[root@nginx~]#systemctl start nginx
修改配置文件
[root@nginx/etc/nginx/conf.d]#vim nginx-tomcat.conf
1 server { 2 listen 80; 3 server_name www.test.com; 4 root /usr/share/tomcat/webapps/jsprun; 5 location / { 6 index index.jsp; 7 proxy_pass http://192.168.4.63:8080; 8 } 9 location ~* \.(jsp|do)$ { 10 proxy_pass http://192.168.4.63:8080; 11 } 12 }
[root@nginx/etc/nginx/conf.d]#nginx -t
#語法檢測
重啓服務測試
點擊下一步等 會出現圖中紅框的內容表示不可寫
修改配置文件並使其文件有寫權限和執行權限
[root@tomcat/usr/share/tomcat/webapps/jsprun]#chmod 777 config.properties templates/ p_w_uploads/ customavatars/ forumdata/ -R
圖中顯示數據庫的內容咱們已經在config.properties
配置文件中修改了,因此這裏不須要修改了,若是安裝以前沒有修改此內容要正確填寫便可,點擊下一步安裝完成
咱們去數據庫查看生成的表
如何實現動靜分離呢?
[root@nginx/etc/nginx/conf.d]#vim nginx-tomcat.conf
1 server { 2 listen 80; 3 server_name www.test.com; 4 root /usr/share/tomcat/webapps/jsprun; 5 location ~* \.(gif|png|jpeg|bmp|jpg|html|htm)$ { 6 proxy_pass http://192.168.4.65:80; 7 } 8 location ~* \.(jsp|do)$ { 9 proxy_pass http://192.168.4.63:8080; 10 } 11 }
[root@nginx/etc/nginx/conf.d]#systemctl restart nginx.service
將jsprun中p_w_picpath拷貝到apache中/var/www/html
目錄下
[root@tomcat/usr/share/tomcat/webapps/jsprun]#scp -pr p_w_picpaths/* 192.168.4.65:/var/www/html
測試
這裏的動靜分離實際上是將圖片和html等結尾的文件專門存放在apache服務器上,而不是實現真正的分離。
保證同一個用戶相關的訪問請求被分配到同一臺服務器上。
(1)session sticky
與調度器有關
nginx:ip_hash haproxy:source lvs:sh
(2)session cluster:delta session manager
如上圖所示,就是session cluster工做原理:基於IP組播來完成session複製
全局會話複製:利用Delta Manager複製會話中的變動信息到集羣中的全部其餘節點 非全局複製:使用backup Manager進行復制,它會把session複製給一個指定的備份節點
此中session保持通常不超過6個節點,若是小型可使用。
(3)session server:redis(store),memcached(cache)
如圖所示爲此中會話保持的工做原理,基於共享會話實現
上述兩種與server端有關
前提:
httpd:mod_proxy,mod_proxy_http,mod_proxy_balancer
tomcat cluster :http connector
同步時間
[root@tomcatA~]#ntpdate 172.18.0.1
[root@tomcatA~]#vim /etc/chrony.conf
修改hosts文件
[root@tomcatA~]#vim /etc/hosts
3 192.168.4.62 tomcatA 4 192.168.4.63 tomcatB
基於密鑰鏈接
[root@tomcatA~]#ssh-keygen
Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:z+CBC0/eQP/sW9O+TqUXn6DCxR1j6Wt/XAyvuHMMW9E root@tomcatA The key's randomart p_w_picpath is: +---[RSA 2048]----+ | | | . | | . = . | | . o . + = E| | . + S o + *.| | = =.B. o.+oB| | + oo=.oO+++| | ...=+=.o| | o..=+o.| +----[SHA256]-----+
[root@tomcatA~]#ssh-copy-id -i /root/.ssh/id_rsa.pub tomcatB
tomcatB:
[root@tomcatB~]#ssh-keygen
[root@tomcatB~]#ssh-copy-id -i /root/.ssh/id_rsa.pub tomcatA
tomcatB中的其餘配置都和tomcatA配置相同這裏就不累述
安裝jdk環境
[root@tomcatB~]#yum install -y java-1.8.0-openjdk
tomcat安裝及配置
[root@tomcatA~]#yum install -y tomcat-docs-webapp tomcat-lib tomcat-webapps tomcat
[root@tomcatA~]#systemctl enable tomcat
[root@tomcatA~]#systemctl start tomcat
配置一個示例程序
[root@tomcatA/usr/share/tomcat/webapps]#mkdir test/{WEB-INF,classes,lib} -pv
[root@tomcatA/usr/share/tomcat/webapps/test]#vi index.jsp
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
[root@tomcatB/usr/share/tomcat/webapps]#mkdir test/{WEB-INF,classes,lib} -pv
[root@tomcatB/usr/share/tomcat/webapps/test]#vi index.jsp
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
[root@tomcatA/usr/share/tomcat/webapps]#vim /etc/tomcat/server.xml
#在host中添加以下內容
[root@tomcatA/usr/share/tomcat/webapps]#systemctl restart tomcat.service
#重啓測試
至此tomcatA和tomcatB配置完成
http安裝及配置
查看是否已經加載所須要的模塊
[root@httpd/etc/httpd/conf.d]#httpd -M |grep proxy
安裝及配置成開啓啓動並啓動服務
[root@httpd~]#yum install -y httpd
[root@httpd~]#systemctl enable httpd.service
[root@httpd~]#systemctl start httpd.service
修改配置文件並實現http調度功能
[root@httpd/etc/httpd/conf]#vim httpd.conf
354 Include conf.d/tomcat-host.conf
[root@httpd/etc/httpd/conf.d]#vim tomcat-host.conf
<proxy balancer://tcsrvs> BalancerMember http://192.168.4.62:8080 BalancerMember http://192.168.4.63:8080 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ServerName www.test.com ProxyVia on ProxyRequests off ProxyPreserveHost on <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPa***everse / balancer://tcsrvs/ <Location /> Require all granted </Location> </VirtualHost>
選項說明:
ProxyPreserveHost {on|off}:若是啓用此功能,代理會將用戶請求報文中的Host行發送給後端服務器,而再也不使用PorxyPress指定的服務器地址。若是在反向代理中支持虛擬主機,則需開啓此項。 ProxyVia:{on|off|full|block}:用於控制在http首部是否使用Via,主要用於在多級代理中控制代理請求的流向。 off:不開啓此功能 on:表示每一個請求和響應報文均添加Via full:表示每一個Via都會添加當前apache服務器的版本信息 block:表示每一個代理請求報文中的Via都會被移除 ProxyRequests {on|off}:是否開啓apache正向代理的功能;啓用此項時爲了代理http協議需啓用mod_proxy_http模塊 ProxyPass [path] !|URL [key=value ...]:將後端服務器某URL與當前服務器的某虛擬路徑關聯起來做爲提供服務的路徑。 path:當前服務器上的某虛擬路徑 URL:後端服務器上某URL路徑 注意:若是path以「/」結尾,則對應的URL也必須"/"結尾。 key類型 min:鏈接池的最小容量 max:鏈接池最大容量 loadfactor:用於負載均衡集羣配置中,定義對應後端服務器的權重 retry:當apache將請求發送至後端服務器獲得錯誤響應時等待多長時間之後重試 **lbmethod類型** byrequests:基於權重將統計請求個數進行調度 bytraffic:基於權重的流量計數調度 bybusyness:經過考量每一個後端服務器的當前負載進行調度 maxattempts:放棄請求以前實現故障轉義的次數,默認爲1,其最大值不該該大於總的節點數 nofailover {on|off} on:表示後端服務器故障時,用戶的session將損壞 stickysession:調度器的sticky ProxyPa***everse:用於讓apache調整HTTP重定向響應報文中的Location、Content-Location及URI標籤所對應的URL,在反向代理環境中必須使用此指令避免重定向報文繞過proxy服務器。 BalancerMember [balancerurl] url [key=value [key=value...]] status: D:設置不可用disabled S:設置爲stopped I:忽略錯誤,請求還會往此主機上調 H:若是別的主機不可用時啓用至關於backup E:設置爲error狀態 N:僅僅接受seesion sticky請求
實現會話粘性
[root@httpd/etc/httpd/conf.d]#vim tomcat-host.conf
1 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/" env=BALANCER_ROUTE_CHANGED 2 <proxy balancer://tcsrvs> 3 BalancerMember http://192.168.4.62:8080 route=tomcatA loadfactor=1 4 BalancerMember http://192.168.4.63:8080 route=tomcatB loadfactor=2 5 ProxySet lbmethod=byrequests 6 ProxySet stickysession=ROUTEID 7 </Proxy> 8 9 <VirtualHost *:80> 10 ServerName www.test.com 11 ProxyVia on 12 ProxyRequests off 13 ProxyPreserveHost on 14 <Proxy *> 15 Require all granted 16 </Proxy> 17 ProxyPass / balancer://tcsrvs/ 18 ProxyPa***everse / balancer://tcsrvs/ 19 <Location /> 20 Require all granted 21 </Location> 22 </VirtualHost>
至此咱們就實現的session sticky
實現管理功能
24 <Location /balancer-manager> 25 SetHandler balancer-manager 26 ProxyPass ! 27 Require all granted 28
這裏爲了測試方便咱們設置成了全部用戶均可以訪問,在實際生產中須要指定特定IP訪問。
顯示狀態信息
[root@httpd/etc/httpd/conf.d]#vim tomcat-host.conf
29 <Location /status> 30 ProxyPass ! 31 SetHandler server-status 32 Require all granted 33 </Location>
重啓服務器測試
前提:
httpd:mod_proxy,mod_proxy_ajp,mod_proxy_balancer
tomcat cluster:ajp connecotr
前面的步驟都和上述配置相同
編輯tomcat-host.conf配置文件
[root@httpd/etc/httpd/conf.d]#vim tomcat-host.conf
1 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/" env=BALANCER_ROUTE_CHANGED 2 <proxy balancer://tcsrvs> 3 BalancerMember ajp://192.168.4.62:8009 route=tomcatA loadfactor=1 4 BalancerMember ajp://192.168.4.63:8009 route=tomcatB loadfactor=2 5 ProxySet lbmethod=byrequests 6 ProxySet stickysession=ROUTEID 7 </Proxy> 8 9 <VirtualHost *:80> 10 ServerName www.test.com 11 ProxyVia on 12 ProxyRequests off 13 ProxyPreserveHost on 14 <Proxy *> 15 Require all granted 16 </Proxy> 17 ProxyPass / balancer://tcsrvs/ 18 ProxyPa***everse / balancer://tcsrvs/ 19 <Location /> 20 Require all granted 21 </Location> 22 </VirtualHost> 23 24 <Location /bm> 25 SetHandler balancer-manager 26 ProxyPass ! 27 Require all granted 28 </Location> 29 <Location /status> 30 ProxyPass ! 31 SetHandler server-status 32 Require all granted 33 </Location>
前提:
httpd:mod_jk
tomcat cluster:ajp connector
此種方法如今不經常使用就不介紹了...
nginx安裝並設置爲開機啓動
[root@httpd~]#yum install -y nginx
[root@httpd~]#systemctl enable nginx
[root@httpd~]#systemctl start nginx
修改配置文件實現調度功能
[root@httpd/etc/nginx/conf.d]#vim tomcat-nginx.conf
1 upstream tomsrvs { 2 server 192.168.4.62:8080 ; 3 server 192.168.4.63:8080 ; 4 } 5 6 server { 7 listen 80; 8 server_name www.test.com; 9 location /{ 10 proxy_pass http://tomsrvs; 11 } 12 }
基於ip_hash實現會話粘性
[root@httpd/etc/nginx/conf.d]#vim tomcat-nginx.conf
1 upstream tomsrvs { 2 server 192.168.4.62:8080 ; 3 server 192.168.4.63:8080 ; 4 ip_hash; 5 } 6 7 server { 8 listen 80; 9 server_name www.test.com; 10 location /{ 11 proxy_pass http://tomsrvs; 12 } 13 }
基於hash key 實現
基於指定的key的hash表來實現對請求的調度
1 upstream tomsrvs { 2 server 192.168.4.62:8080 ; 3 server 192.168.4.63:8080 ; 4 hash $remote_addr consistent; 5 } 6 7 8 9 server { 10 listen 80; 11 server_name www.test.com cookie; 12 location /{ 13 proxy_pass http://tomsrvs; 14 } 15 }
在tomcat服務器上進行配置
[root@tomcatB/etc/tomcat]#vi server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA"> #添加jvmRoute
下面的配置能夠放在Host、Engine、Context中其做用效果不一樣
<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.100.100.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" #這裏設定爲tomcat真實IP port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </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.JvmRouteSessionIDBinderListener"> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"> </Cluster>
[root@tomcatA/etc/tomcat]#cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/test/WEB-INF/
[root@tomcatA/etc/tomcat]#vim /usr/share/tomcat/webapps/test/WEB-INF/web.xml
23 <distributable/> #添加此內容
重啓服務測試
tomcatA和tomcatB的配置類似就不累述。
若是修改/etc/tomcat/web.xml文件時全局配置。
(1)官方文檔上面的配置文件中:
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
上述少了「/」結尾,記得加上
(2)綁定地址爲auto時,會自動解析本地主機名,並解析得出的IP地址做爲使用的地址;建議指定IP地址。
tomcatA和tomcatB配置類似,這裏以tomcatA爲例
(1)安裝tomcat和memcache並進行配置
[root@tomcatA/etc/tomcat]#yum install -y memcached
[root@tomcatA/etc/tomcat]#systemctl enable memcached
[root@tomcatA/etc/tomcat]#systemctl start memcached
(2)配置tomcat
下載所須要的jar文件
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
http://owatlfstl.bkt.clouddn.com/2017-11-07_171315.jpg
[root@tomcatA~]#cp *.jar /usr/share/tomcat/lib/
[root@tomcatA/etc/tomcat]#vim server.xml
#編輯配置文件
131 <Context> 132 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 133 memcachedNodes="n1:192.168.4.62:11211,n2:192.168.4.63:11211" 134 failoverNodes="n1" 135 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 136 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 137 /> 138 </Context>
[root@tomcatA/etc/tomcat]#scp server.xml tomcatB:/etc/tomcat/server.xml
[root@tomcatB/usr/share/tomcat/webapps/test]#vim index.jsp
編輯index.jsp文件
1 <%@ page language="java" %> 2 <html> 3 <head><title>TomcatB</title></head> 4 <body> 5 <h1><font color="blue">TomcatB.magedu.com</font></h1> 6 <table align="centre" border="1"> 7 <tr> 8 <td>Session ID</td> 9 <% session.setAttribute("magedu.com","magedu.com"); %> 10 <td><%= session.getId() %></td> 11 </tr> 12 <tr> 13 <td>Created on</td> 14 <td><%= session.getCreationTime() %></td> 15 </tr> 16 </table> 17 </body> 18 </html>
tomcatB同理
[root@tomcatA~]#systemctl restart tomcat
配置http服務器
[root@httpd/etc/httpd/conf.d]#vim tomcat-host.conf
1 <proxy balancer://tcsrvs> 2 BalancerMember ajp://192.168.4.62:8009 loadfactor=1 3 BalancerMember ajp://192.168.4.63:8009 loadfactor=2 4 ProxySet lbmethod=byrequests 5 </Proxy> 6 7 <VirtualHost *:80> 8 ServerName www.test.com 9 ProxyVia on 10 ProxyRequests off 11 ProxyPreserveHost on 12 <Proxy *> 13 Require all granted 14 </Proxy> 15 ProxyPass / balancer://tcsrvs/ 16 ProxyPa***everse / balancer://tcsrvs/ 17 <Location /> 18 Require all granted 19 </Location> 20 </VirtualHost> 21 22 <Location /bm> 23 SetHandler balancer-manager 24 ProxyPass ! 25 Require all granted 26 </Location> 27 <Location /status> 28 ProxyPass ! 29 SetHandler server-status 30 Require all granted 31 </Location>
重啓http服務
[root@httpd/etc/httpd/conf.d]#systemctl restart httpd
測試
查看是否已有緩存到本地
[root@tomcatA~]#memcached-tool 127.0.0.1:11211 dump
接下來中止tomcatA服務測試
重啓啓動tomcatA 測試
至此已經實現了session server
memcached-session-manager-tc7-2.1.1.jar
memcached-session-manager-2.1.1.jar
spymemcached-2.12.3.jar
msm-javolution-serializer-2.1.1.jar
javolution-5.4.3.1.jar
[root@memcache~]#scp /etc/tomcat/server.xml tomcatB:/etc/tomcat/server.xml
[root@memcache~]#systemctl restarst tomcat
上述建立站點及測試也相同就不累述
[root@memcache/usr/share/tomcat/lib]#memcached-tool 127.0.0.1:11211 dump
在測試過程當中,存在版本不兼容的狀況,更換版本便可。