Tomcat负载均衡、动静分离

102 阅读6分钟

Tomcat多实例部署及负载均衡、动静分离

Tomcat多实例部署

将安装 Tomcat 所需软件包传到/opt目录下,并关闭防火墙

img

安装jdk

img

设置jdk环境变量

 vim /etc/profile.d/java.sh
 export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
 export JRE_HOME=$JAVA_HOME/jre
 export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
 export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
 ​
 source /etc/profile.d/java.sh
 java -version

img

img

安装tomcat

 cd /opt
 tar zxvf apache-tomcat-8.5.16.tar.gz   #解压tomcat包
 mkdir /usr/local/tomcat   #新建文件夹
 mv apache-tomcat-8.5.16 /usr/local/tomcat/tomcat1   #移动改名
 cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

img

img

配置 tomcat 环境变量

 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
 ​
 source /etc/profile.d/tomcat.sh

img

img

修改 tomcat2主配置文件

要求各 tomcat 实例配置不能有重复的端口号

 vim /usr/local/tomcat/tomcat2/conf/server.xml
 ​
 <Server port="8006" shutdown="SHUTDOWN">    
 #22行,修改Server prot,默认为8005 -> 修改为8006
 <Connector port="8081" protocol="HTTP/1.1"      
 #69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
 <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />    
 #116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010

img

img

img

修改 tomcat1 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量

 vim /usr/local/tomcat/tomcat1/bin/startup.sh 
 ​
 Start Script for the CATALINA Server
 #-----------------------------------------------------------------------------
 #添加以下内容
 export CATALINA_BASE=$CATALINA_BASE1
 export CATALINA_HOME=$CATALINA_HOME1
 export TOMCAT_HOME=$TOMCAT_HOME1
 ​
 ​
 vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
 ​
 Stop script for the CATALINA Server
 #-----------------------------------------------------------------------------
 #添加以下内容
 export CATALINA_BASE=$CATALINA_BASE1
 export CATALINA_HOME=$CATALINA_HOME1
 export TOMCAT_HOME=$TOMCAT_HOME1

img

img

修改 tomcat2 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量

 vim /usr/local/tomcat/tomcat2/bin/startup.sh 
 ​
 Start Script for the CATALINA Server
 -----------------------------------------------------------------------------
 export CATALINA_BASE=$CATALINA_BASE2
 export CATALINA_HOME=$CATALINA_HOME2
 export TOMCAT_HOME=$TOMCAT_HOME2
 ​
 ​
 vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
 ​
 Stop script for the CATALINA Server
 -----------------------------------------------------------------------------
 export CATALINA_BASE=$CATALINA_BASE2
 export CATALINA_HOME=$CATALINA_HOME2
 export TOMCAT_HOME=$TOMCAT_HOME2

img

img

启动各 tomcat 中的 /bin/startup.sh

 /usr/local/tomcat/tomcat1/bin/startup.sh 
 /usr/local/tomcat/tomcat2/bin/startup.sh 
 netstat -natp | grep java

img

浏览器访问测试

http://192.168.239.10:8080

http://192.168.239.10:8081

img

img

到此多实例则部署完成

Nginx+Tomcat负载均衡、动静分离

部署Nginx 负载均衡器

环境

Nginx 服务器:192.168.239.20:80 Tomcat服务器1:192.168.239.30:80 Tomcat服务器2:192.168.239.10:8080 192.168.239.10:8081

 systemctl stop firewalld    #关闭防火墙
 systemctl disable firewalld    #关闭开机自启
 setenforce 0
 tar zxvf nginx-1.12.0.tar.gz -C /opt/    #解压
 yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make  #安装相关依赖包
 useradd -M -s /sbin/nologin nginx     #创建运行用户
 cd /opt
 cd nginx-1.12.0/
 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx    #配置
 make && make install    #编译安装
 ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/  #优化路径使系统识别nginx命令
 ​
 vim /lib/systemd/system/nginx.service   #添加nginx服务
 [Unit]
 Description=nginx
 After=network.target
 [Service]
 Type=forking
 PIDFile=/usr/local/nginx/logs/nginx.pid
 ExecStart=/usr/local/nginx/sbin/nginx
 ExecrReload=/bin/kill -s HUP $MAINPID
 ExecrStop=/bin/kill -s QUIT $MAINPID
 PrivateTmp=true
 [Install]
 WantedBy=multi-user.target
 systemctl daemon-reload  #重载单元
 systemctl start nginx.service   #开启服务
 systemctl enable nginx.service   #开启开机自启

img

img

img

img

img

img

img

img

部署两台Tomcat 应用服务器

第一台tomcat部署

将安装 Tomcat 所需软件包传到/opt目录下,并关闭防火墙

安装jdk

img

img

解压到指定目录

img

设置jdk环境变量

 [root@localhost opt]#  vim /etc/profile.d/java.sh

img

 [root@localhost local]# source /etc/profile.d/java.sh
安装tomcat

解压

img

img

网页测试

img

动静分离配置

