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

前言

Tomcat简介

最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发

安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件

Nginx 应用

Nginx是一款非常优秀的HTTP服务器软件

(1)支持高达50 000个并发连接数的响应

(2)拥有强大的静态资源处理能力

(3)运行稳定

(4)内存、CPU等系统资源消耗非常低

目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力

一.Nginx 负载均衡

1.实现原理

通过反向代理实现,还可以将nginx接收到的请求转发给多个后端应用服务器处理

2.反向代理原理

将Nginx接收到的请求转发给其它应用服务器处理

3.Nginx 配置反向代理的主要参数

upstream 服务池名 { }

  配置后端服务器池,以提供响应数据

proxy_pass http://服务池名

 配置将访问请求转发给后端服务器池的服务器处理

upstream框架中,参数的含义

weight 服务访问的权重,默认是1
max_conns server的最大并发连接数,仅作用于单worker进程,默认是0,表示没有限制
max _fails   在fail timeout时间段内,最大的失败次数,当达到最大失败时,会在failtimeout秒内这台server不允许再次被选择
fail timeout 单位为秒,默认10秒

4.动静分离的概念

静态页面请求,由nginx自行处理并响应;动态页面请求,则nginx通过反向代理转发给后端应用服务器处理

5.Nginx 静态处理优势

Nginx 静态处理优势:Nginx 处理静态页面的效率远高于 Tomcat 的处理能力若 Tomcat 的请求量为1000次,则 Nginx 的请求量为6000次Tomcat 每秒的吞吐量为0.6M,Nginx 的每秒吞吐量为3.6MNginx 处理静态资源的能力是 Tomcat 处理的6倍

6.动静分离原理

服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源由 Nginx 提供服务,动态资源由 Nginx 转发至后端。

二.Nginx 负载均衡模式

1.轮询(默认)

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

2.加权轮询

weight值越大,被分配到的访问请求概率越高,主要用于后端服务器性能不均匀的情况。

3.least_conn 最小连接

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

4.ip_hash 

每个请求按访问ip的hash结果分配,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不可用,可以解决session的问题。但是ip_hash如下问题:当后端服务器宕机后,session会丢失;来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载不均。

5.fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。需要安装upstream_fair模块才能实现。

6.url_hash(第三方)

基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好,可以提高后端缓存服务器的效率。


session 共享问题还可以使用sticky_cookie_insert启用会话亲缘关系,基于cookie来判断,使来自同一客户端的请求被传递到一组服务器在同一台服务器。也可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    sticky_cookie_insert srv_id expires=1h domain=www.xy101.com path=/;
}

#说明:需要引入第三方sticky模块才能实现;expires:设置浏览器中保持cookie的时间;domain:定义cookie的域;path:为cookie定义路径

7.nginx七层反向代理配置

基于http、https、mail等七层应用协议的代理转发(根据用户访问请求的URL路径来转发请求),通常用于 动静分离 等应用场景

1)在http配置块中使用upstream定义后端服务器列表名称和节点参数
http {
    upstream 服务器池名称 {
        server IP1:PORT1 weight=1;
        server IP2:PORT2 weight=1;
        ......
    }


2)在server配置块中使用location匹配用户请求的动态页面的URL路径,使用 proxy_pass 基于协议代理转发
    server {
        ......
        location ~ .*\.jsp$ {
            proxy_pass http://服务器池名称;
            
            #用于为后端服务器获取真实的客户端地址
            proxy_set_header HOST $host;
            proxy_set_header X_Real_IP $remote_addr;
            proxy_set_header X_Forwarded_For $proxy_add_x_forwarded_for;
        }
    ......
    }
......
}

8.四层反向代理配置

基于 IP 和 端口 实现的代理转发(根据用户请求的IP和端口来转发请求),通常用于做 网关访问入口的负载均衡器 等应用场景

1)编译安装时需要添加 stream 四层代理模块  ./configure --with-stream

2)在 http 配置块同层级,一般在 http 配置块上面添加 stream 配置块,在 stream 配置块里使用upstream定义后端服务器列表名称和节点参数以及使用server配置块定义监听端口和转发配置
stream {
    upstream 服务器池名称 {
        server IP1:PORT1 weight=1;
        server IP2:PORT2 weight=1;
        ......
    }

    server {
        listen IP:PORT;
        proxy_pass 服务器池名称;
    }
}

http {....}

三.配置服务器

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
 
#解压nginx文件
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
 
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \                          #启用文件修改支持
--with-http_stub_status_module \           #启用状态统计
--with-http_gzip_static_module \           #启用 gzip静态压缩
--with-http_flv_module \                   #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module                     #启用 SSL模块,提供SSL加密功能
--with-stream                              #启用 stream模块,提供4层调度
---------------------------------------------------------------------------------------------------------
./configure \
--prefix=/usr/local/nginx \                # 指定安装目录为 /usr/local/nginx
--user=nginx \                             # 指定运行 nginx 的用户为 nginx
--group=nginx \                            # 指定运行 nginx 的用户组为 nginx
--with-file-aio \                          # 启用文件异步IO支持
--with-http_stub_status_module \           # 启用 HTTP Stub 状态模块,用于获取 nginx 的运行状态
--with-http_gzip_static_module \           # 启用 HTTP gzip 静态压缩模块,用于对静态文件进行 gzip 压缩
--with-http_flv_module \                   # 启用 HTTP FLV 模块,提供对 FLV 视频的伪流支持
--with-http_ssl_module \                   # 启用 HTTP SSL 模块,提供 SSL 加密功能
--with-stream                              # 启用 Stream 模块,提供 4 层调度功


