Tomcat多實例部署
安裝?jdk、tomcat(流程可看之前博客)
配置 tomcat 環境變量
[root@localhost ~]# vim /etc/profile.d/tomcat.sh#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2[root@localhost ~]# source /etc/profile.d/tomcat.sh
修改 tomcat1 或 tomcat2 中的 server.xml 文件,要求各 tomcat 實例配置不能有重復的端口號
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml#22行,修改Server prot,默認為8005 -> 修改為8006
<Server port="8006" shutdown="SHUTDOWN">#69行,修改Connector port,HTTP/1.1 默認為8080 -> 修改為8081
<Connector port="8081" protocol="HTTP/1.1" #116行,修改Connector port AJP/1.3,默認為8009 -> 修改為8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
第一個連接器默認監聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。
第二個連接器默認監聽8009端口,負責和其他的HTTP服務器建立連接。
在把Tomcat與其他HTTP服務器集成時,需要用到這個連接器。第三個連接器
port="8010":指定AJP連接器監聽的端口號。在這個示例中,AJP連接器監聽在8010端口上。protocol="AJP/1.3":指定連接器所使用的協議。這里設置為AJP/1.3,表示使用AJP協議的版本1.3。redirectPort="8443":指定重定向端口。當AJP連接器接收到HTTP請求時,如果請求是通過HTTPS(加密)訪問的,
則會將請求重定向到8443端口。AJP連接器用于將靜態資源和動態請求從前端Web服務器(如Apache HTTP Server)轉發到Tomcat服務器。
這樣可以將Tomcat服務器隱藏在防火墻之后,提高安全性,同時提供更高的性能,特別是在處理動態請求時。
常見的AJP連接器配置是為了將Tomcat與Apache HTTP Server或Nginx等前端服務器集成,以實現負載均衡、反向代理等功能
修改各 tomcat 實例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 環境變量
[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/startup.sh ##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/shutdown.sh##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/startup.sh export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/shutdown.shexport CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
啟動/重啟各 tomcat 中的 /bin/startup.sh?
#啟動tomcat1
/usr/local/tomcat/tomcat1/bin/startup.sh #啟動tomcat2
/usr/local/tomcat/tomcat2/bin/startup.sh netstat -natp | grep java
瀏覽器訪問測試
nginx+tomcat實現動靜分離
靜:靜態頁面? ?動: 動態頁面
分別可以對靜態頁面和動態頁面發起不同的請求,會有不同的響應結果。
ngix反向代理——負均均衡——>tomcat為后端服務器——web靜態nginx——>靜態請求nginx——>動態頁面——>tomcat
Nginx實現負載均衡的原理
Nginx實現負載均衡是通過反向代理實現Nginx服務器作為前端,Tomcat服務器作為后端,web頁面請求由Nginx服務來進行轉發。 但不是把所有的web請求轉發,而是將靜態頁面請求Ncinx服務器自己來處理,動態頁面請求,轉發給后端的Tomcat服務器來處理。
Tomcat是屬于輕量級的應用服務器,可接受訪問量可能會不足,所以我們需要多臺Tomcat服務器。并且Tomcat并發量處理能力弱(約Nginx的六分之一),所以需要Nginx方向代理時,進行合理的調用分配
Nginx實現負載均衡的主要配置項?
upstream 服務池名 { }
作用:配置后端服務器池,以提供響應數據proxy_pass http:// 服務池名
作用:配置將訪問請求轉發給后端服務器池的服務器處理
Nginx+Tomcat負載均衡的組合的優點
Nginx 靜態處理優勢:Nginx 處理靜態頁面的效率遠高于Tomcat的處理能力,Tomcat的請求量為1000次,Nginx 的請求量為6000次,Tomcat每秒的吞吐量為0.6M,Nginx的每秒吞吐量為3.6M,Nginx處理靜態資源的能力是Tomcat 處理的6倍
動靜分離原理:服務端接收來自客戶端的請求中,既有靜態資源也有動態資源,靜態資源由Nginx 提供服務,動態資源由Nginx轉發至后端。
Nginx+Tomcat實現負載均衡實例
部署nginx的負載器
#關閉防火墻和安全機制[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0#安裝必要組件
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make注意要提前裝好epel源否則stream模塊的組件會無法裝載準備已經安裝好的nginx
基于之前tomcat的多實例已部署,在第三臺服務器上部署一個tomcat即可
搭建第三臺tomcat
#關閉防火墻和安全機制[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0#軟件包的方式安裝jdk環境和tomcat[root@localhost ~]# tar -zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/[root@localhost ~]# vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH[root@localhost ~]# source /etc/profile#tomcat安裝[root@localhost ~]# tar zxvf apache-tomcat-9.0.16.tar.gz[root@localhost ~]# mv /opt/apache-tomcat-9.0.16/ /usr/local/tomcat#重啟tomcat服務
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
#查看端口
[root@localhost ~]# netstat -ntap | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 70787/java
回到多實例服務器,配置動態頁面
#創建指定網頁存放目錄[root@localhost ~]# mkdir -p /usr/local/tomcat/tomcat1/webapps/test
[root@localhost ~]# mkdir -p /usr/local/tomcat/tomcat2/webapps/testTomcat1配置:[root@localhost ~]# vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("動態頁面1,test1 page!!!");%>
</body>
</html>[root@localhost ~]# vim /usr/local/tomcat/tomcat1/conf/server.xml
#要把前面的host配置刪除
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
#重啟tomcat1
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh Tomcat2的配置[root@localhost ~]# vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("動態頁面2,test2 page!!!");%>
</body>
</html>[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
#要把前面的host配置刪除
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
#重啟tomcat2
/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
在準備好的nginx服務器上配置nginx負載均衡和動靜分離
[root@localhost ~]# vim /usr/local/nginx/html/index.html<html>
<body>
<h1> this is Nginx static test !</h2>
<img src="preview.jpg"/>
</body>
</html>[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置負載均衡的服務器列表,weight參數表示權重,權重越高,被分配到的概率越大upstream zh1 {server 20.0.0.100:8080 weight=1; #多實例tomcat1server 20.0.0.100:8081 weight=1; #多實例tomcat2server 20.0.0.32:8080 weight=1;}server {listen 80;server_name localhost;charset utf-8;#access_log logs/host.access.log main;#配置Nginx處理動態頁面請求,將 .jsp文件請求轉發到Tomcat 服務器處理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;#設置后端的Web服務器可以獲取遠程客戶端的真實IP#設定后端的Web服務器接收到的請求訪問的主機名(域名或IP、端口),默認HOST的值為proxy_pass指令設置的主機名。如果反向代理服務器不重寫該請求頭的話,那么后端真實服務器在處理時會認為所有的請求都來自反向代理服務器,如果后端有防攻擊策略的話,機器就被封了。proxy_set_header HOST $host;#把$remote_addr賦值給X-Real-IP,來獲取源IPproxy_set_header X-Real-IP $remote_addr;#在nginx 作為代理服務器時,設置的IP列表,會把經過的機器ip,代理機器ip都記錄下來proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}#配置Nginx處理靜態圖片請求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}location ~ .*\.jsp$ {proxy_pass http://zh1;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
訪問測試
靜態頁面訪問
?靜態頁面請求訪問動態頁面
刷新一次后輪詢
刷新后輪詢
?
?
?