Tomcat多实例部署及nginx+tomcat的负载均衡和动静分离

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

访问测试

静态页面访问

 静态页面请求访问动态页面

刷新一次后轮询

刷新后轮询

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Delphi调用WindowsAPI获取窗口进程

Delphi有封装的很好的WindowsAPI&#xff0c;直接调用即可&#xff0c;大体上和C差不多&#xff0c;有些地方需要额外处理。 给出一个实例&#xff1a; varg_process: THandle;procedure initGlobal(); beginvarg_handle: HWND;g_handle : FindWindow(clsName, name);if g_ha…

矩阵定理复习记录

矩阵复习 矩阵导数定理 若A是一个如下矩阵&#xff1a; A [ a 11 a 12 a 21 a 22 ] A \begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix} A[a11​a21​​a12​a22​​] y是一个向量矩阵&#xff1a; y ⃗ [ y 1 y 2 ] \vec{y}\begin{bmatrix}y_1\\y_2\e…

在vue项目使用数据可视化 echarts ,柱状图、折线图、饼状图使用示例详解及属性详解

官网地址&#xff1a;Apache ECharts ​一、下载插件并在页面中引入 npm install echarts --save 页面导入&#xff1a; import * as echarts from echarts 全局导入&#xff1a; main.js 中&#xff0c;导入并注册到全局 import echarts from echarts Vue.prototype.$echart…

Clone函数

概述 Clone函数是一种用于复制的计算机函数。在程序编写中&#xff0c;除了自定义一个拷贝构造函数来实现对象复制外&#xff0c;还可以实现一个clone函数。这需要借助编译器实现的一个隐藏拷贝构造函数&#xff0c;这样的做法&#xff0c;更省心。 中文名clone函数外文名clon…

C# 使用FFmpeg.Autogen对byte[]进行编解码

C# 使用FFmpeg.Autogen对byte[]进行编解码&#xff0c;参考&#xff1a;https://github.com/vanjoge/CSharpVideoDemo 入口调用类&#xff1a; using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using FFmpeg.AutoGen;namespace F…

C++11异步与通信之 packaged_task

概念简介 packaged_task 用于包装可调用目标(Callable)为一个对象,如lambda&#xff0c;普通函数&#xff0c;小括号重载等&#xff0c;用于异步调用。 其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中&#xff0c;和promise类似。 将函数的调用与函数返…

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比

时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-LSTM、LSTM集合经验模态分解结合长短期记忆神经网络时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 时序预测 | …

小龟带你妙写排序之快速排序

快速排序 一. 快速排序原理二. 题目三. 快速排序的思路分析&#xff08;图文结合&#xff09;四.代码 一. 快速排序原理 先从数据序列中选一个元素&#xff0c;并将序列中所有比该元素小的元素都放到它的右边或左边&#xff0c;再对左右两边分别用同样的方法处之直到每一个待处…

runtime error: member access within misaligned address(力扣最常见错误之一)

runtime error: member access within misaligned address&#xff08;力扣最常见错误之一&#xff09; 前言原因和解决办法总结 前言 最近博主在刷力扣时&#xff0c;明明代码逻辑都没问题&#xff0c;但总是报下面这个错误&#xff1a; runtime error: member access within…

django实现登录和登录的鉴权

1、创建数据库的管理员表 在models.py 中定义admin表&#xff0c;为了简单&#xff0c;表里只有用户名和密码还有默认加的id 三个字段 from django.db import models# Create your models here.class Admin(models.Model):username models.CharField(verbose_name"用户…

源码框架-三勾软件

javaspringboot微信小程序商城SAAS前后端源码: 三勾商城是开发友好的微信小程序商城&#xff0c;框架支持SAAS&#xff0c;支持发布 iOS Android 公众号 H5 各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;等多个平台&#xff0c;不可多得的二开神器…

训练用于序列分类任务的 RoBERTa 模型的适配器

介绍 NLP当前的趋势包括下载和微调具有数百万甚至数十亿参数的预训练模型。然而,存储和共享如此大的训练模型非常耗时、缓慢且昂贵。这些限制阻碍了 RoBERTa 模型开发更多用途和适应性更强的 NLP 技术,该模型可以从多个任务中学习并针对多个任务进行学习;在本文中,我们将重…

Kafka:安装和配置

producer&#xff1a;发布消息的对象&#xff0c;称为消息产生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka将消息分门别类&#xff0c;每一个消息称为一个主题&#xff08;topic&#xff09; consumer&#xff1a;订阅消息并处理发布消息的对象…

模拟 枚举

分享牛客算法基础精选题单题目打卡!!! 目录 字符串的展开 多项式输出 机器翻译 : 铺地毯 : [NOIP2016]回文日期 字符串的展开 原题链接 : 字符串的展开 思路 : 模拟 代码 : #include<iostream> #include<cstring> #include<algorithm> using na…

Java课题笔记~ ServletContext

单个Servlet的配置对象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…

centos自动同步北京时间

1、安装ntpdate服务 yum -y install ntpdate 2、加入自动任务计划 查找ntpdate的路径&#xff1a; which ntpdate 复制这个路径。 编辑自动任务计划并加入ntpdate&#xff1a; crontab -e # 每小时第30分钟同步AD域控时间 30 * * * * /usr/sbin/ntpdate -u 192.168.2.8 > …

DP——动态规划

DP——动态规划 动态规划算法动态规划的一般步骤特殊DP——背包0-1背包问题完全背包问题 总结 动态规划算法 当涉及到解决具有重叠子问题的优化问题时&#xff0c;动态规划是一种常用的算法技术。它通过将问题分解为一系列重叠子问题&#xff0c;并使用递归或迭代的方式来解决…

Spring Cloud Gateway系例—GatewayFilter 工厂

目录 6.1.AddRequestHeader 6.2.AddRequestHeadersIfNotPresent 6.3.AddRequestParameter 6.4.AddResponseHeader 6.5.CircuitBreaker 6.5.1. 熔断指定的状态码 6.6.CacheRequestBody 6.7.DedupeResponseHeader 6.8.FallbackHeaders 6.9.JsonToGrpc 6.10.LocalRespo…

TypeScript 非空断言

TypeScript 非空断言 发布于 2020-04-08 15:20:15 17.5K0 举报 一、非空断言有啥用 介绍非空断言前&#xff0c;先来看个示例&#xff1a; function sayHello(name: string | undefined) {let sname: string name; // Error } 对于以上代码&#xff0c;TypeScript 编译器…

用户端Web自动化测试-L1

目录&#xff1a; Web自动化测试价值与体系环境安装与使用自动化用例录制自动化测试用例结构分析web浏览器控制常见控件定位方法强制等待与隐式等待常见控件交互方法自动化测试定位策略搜索功能自动化测试用户端Web自动化测试 1.Web自动化测试价值与体系 功能测试场景: UI 自…