#编译及安装
make && make install
 
#软链接便于系统识别nginx操作命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

添加system管理nginx服务

#添加nginx系统服务以便系统管理启动、停止、重启

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 start nginx.service
systemctl enable nginx.service

2.部署tomcat服务器配置

systemctl stop firewalld
setenforce 0
 
#解压安装JDK(默认自带)
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
 
#设置JDK环境变量
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
 
#解压tomcat
tar zxvf apache-tomcat-8.5.16.tar.gz
 
#将文件移动至/usr/local/下并重命名
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
 
#tomcat启动关闭脚本位置
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh
 
#重新加载服务,并开启,查看是否成功启动
/usr/local/tomcat/bin/startup.sh 
lsof -i:8080
netstat -ntap | grep 8080

3.配置Nginx动静分离

(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>
 
(2)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 test2 page</title>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
  <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
</Host>
#重启两台服务
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

4.Nginx server 配置

#准备静态页面和静态图片
echo '<html><body><h1>这是默认目录静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/kiki
 
#编辑nginx配置文件
​vim /usr/local/nginx/conf/nginx.conf
 
......
http {
......
#gzip on;
#后端负载服务器的地址
upstream tomcat_server {
  server 192.168.1.20:8080 weight=1;
  server 192.168.1.30:8080 weight=1;
}
 
server {
  listen 80;
  server_name www.tong.com;
 
  charset utf-8;
 
  #access_log logs/host.access.log main;
 
#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
  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;  
  }
  
  #配置Nginx处理静态图片请求
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
    root /usr/local/nginx/html/kiki;
    expires 10d;
  }
  
  location / {
    root html;
    index index.html index.htm;
  }
......

Nginx负载均衡如何实现会话保持?

(1)ip_hash 或 一致性hash算法                        基于客户端IP做hash缓存将请求发送给同一个后端节点服务器来实现会话保持,但是此方法容易导致负载失衡问题

(2)sticky_cookie_insert                             基于cookie来判断实现会话保持
    upstream backend {
    server ...... ;
    sticky_cookie_insert srv_id expires=浏览器中保持cookie的时间 domain=cookie的域名 path=cookie的路径;
    }
    
(3)后端应用服务器自身通过相关机制设置,使用缓存数据库为后端节点服务器做session同步复制实现会话保持

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

workhome 2024.06.16 math-6

数学分析语句断句&#xff0c;分析&#xff0c;画画做图&#xff0c;逻辑&#xff0c;解析&#xff0c;计算过程&#xff0c;严谨&#xff0c;我们程序出错多数是因为不够严谨&#xff0c;少了漏了可能出现的情况。 1&#xff09; https://download.csdn.net/download/spencer_…

Aspose将doc,ppt转成pdf

1.需要引入的jar包 链接: https://pan.baidu.com/s/1t3wqq7KrHi50K9KX3-Eb9A?pwdu4se 提取码: u4se <dependency><groupId>com.aspose</groupId><artifactId>aspose-words-jdk16</artifactId><version>15.8.0</version><scop…

xss+csrf项目实例

项目背景&#xff1a; 如下&#xff1a;我们是在一个类似文章管理系统的网站上面发现的该漏洞。我们将其运行在本地的phpstudy集成环境上面。 源码地址下载链接&#xff1a;https://pan.baidu.com/s/1MpnSAq7a_oOcGh4XgPE-2w 提取码&#xff1a;4444 考察内容&#xff1a; …

C. Rooks Defenders(树状数组)

You have a square chessboard of size nnnn. Rows are numbered from top to bottom with numbers from 11 to nn, and columns — from left to right with numbers from 11 to nn. So, each cell is denoted with pair of integers (x,y)(x,y) (1≤x,y≤n1≤x,y≤n), where …

质疑标普,理解标普,加入标普

上周我在文章里提到过&#xff0c;标普信息科技LOF(161128)出现套利机会。每天申购卖出&#xff0c;到现在一个账户56*6336润。 得益于美股七巨头轮流领涨&#xff0c;161128依旧坚挺&#xff0c;每天溢价都是10%&#xff0c;成交量1个多亿&#xff0c;场内新增份额才400万份&…

大模型生成的常见Top-k、Top-p、Temperature参数

参考&#xff1a; https://zhuanlan.zhihu.com/p/669661536 topK&#xff0c;topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后&#xff0c; topK&#xff0c;比如K3&#xff0c;表示采样概率最大的前3个&#xff0c;其他全…

第一篇——怎样堵住我们人生错误的源头

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 再次开始了孙子兵法的学习&#xff0c;之前听完就让我醍醐灌顶&#xff0…

Python基础用法 之 变量

1.变量的定义 变量的作用&#xff1a;是⽤来保存数据的。定义的语法&#xff1a;变量名 数据值使用&#xff1a;直接使⽤变量名 即可使⽤变量中存储的数据。注意&#xff1a;变量必须先定义后使用。 (即 必须 先存⼊数据 才能 获取数据) 。 # 需求 1, 定义⼀个变量 保存你的名…

设计模式- 责任链模式Chain of Responsibility(行为型)

责任链模式(Chain of Responsibility) 责任链模式是一种行为模式&#xff0c;它为请求创建一个接收者对象的链&#xff0c;解耦了请求的发送者和接收者。责任链模式将多个处理器串联起来形成一条处理请求的链。 图解 角色 抽象处理者&#xff1a; 一个处理请求的接口&#xf…

TSP:人工原生动物优化器(APO)求解旅行商问题TSP(可以更改数据),MATLAB代码

一、旅行商问题介绍 二、人工原生动物优化算法求解TSP 2.1算法介绍 人工原生动物优化器&#xff08;Artificial Protozoa Optimizer &#xff0c;APO&#xff09;由Xiaopeng Wang等人于2024年提出&#xff0c;其灵感来自自然界中的原生动物。APO 模拟了原生动物的觅食、休眠和…

Spark-Shuffle阶段优化-Bypass机制详解

Spark概述 Spark-Shuffle阶段优化-Bypass机制详解 Spark的Bypass机制是一种特定情况下的优化策略&#xff0c;目的是减少Shuffle过程中不必要的排序开销&#xff0c;从而提升性能。当Shuffle分区数较少且数据量不大时&#xff0c;Bypass机制可以显著加快Shuffle速度。 1.什么…

统计套利—配对交易策略

配对交易是一种基于统计学的交易策略&#xff0c;通过两只股票的差价来获取收益&#xff0c;因而与很多策略不同&#xff0c;它是一种中性策略&#xff0c;理论上可以做到和大盘走势完全无关。 配对交易的基本原理是&#xff0c;两个相似公司的股票&#xff0c;其股价走势虽然在…

STM32CubeMX配置-外部中断配置

一、简介 MCU为STM32G070&#xff0c;配置为上升沿触发外部中断&#xff0c;在上升沿外部中断回调函数中进行相关操作。 二、外部中断配置 查看规格书中管教描述&#xff0c;找到I/O对应的外部中断线&#xff0c;然后进行如下上升沿触发外部中断配置。 三、生成代码 调用上升沿…

C语言:文件系统

一、目录和文件 在当前目录下使用touch 创建一个名为 -a的文件: touch -a ; // 错误&#xff0c; touch -- -a//正确 touch ./-a 正确 ls -n可以看到对象的用户id&#xff0c;可以在/etc/passwd中查看&#xff0c;/etc/group可以看到组号 获取文件属性 #include <sys/ty…

自动化测试xmind的常用技术

xmind思维导图的用法&#xff0c;我们在自动化测试中&#xff0c;写用例会用到思维导图工具xmind&#xff0c;下面总结xmind的一些常见用法。 在桌面上点击xmind图标&#xff0c;打开xmind 1、快捷按键 添加子主题:insert键 添加同级主题&#xff1a;回车键enter 删除&#…

爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?

AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件&#xff0c;用过的人都说好&#xff01; 先来看看我生成的图 制作过程非常简单&#xff0c;输入你想要生成的画面咒语。 工具地址&#xff1a;https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…

libharu维基页面

文章目录 安装Linux/UNIX:macOS:Windows (非 Cygwin/MSYS):使用 VCPKG 依赖管理器:注意&#xff1a; Cygwin/MSYS: 使用错误处理函数类型错误处理用户自定义错误处理函数使用用户自定义错误处理函数C语言中的错误处理C中的错误处理 其他编程语言错误代码列表总结 图像图形模式路…

【每天学会一个渗透测试工具】AWVS安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨AWVS介绍 是应用漏洞扫描工具 &#x1f4a6;使用docker安装 docker pull dockermi3aka/awvs启动镜像 docker run -dit …

元数据、数据元、数据字典、数据模型及元模型的区别详解

在数据管理和分析领域&#xff0c;有许多相似的概念&#xff0c;如元数据、数据元、数据字典、数据模型和元模型。这些概念的定义和应用往往容易混淆。 数据元 数据元是通过一系列属性描述的数据单元&#xff0c;包括定义、标识、表示以及允许值等。这些属性帮助我们理解和使用…

SinNerf理解和效果

文章目录 SinNerf 解决的问题方法和结构自己训练的效果 SinNerf 解决的问题 该方法主要解决的问题是&#xff1a; 现有都使用多张照片来进行nerf 表示的学习&#xff0c;这篇文章的话&#xff0c;主要是想使用一张单视角的照片来Nerf表示的学习。通过从单张照片中得到的伪标签…