Apache + Tomcat基於HTTP協議實現反代、動靜分離、負載均衡和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 /etc/hosts --> 192.168.1.144 TomcatA.qiuyue.com TomcatA

# vim /etc/hostname --> TomcatA

# hostnamectl set-hostname TomcatA

# hostname TomcatA

# logout

Ctrl + Shift + r

# hostname

3、配置192.168.1.145節點的主機名:

# vim /etc/hosts --> 192.168.1.145 TomcatB.qiuyue.com TomcatB

# vim /etc/hostname --> TomcatB

# hostnamectl set-hostname TomcatB

# hostname TomcatB

# logout

Ctrl + Shift + r

# hostname

4、192.168.1.144節點自定義Tomcat Host虛擬主機:

# cd /usr/local/tomcat/conf

# cp server.xml server.xml.bak

# vim server.xml</Host></Engine>之間新增如下代碼:

<Host name="TomcatA.qiuyue.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">

<Context path="" docBase="ROOT" reloadable="true" />

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="TomcatA_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

5、192.168.1.145節點自定義Tomcat Host虛擬主機:

# cd /usr/local/tomcat/conf

# cp server.xml server.xml.bak

# vim server.xml</Host></Engine>之間新增如下代碼:

<Host name="TomcatB.qiuyue.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">

<Context path="" docBase="ROOT" reloadable="true" />

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="TomcatB_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

6、192.168.1.144節點創建如下目錄及測試頁:

# mkdir -pv /data/{webapps,logs}

# mkdir -pv /data/webapps/ROOT

# vim /data/webapps/ROOT/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA.qiuyue.com</font></h1>

<table border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("qiuyue.com","qiuyue.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created ON</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

7、192.168.1.145節點創建如下目錄及測試頁:

# mkdir -pv /data/{webapps,logs}

# mkdir -pv /data/webapps/ROOT

# vim /data/webapps/ROOT/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB.qiuyue.com</font></h1>

<table border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("qiuyue.com","qiuyue.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created ON</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

8、192.168.1.144節點新增jvmRoute參數:# vim /usr/local/tomcat/conf/server.xml

<Engine name="Catalina" defaultHost="localhost">修改爲

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

9、192.168.1.145節點新增jvmRoute參數:# vim /usr/local/tomcat/conf/server.xml

<Engine name="Catalina" defaultHost="localhost">修改爲

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

10、分別啓動192.168.1.144節點和192.168.1.145節點上的Tomcat

# catalina.sh stop  # catalina.sh configtest  # catalina.sh start  # ss -tunlp | grep -w :8080

11、配置192.168.1.143節點/etc/hosts文件:# vim /etc/hosts

192.168.1.144 TomcatA.qiuyue.com TomcatA

192.168.1.145 TomcatB.qiuyue.com TomcatB

12、192.168.1.143節點中使用curl命令訪問:

# curl http://TomcatA.qiuyue.com:8080         //能正常顯示文本內容

# curl http://TomcatB.qiuyue.com:8080         //能正常顯示文本內容

13、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

image.png

(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

image.png

192.168.1.143/server-status

image.png

(2)配置虛擬主機:# vim /etc/httpd/conf.d/vhosts.conf

<Proxy balancer://testcluster>

BalancerMember http://TomcatA.qiuyue.com:8080 loadfactor=1 route=TomcatA

BalancerMember http://TomcatB.qiuyue.com:8080 loadfactor=1 route=TomcatB

</Proxy>

<VirtualHost *:80>

ServerName web.qiuyue.com

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<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 On:啓用此功能,代理會將用戶請求報文中的Host:行發送給後端服務器,而不再使用ProxyPass指定的服務器地址,如果想在反代中支持虛擬主機,則需要開啓此項

Ø  ProxyPass PATH !|URL:將後端服務器某URL與當前服務器的某虛擬路徑關聯起來作爲提供服務的路徑,PATH爲當前服務器上的某虛擬路徑,URL爲後端服務器上某URL路徑,使用此指令時必須將ProxyRequests的值設置爲Off,而且如果PATH/結尾,則對應的URL也必須以/結尾,反之亦然

Ø  ProxyPa***everse:讓Apache調整HTTP重定向響應報文中的LocationContent-LocationURI標籤所對應的URL,在反代環境中必須使用此指令避免重定向報文繞過Proxy服務器

(3)本地瀏覽器訪問:

192.168.1.143

image.png

192.168.1.143/server-status

image.png

192.168.1.143/index.jsp,訪問的是默認虛擬主機

image.png

(4)修改192.168.1.144節點Tomcat默認虛擬主機:

# catalina.sh stop

# vim server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">修改爲

<Engine name="Catalina" defaultHost="TomcatA.qiuyue.com" jvmRoute="TomcatA">

# catalina.sh configtest  # catalina.sh start  # ss -tunlp | grep -w :8080

(5)修改192.168.1.145節點Tomcat默認虛擬主機:

# catalina.sh stop

# vim server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">修改爲

<Engine name="Catalina" defaultHost="TomcatB.qiuyue.com" jvmRoute="TomcatB">

# catalina.sh configtest  # catalina.sh start  # ss -tunlp | grep -w :8080

(6)本地瀏覽器重新訪問192.168.1.143/index.jsp

image.png

image.png

輪詢顯示,Session ID一直在變:

image.png

image.png

14、配置proxy_balancer_module內置的manager# vim /etc/httpd/conf.d/vhosts.conf

<Proxy balancer://testcluster>

BalancerMember http://TomcatA.qiuyue.com:8080 loadfactor=1 route=TomcatA

BalancerMember http://TomcatB.qiuyue.com:8080 loadfactor=1 route=TomcatB

</Proxy>

<VirtualHost *:80>

ServerName web.qiuyue.com

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<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

image.png

15、實現session會話保持:# vim /etc/httpd/conf.d/vhosts.conf

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy balancer://testcluster>

BalancerMember http://TomcatA.qiuyue.com:8080 loadfactor=1 route=TomcatA

BalancerMember http://TomcatB.qiuyue.com:8080 loadfactor=1 route=TomcatB

ProxySet lbmethod=bybusyness stickysession=ROUTEID

</Proxy>

<VirtualHost *:80>

ServerName web.qiuyue.com

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<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>

備註:lbmethodApache實現負載均衡的調度方法,默認爲byrequests,即基於權重將統計請求個數進行調度;bytraffic則基於權重的流量計數調度;bybusyness通過考量每個後端服務器的當前負載進行調度。

# httpd -t  # systemctl reload httpd.service  # ss -tunlp | grep -w :80

本地瀏覽器訪問:

192.168.1.143無論如何刷新,頁面都不會改變

Google Chrome瀏覽器F12

image.png

備註:關閉瀏覽器,重新打開並訪問192.168.1.143,會基於新的Cookie值進行會話保持

192.168.1.143/balancer-manager

image.png

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章