Apache + Tomcat基於AJP協議實現反代、動靜分離、負載均衡和session會話保持
1、演示環境:
IP |
作業系統 |
部署程式 |
192.168.1.143 |
CentOS 7.6 |
Apache |
192.168.1.144 |
CentOS 7.6 |
Tomcat |
192.168.1.145 |
CentOS 7.6 |
Tomcat |
2、192.168.1.144節點建立測試頁:
# vim /usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA</font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created ON</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
3、192.168.1.145節點建立測試頁:
# vim /usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>TomcatB
<body>
<h1><font color="blue">TomcatB</font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created ON</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
4、192.168.1.144節點新增jvmRoute引數:
# cd /usr/local/tomcat/conf
# cp server.xml server.xml.bak
# vim server.xml
<Engine name="Catalina" defaultHost="localhost">修改為
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
5、192.168.1.145節點新增jvmRoute引數:
# cd /usr/local/tomcat/conf
# cp server.xml server.xml.bak
# vim server.xml
<Engine name="Catalina" defaultHost="localhost">修改為
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">
6、分別啟動192.168.1.144節點和192.168.1.145節點上的Tomcat:
# catalina.sh stop # catalina.sh configtest # catalina.sh start # ss -tunlp | grep -w :8080
7、在192.168.1.143節點中使用curl命令訪問:
# curl http://192.168.1.144:8080/test.jsp //能正常顯示文字內容
# curl http://192.168.1.145:8080/test.jsp //能正常顯示文字內容
8、192.168.1.143節點安裝Apache實現反代、動靜分離和負載均衡:
# yum -y install httpd
# cd /etc/httpd/conf
# cp httpd.conf httpd.conf.bak
# vim httpd.conf
Ø 新增程式碼:ServerName localhost:80
Ø 註釋程式碼:DocumentRoot "/var/www/html"
# httpd -t # systemctl start httpd.service # ss -tunlp | grep -w :80
# httpd -M | grep proxy
(1)配置status狀態頁面:
# vim /etc/httpd/conf/httpd.conf,末尾新增如下程式碼:
<Location /server-status>
SetHandler server-status
Require all granted
</Location>
備註:此處未做訪問控制,status狀態頁面用於測試反代功能
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
本地瀏覽器訪問:
192.168.1.143
192.168.1.143/server-status
(2)配置虛擬主機:# vim /etc/httpd/conf.d/vhosts.conf
<Proxy balancer://testcluster>
BalancerMember ajp://192.168.1.144:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://192.168.1.145:8009 loadfactor=1 route=TomcatB
</Proxy>
<VirtualHost *:80>
ServerName web.qiuyue.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass /server-status !
ProxyPass / balancer://testcluster/
ProxyPa***everse / balancer://testcluster/
<Location />
Require all granted
</Location>
</VirtualHost>
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
備註:常用指令說明
Ø ProxyVia On:每個請求和響應報文的HTTP首部均新增Via,用於在多級代理中控制代理請求的流向
Ø ProxyRequests Off:關閉Apache正向代理功能,開啟反代功能必須關閉正向代理功能
Ø ProxyPreserveHost Off:啟用此功能,代理會將使用者請求報文中的Host:行傳送給後端伺服器,而不再使用ProxyPass指定的伺服器地址,如果想在反代中支援虛擬主機,則需要開啟此項
Ø ProxyPass PATH !|URL:將後端伺服器某URL與當前伺服器的某虛擬路徑關聯起來作為提供服務的路徑,PATH為當前伺服器上的某虛擬路徑,URL為後端伺服器上某URL路徑,使用此指令時必須將ProxyRequests的值設定為Off,而且如果PATH以/結尾,則對應的URL也必須以/結尾,反之亦然
Ø ProxyPa***everse:讓Apache調整HTTP重定向響應報文中的Location、Content-Location及URI標籤所對應的URL,在反代環境中必須使用此指令避免重定向報文繞過Proxy伺服器
(3)本地瀏覽器訪問:
192.168.1.143
192.168.1.143/server-status
192.168.1.143/test.jsp
輪詢顯示,且Session ID一直在變:
9、 配置proxy_balancer_module內建的Load Balancer Manager:# vim /etc/httpd/conf.d/vhosts.conf
<Proxy balancer://testcluster>
BalancerMember ajp://192.168.1.144:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://192.168.1.145:8009 loadfactor=1 route=TomcatB
</Proxy>
<VirtualHost *:80>
ServerName web.qiuyue.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass /server-status !
ProxyPass /balancer-manager !
ProxyPass / balancer://testcluster/
ProxyPa***everse / balancer://testcluster/
<Location />
Require all granted
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
Require all granted
</Location>
</VirtualHost>
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
本地瀏覽器訪問:192.168.1.143/balancer-manager
10、實現session會話保持:# vim /etc/httpd/conf.d/vhosts.conf
<Proxy balancer://testcluster>
BalancerMember ajp://192.168.1.144:8009 loadfactor=1 route=TomcatA
BalancerMember ajp://192.168.1.145:8009 loadfactor=1 route=TomcatB
ProxySet lbmethod=bytraffic stickysession=ROUTEID
</Proxy>
<VirtualHost *:80>
ServerName web.qiuyue.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass /server-status !
ProxyPass /balancer-manager !
ProxyPass / balancer://testcluster/
ProxyPa***everse / balancer://testcluster/
<Location />
Require all granted
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
Require all granted
</Location>
</VirtualHost>
備註:lbmethod為Apache實現負載均衡的排程方法,預設為byrequests,即基於請求次數進行排程;bytraffic為基於流量進行排程;bybusyness為基於繁忙程式進行排程。
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
本地瀏覽器訪問:
192.168.1.143/test.jsp,無論如何重新整理,頁面都不會改變:
360安全瀏覽器F12:
備註:關閉瀏覽器,重新開啟並訪問192.168.1.143/test.jsp,會基於新的Cookie進行會話保持
192.168.1.143/balancer-manager