本次實作項目内容:
分别實作下述架構方案:
(1)nginx|apache(mod_proxy_ajp) --> tomcat;
(2) apache(mod_proxy_ajp) --> tomcat servers;額外實作session sticky;
(3) haproxy --> apache(mod_proxy_ajp) --> tomcat session cluster;
架構環境(部落客此次使用的虛拟機都是CentOS7.5):
172.16.75.5 反代伺服器
172.16.75.6 Tomcat伺服器1
172.16.75.7 Tomcat伺服器2
架構一:
用戶端-->nginx反代伺服器-->Tomcat伺服器1
nginx反代伺服器中的操作:
~]# vim /etc/nginx/nginx.conf
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCM581dvRWYoNHLwEzX5xCMx8FesU2cfdGLwATMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1YmZiFGZkRzYiNzY0gjY1cDZzAjNwYzNiZTY1cjN5U2LcRjMvw1NwgTMwIzLcd2bsJ2LcNXZnFWbp9CXt92Yu8GdjFTNuITavw1LcpDc0RHaiojIsJye.png)
添加這兩行即可;
~]# nginx -t //檢查是否格式正确
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
~]# nginx
~]#vim /etc/hosts
172.16.75.6 tc1.wzc.com
做到這裡,我們的nginx反代伺服器的配置就完成了;
Tomcat1中的操作:
首先我們要安裝JDK:OpenJDK:
安裝JDK:java-VERSION-openjdk、java-VERSION-openjdk-headless、java-VERSION-openjdk-devel
這裡我們直接:
~]#yum install java-devel -y //這樣安裝即可
~]# java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
如果系統沒有定義JAVA_HOME環境變量,需要配置并指定Java的安裝路徑;
OpenJDK:
~] # vim /etc/profile.d/java.sh //寫入這下面的一行内容即可
export JAVA_HOME=/usr
~]# source /etc/profile.d/java.sh
接下來是安裝Tomcat:
這裡我們使用官方提供的Tomcat Binary Release From ASF進行安裝(部落客是用的是apache-tomcat-8.0.23.tar.gz源碼包,内部包含catalina.sh腳本檔案):
~]# tar -xf apache-tomcat-VERSION.tar.gz -C /usr/local
~]# cd /usr/local
~]# ln -sv /usr/local/apache-tomcat-VERSION tomcat
~]# cat /etc/profile.d/tomcat.sh //下面是要在裡面要編輯的内容,用來在根目錄中使用catalina.sh腳本用的
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
~]# source /etc/profile.d/tomcat.sh
~]# mkdir -pv /tcapps/webapps/ROOT/{classes,lib,WEB-INF,META-INF}
~]# vim /tcapps/webapps/ROOT/index.jsp //一個簡單的頁面測試内容,這裡部落客就不粘圖檔了友善大家使用
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<font color="red">tc1.wzc.com</font>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tc1.wzc.com","tc1.wzc.com"); %>
<td><%= session.getId() %></td>
</tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</table>
</body>
</html> //儲存即可
~]# vim /usr/local/tomcat/conf/server.xml
添加(不是修改)箭頭所指内容即可;
~]# catalina.sh start
這兩個端口打開即可;
這是我們在用戶端修改host檔案添加172.16.75.5 java.wzc.com和172.16.75.6 tc1.wzc.com 這樣就可以通路 java.wzc.com了,他會被直接反代到tc1.wzc.com,通路如下:
架構二:
用戶端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代伺服器-->Tomcat伺服器1
LAMT:
Linux + Apache(httpd) + MySQL/MariaDB + Tomcat
httpd的代理功能子產品:
proxy_module:實作httpd代理功能的核心子產品;
proxy_ajp_module:以ajp協定的用戶端身份實作反向代理功能;
proxy_http_module:以http協定的用戶端身份實作反向代理功能;
jk_module:以ajp協定的用戶端身份實作反向代理功能;
三種代理模型:
Client(http/https) --> httpd(proxy_http_module)(http) --> tomcat(http connector)
Client(http/https) --> httpd(proxy_ajp_module)(http) --> tomcat(ajp connector)
Client(http/https) --> httpd(jk_module)(http) --> tomcat(ajp connector)
第一種模型:使用http協定連接配接tomcat伺服器的http連接配接器;
/etc/httpd/conf.d/proxy_http_mod.conf
<VirtualHost *:80>
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://tc1.wzc.com:8080
<Location />
Require all granted
</Location>
</VirtualHost>
第二種模型:使用ajp協定連接配接tomcat伺服器的ajp連接配接器;
/etc/httpd/conf.d/proxy_ajp_mod.conf
<VirtualHost *:80>
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://tc1.wzc.com:8009
<Location />
Require all granted
</Location>
</VirtualHost>
第三種模型:使用mod_jk子產品通過ajp協定連接配接tomcat伺服器的ajp連接配接器;
mod_jk.so子產品不是httpd自帶的子產品,屬于第三方功能子產品,需要額外編譯安裝;
此子產品有tomcat官方提供,可以從tomcat.apache.org站點下載下傳tomcat-connector程式包;進行編譯安裝即可;
確定系統上已經安裝了完整的開發環境,并且保證httpd-devel也已經正确安裝;
]# yum -y groupinstall "Development Tools" "Server Paltform Develop"
]# yum -y install httpd-devel
]# tar xf tomcat-connectors-1.2.40-src/native
]# cd tomcat-connectors-1.2.40-src/native
]# ./configure --with-apxs=/usr/bin/apxs
]# make -j 4 && make install
安裝成功後,mod_jk子產品會被複制到/usr/lib64/httpd/modules/mod_jk.so
對于mod_jk來說,所有後端被代理的伺服器,都被稱為"worker";
建立mod_jk的配置檔案:/etc/httpd/conf.d/proxy_jk_mod.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkMount /* tc1
JkLogFile logs/jk_module.log
JkLogLevel warn
JkMount /jk-status tcstat
<Location />
Require all granted
</Location>
建立workers的屬性定義檔案:/etc/httpd/conf.d/workers.properties
worker.list=tc1,tcstat
worker.tc1.host=172.16.75.6
worker.tc1.port=8009
worker.tc1.type=ajp13
worker.tcstat.type=status
重新啟動httpd即可;
這裡我們使用apache(mod_proxy_ajp)
在反代伺服器中的操作:
~]# nginx -s stop
~]# cd /etc/httpd/conf.d/
conf.d]# vim proxy_ajp_lb.conf
儲存,完成反代伺服器中的操作;
在Tomcat1中的操作:
像我一樣,把這一段注釋掉<!-- -->注釋号
修改之前的localhost為圖示内容即可;
~]# catalina.sh stop //隔幾秒在開啟
~]# catalina.sh start //再次開啟
這是我們就可以在用戶端中進行通路了:
架構三(LAMT負載均衡):
用戶端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代伺服器-->Tomcat伺服器1,Tomcat伺服器2
這裡我們還是使用apache(mod_proxy_ajp)
~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf
<Proxy "balancer://tcsrvs">
BalancerMember ajp://tc1.wzc.com:8009
BalancerMember ajp://tc2.wzc.com:8009
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName java.wzc.com
ProxyRequests Off
ProxyPass / balancer://tcsrvs
<Location />
Require all granted
</Location>
</VirtualHost>
~]# systemctl restart httpd
172.16.75.7 tc2.wzc.com
在Tomcat2中的操作同Tomcat1,該安裝安裝,該編輯配置檔案并重載的就和Tomcat1一樣,該注釋注釋,該添加添加,該修改修改;
然後在用戶端通路java.wzc.com即可看到如下圖示,重複重新整理檢視效果:
怎樣額外實作session sticky呢?
這裡隻需在反代伺服器中修改配置檔案即可:
~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
BalancerMember ajp://tc1.wzc.com:8009 route=tc1
BalancerMember ajp://tc2.wzc.com:8009 route=tc2
ProxySet stickysession=ROUTEID
再次通路:
再怎麼重新整理,也都是這一種顯示了,但這時負載均衡就失去了意義;
架構四:
用戶端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代伺服器-->Tomcat session cluster
這裡我們還是使用apache(mod_proxy_ajp):
<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.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="172.16.75.7"
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.ClusterSessionListener"/>