Tomcat1 server 配置

 mkdir /usr/local/tomcat/webapps/test
 vim /usr/local/tomcat/webapps/test/index.jsp
 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <html>
 ​
 <head>
 <title>JSP test1 page</title>   #指定为 test1 页面
 </head>
 ​
 <body>
 <% out.println("动态页面 1,this is dynamic web1");%>
 </body>
 </html>
 ​
 vim /usr/local/tomcat/conf/server.xml
 #由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
     </Context>
 </Host>
 ​
 /usr/local/tomcat/bin/shutdown.sh 
 /usr/local/tomcat/bin/startup.sh 

img

img

img

img

第二台tomcat部署

 mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
 ​
 vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <html>
 ​
 <head>
 <title>JSP test2 page</title>   #指定为 test2 页面
 </head>
 ​
 <body>
 <% out.println("动态页面 2,this is dynamic web2");%>
 </body>
 </html>
 ​
 ​
 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>
 ​
 ​
 /usr/local/tomcat/tomcat1/bin/shutdown.sh 
 /usr/local/tomcat/tomcat1/bin/startup.sh 
 ​
 ​
 vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <html>
 ​
 <head>
 <title>JSP test3 page</title>   #指定为 test3 页面
 </head>
 ​
 <body>
 <% out.println("动态页面 3,this is dynamic web3");%>
 </body>
 </html>
 ​
 ​
 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" />
 </Host>
 ​
 /usr/local/tomcat/tomcat2/bin/shutdown.sh 
 /usr/local/tomcat/tomcat2/bin/startup.sh 

img

img

img

img

img

img

img

img

img

img

Nginx server 配置

准备静态页面和静态图片

 cd /usr/local/nginx/html/
 vim index.html
 <html>
 <body>
 <h1>这是静态页面</h1>
 </body>
 </html>
 ​
 mkdir /usr/local/nginx/html/img
 cd /usr/local/nginx/html
 cp gou.jpg ./img
 vim /usr/local/nginx/conf/nginx.conf
 ......
 http {
 ......
     #gzip on;
     
 ​
 #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
 upstream tomcat_server {
         server 192.168.239.30:8080 weight=1;
         server 192.168.239.10:8080 weight=1;
         server 192.168.239.10:8081 weight=1;
 }
 ​
 ​
 server {
     listen 80;
     server_name www.kgc.com;
 ​
     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,来获取源IP
             proxy_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/img;
         expires 10d;
     }
     
     location / {
         root html;
         index index.html index.htm;
     }
 ​
 ......
     }
 ......
 }
 ​
 重启nginx服务
 ​
 systemctl restart nginx.service

img

img

img

img

img

img

测试

测试静态页面效果 浏览器访问 http://192.168.239.20/ 浏览器访问 http://192.168.239.20/gou.jpg

测试负载均衡效果,不断刷新浏览器测试 浏览器访问 http://192.168.239.20/index.jsp

img

img

img

img

img

Nginx 负载均衡模式回顾:

rr 负载均衡模式: 每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。

least_conn 最少连接: 优先将客户端请求调度到当前连接最少的服务器。

ip_hash 负载均衡模式: 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。

fair(第三方)负载均衡模式: 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

url_hash(第三方)负载均衡模式: 基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

Nginx 四层代理配置回顾:

Nginx常用于四层负载均衡和web service的代理转发。 nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等,类似阿里云slb的 tcp协议模式。默认情况下,此模块不构建,应使用配置参数启用 --with-stream 。

nginx server2配置

 systemctl stop firewalld.service
 ​
 setenforce 0
 ​
  yum install -y epel-release #下载扩展在线源使用yum安装nginx也可以用编译安装
 ​
  yum install -y nginx
 ​
  vim /etc/nginx/nginx.conf
 ​
   include /etc/nginx/conf.d/*.conf;
     upstream tomcat_server {
         server 192.168.239.30:8080 weight=1;
         server 192.168.239.10:8080 weight=1;
         server 192.168.239.10:8081 weight=1;
     }
     server {
         listen       80;
         listen       [::]:80;
         server_name  _;
         root         /usr/share/nginx/html;
 ​
         # Load configuration files for the default server block.
         include /etc/nginx/default.d/*.conf;
     
          location ~ .*.jsp$ {
                 proxy_pass http://tomcat_server;
                 proxy_set_header HOST $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
     
         location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css)$ {
                 root /usr/local/nginx/html/img;
                 expires 10d;
         }
         error_page 404 /404.html;
         location = /404.html {
         }
     
         error_page 500 502 503 504 /50x.html;
         location = /50x.html {
         }
     }
 systemctl restart nginx
 BASH 复制 全屏

img

img

img

img

测试访问

测试负载均衡效果,不断刷新浏览器测试 浏览器访问 http://192.168.239.40/index.jsp

img

img

img

四层代理配置

img

img

img

 events {
     worker_connections  1024;
 }
 ​
 stream {
     upstream web_server {
     server 192.168.239.40:80;   #添加节点服务器地址
     server 192.168.239.20:80;
 }
   server {
       listen 8080;
       proxy_pass web_server;
   }
 }

img

img

浏览器访问

测试静态页面效果 浏览器访问 http://192.168.239.50:8080/ 浏览器访问 http://192.168.239.50:8080/gou.jpg

测试负载均衡效果,不断刷新浏览器测试 浏览器访问 http://192.168.239.50:8080/index.jsp

img

img

img

img

img