nginx和tomcat负载均衡、静态分离

news2024/11/30 10:35:12

tomcat重要目录

bin

存放启动和关闭Tomcat脚本
conf存放Tomcat不同的配置文件
doc存放Tomcat文档
lib存放Tomcat运行需要的库文件
logs存放Tomcat执行时的log文件
src存放Tomcat的源代码
webappsTomcat的主要Web发布目录
work存放jsp编译后产生的class文件

nginx负载均衡原理

nginx实现负载均衡是通过反向代理实现

反向代理原理

 nginx配置反向代理的主要参数

  • upstream 服务池名{}  #配置后端服务池,以提供响应数据
  • proxy_pass http://服务池名  #配置将访问请求转发给后端服务池的服务器处理

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

nginx七层服务器部署

Nginx 服务器:192.168.47.10:80
Tomcat服务器1:192.168.80.20:80
Tomcat服务器2:192.168.47.50:8080  192.168.47.50:8081

1.部署Nginx 负载均衡器

systemctl stop firewalld
setenforce 0

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

useradd -M -s /sbin/nologin nginx

cd /opt/nginx
tar zxvf nginx-1.22.0.tar.gz

cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-stream
###启用 stream模块,提供4层调度

make -j4 && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

vim /lib/systemd/system/nginx.service
[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

chmod 754 /lib/systemd/system/nginx.service
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service

 2.部署2台Tomcat 应用服务器

systemctl stop firewalld
setenforce 0

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

vim /etc/profile
export 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

source /etc/profile

tar zxvf apache-tomcat-8.5.16.tar.gz

mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh

netstat -ntap | grep 8080

 通过之前的多实例部署,直接使用tomcat服务器2

 3.动静分离配置

(1)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,http://www.test1.com");%>
</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 

 (2)Tomcat2 server 配置

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");%>
</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");%>
</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 

 

 (3)Nginx server 配置

#准备静态页面
echo '<html><body><h1>这是静态页面</h1></body></html>

    #gzip  on;
#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
    upstream tomcat_server {
             server 192.168.47.20:8080 weight=1;
             server 192.168.47.50:8080 weight=1;
             server 192.168.47.50:8081 weight=1;
    }

    server {
        listen       80;
        server_name  localhost;

        charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location ~ .*\.jsp$ {     #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
          proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
          proxy_set_header HOST $host;


          proxy_set_header X-Real-IP $remote_addr;
##把$remote_addr赋值给X-Real-IP,来获取源IP

          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
        }

 

 

 

 

nginx四层反向代理 在七层基础上添加

 配置四层反向代理nginx负载均衡服务器 192.168.47.30

systemctl stop firewalld
setenforce 0

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

useradd -M -s /sbin/nologin nginx

cd /opt/nginx
tar zxvf nginx-1.22.0.tar.gz

cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-stream
###启用 stream模块,提供4层调度

make -j4 && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

vim /lib/systemd/system/nginx.service
[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

chmod 754 /lib/systemd/system/nginx.service
systemctl daemon-reload
systemctl start nginx.service
systemctl enable nginx.service

配置七层反向代理nginx负载均衡服务器 192.168.47.10 192.168.47.100,以上同样步骤

 部署tomcat应用服务器 tomcat1 tomcat2 tomcat3,用上面七层反向代理的步骤 

  动静分离配置

(1)nginx静态设置

 

(2)tomcat动态设置

 

 

 四层反向代理nginx server设置

Nginx 四层代理配置:
./configure --with-stream

# vim /usr/local/nginx/conf/nginx.conf


和http同等级:所以一般只在http上面一段设置,


stream {               #启用 stream模块,提供4层调度
   upstream appserver {                     #配置负载均衡的七层nginx服务器列表地址池
       server 192.168.47.10:80 weight=1;
       server 192.168.47.100:80 weight=1;
       }
      server {
        listen 8080;
        proxy_pass appserver;   #访问本主机8080端口实际是转发到地址池访问
       }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

七层反向代理nginx server 设置

 

 

 

 

 

 Nginx负载均衡策略

介绍完Nginx负载均衡的相关指令后,我们已经能实现将用户的请求分发到不同的服务器上,那么除了采用默认的分配方式外,我们还能采用什么样的负载算法?

Nginx的upstream支持如下六种方式的分配算法,分别是:

算法名称说明
轮询  rr   默认方式
weight wrr 权重方式
ip_hash依据ip分配方式(根据客户端IP做hash缓存的算法)
least_conn依据最少/小连接方式
url_hash依据URL分配方式(根据客户端访问的url路径做hash缓存的算法)
fair依据响应时间方式

补充:random  随机分配

          hash   $remote_addr   consistent    一致性hash算法, 客户端ip哈希算法,是ip_hash算法的加强版

          nginx全局变量

nginx反向代理实现会话保持

1)ip_hash    url_hash      客户端IP一致性哈希算法 hash $remote_addr consistent     基于客户端IP/访问的URL做哈希缓存实现会话保持

2)sticky_cookie_insert                                                             需要安装第三方的sticky模块,基于cookie来判断实现会话保持

3)配置后端应用服务器共享 session 或使用后端服务器自身通过相关机制保持 session 同步实现会话保持

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

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

相关文章

Slack 工作效率管理平台的使用教程

Slack 将人员集中到统一的团队中&#xff0c;改变了组织的沟通方式。 Slack工具下载直通车 Slack下载直通车 Slack 侧栏 你可以从侧栏访问 Slack 对话。你会看到你已经加入的频道列表、你的私信、特定对话的通知以及编写新消息的选项。 撰写 你可以使用撰写按钮来编辑和发送…

网络安全面试题大全(整理版)300+面试题附答案详解,最全面详细

前言 随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;想要进入到网络安全行业的人也越来越多。 为了拿到心仪的Offer之外&#xff0c;除了学好网络安全知识以外&#xff0c;还要应对好企业的面试。 作为一个安全老鸟&#xff0c;工作这么多年&…

慢 SQL 优化之索引的作用是什么? | 京东云技术团队

前言 本文针对 MySQL 数据库的 InnoDB 存储引擎&#xff0c;介绍其中索引的实现以及索引在慢 SQL 优化中的作用。 本文主要讨论不同场景下索引生效与失效的原因。 慢SQL与索引的关系 慢SQL优化原则 数据库也是应用&#xff0c;MySQL 作为一种磁盘数据库&#xff0c;属于典…

有哪些文档和知识管理工具推荐? - 易智编译EaseEditing

以下是一些常用的文档和知识管理工具推荐&#xff1a; Evernote&#xff1a; Evernote是一款强大的笔记和知识管理工具&#xff0c;可以帮助您保存和组织文档、笔记、图片和网页剪辑&#xff0c;并支持跨设备同步和搜索功能。 Microsoft OneNote&#xff1a; OneNote是微软的…

图论中的算法

图论的概念&#xff1a;图论是数学的一个分支&#xff0c;它是以图为研究对象&#xff0c;图论中的图是由若干个给定的点及连接两点的线所构成的图形&#xff0c;这种图形通常用来描述某些实体之间的某种特定的关系&#xff0c;用点代表实体&#xff0c;用连接两点之间的线表示…

2021年国赛高教杯数学建模A题FAST主动反射面的形状调节解题全过程文档及程序

2021年国赛高教杯数学建模 A题 FAST主动反射面的形状调节 原题再现 中国天眼——500 米口径球面射电望远镜&#xff08;Five-hundred-meter Aperture Spherical radio Telescope&#xff0c;简称 FAST&#xff09;&#xff0c;是我国具有自主知识产权的目前世界上单口径最大、…

Java 进阶 -- 集合(三)

4、实现 实现是用于存储集合的数据对象&#xff0c;它实现了接口部分中描述的接口。本课描述了以下类型的实现: 通用实现是最常用的实现&#xff0c;是为日常使用而设计的。它们在标题为“通用实现”的表格中进行了总结。特殊目的实现是为在特殊情况下使用而设计的&#xff0…

IP归属地API分享

各大网站和app都更新了用户IP归属地功能&#xff0c;但是如何获取IP归属地信息科难为了一些技术人员了&#xff0c;下面给大家分享最好用的IP归属地API&#xff0c;能够大大的提升了效率。 IP归属地API&#xff08;IP66_ip归属地在线查询_免费ip查询_ip精准定位平台&#xff09…

关于使用 AzureKinect 不识别的问题解决

AzureKinect如果不识别可能是因为 :(请一个一个排查) 1. 数据线和Kinect电源线没插,或者电源跟数据线插反了 2. SDK 没安装,一共需要安装两个SDK,安装教程 Unity AzureKinect 初识(一) 安装_会思考的猴子的博客-CSDN博客 3.数据线需要插 USB3.0或者3.1,集线器最好是…

软件测试Pytest实现接口自动化应该如何在用例执行后打印日志到日志目录生成日志文件?

Pytest可以使用内置的logging模块来实现接口自动化测试用例执行后打印日志到日志目录以生成日志文件。以下是实现步骤&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站百万播放全网第一的自动化测试教程&#xff0c;同…

iPhone手机如何将短信同步到安卓手机上

1.下载爱思助手 2.备份全量数据 3.用爱思助手查看备份数据&#xff1b;注&#xff1a;一定要用专业模式查看 4.代开专业模式&#xff0c;就能查看短信模块得数据&#xff0c;并且到导出成 sms.db文件 5. 用在线 db文件转成csv文件格式;地址&#xff1a;DB轉CSV 線上 - db轉成…

3.2 分析特征间的关系

3.2 分析特征间的关系 3.2.1 绘制散点图 scatter()例子1&#xff1a;绘制2000-2017年各季度国民生产总值散点图例子2&#xff1a;使用不同颜色不同形状的点&#xff0c;绘制2000-2017年各产业各季度国民生产总值散点图 3.2.2 绘制折线图 plot()例子1&#xff1a;绘制2000-2017年…

接口自动化测试框架开发(pytest+allure+aiohttp+ 用例自动生成)

近期准备优先做接口测试的覆盖&#xff0c;为此需要开发一个测试框架&#xff0c;经过思考&#xff0c;这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的&#xff0c;测试人员会希望很快能得到结果反馈&#xff0c;然而接口的数量一般都很多&#xff0c;而且会越来越…

Matlab论文插图绘制模板第100期—紧凑排列多子图(Tiledlayout)

不知不觉&#xff0c;《Matlab论文插图绘制模板》系列来到了第100期。 在此之前&#xff0c;其实我也没想到会有这么多种数据可视化表达方式&#xff0c;论文里不是折线图就是柱状图&#xff0c;单调的很。 假如研究生那会要是能遇到现在的自己&#xff08;分享的内容&#x…

因果一致性

上一篇写到了一致性模型&#xff0c;而因果一致性模型比较复杂&#xff0c;故单独写一篇文章来记录 强一致性模型会在网络分区时变的不可用&#xff0c;而最终一致性模型放弃了safety&#xff0c;但同时也对系统可用性和性能产生明显的损害。上层要做些操作。于是有了一个折中…

高考作文AI大比拼「GPT-4 vs 文心一言 vs 通义千问」

2023 年 6 月 7 日上午&#xff0c;全国高考语文科目已经考试结束&#xff0c;第一时间拿到了全国甲卷的高考作文题目&#xff1a; 阅读下面的资料&#xff0c;根据需要写作 人们因技术发展得更好地掌控时间&#xff0c;但也有人因此成为了时间的仆人。 这句话引出了你怎样的联…

备战金九银十:1200道Java面试真题合集,助你搞定面试官

不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。 运筹帷幄之后&#xff0c;决胜千里之外!不打毫无准备的仗,我觉得大家…

爬虫数据采集需要什么样的代理ip以及遇到的反爬措施

随着互联网的快速发展&#xff0c;数据已经成为许多行业中的重要资源。网络爬虫作为一种数据采集工具&#xff0c;在许多领域中得到了广泛应用。但是现在很多网站都有非常多的限制&#xff0c;所以在爬取数据的时候&#xff0c;还需要借助代理ip来助力&#xff0c;才能更好的完…

OKHttp_官方文档[译文]

OKHttp功能类介绍 OKHttp网络请求流程分析 OKHttp连接池 OKHttp分发器 OKHttp拦截器 RetryAndFollowUpInterceptorBridgeInterceptorCacheInterceptorConnectInterceptorCallServerInterceptor 总览 OkHttp HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方…

Tcp黏包和半包形象讲解以及结合Netty应用层的解决方案

黏包&#xff1a;顾名思义就是好几次的请求消息粘在了一起 半包&#xff1a;顾名思义就是一个消息分成了好几半发送出去 首先讲解这两种现象出现的原因: 1.大家都知道tcp是一个可靠的网络协议&#xff0c;每发送一段消息&#xff0c;就要进行一次&#xff0c;确认应答(ack处…