• 43Nginx+Tomcat负载均衡与动静分离


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

    以Nginx作为负载均衡器,Tomcat作为应用服务器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udNufQRz-1659253747900)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220727174515173.png)]

    Nginx负载均衡

    Nginx应用

    Nginx是一款非常优秀的HTTP服务器软件,支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低,目前很多大型网站都应用Ngix服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6MzjoFe-1659253747901)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220728093738824.png)]

    Nginx负载均衡实现原理
    Nginx配置反向代理的主要参数
    upstream服务池名{}
    配置后端服务器池,以提供响应数据
    proxy._pass http://服务池名
    配置将访问请求转发给后端服务器池的服务器处理

    Nginx动静分离实现原理

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

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

    动静分离原理

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0m2d9Yut-1659253747902)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220728095712054.png)]

    Nginx静态处理优势

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

    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。

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

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

    服务部署

    ngnix:192.168.247.159
    tomcat1:192.168.247.158
    tomcat2: 192.168.247.157

    Nginx负载均衡器部署

    1. #关闭防火墙
    systemctl stop firewalld
    setenforce 0
    2. #安装依赖关系包
    yum -y install pcre-devel zlib-devel gcc gcc-c++ make
    3. #新建用户和组便于管理
    useradd -M -s /sbin/nologin nginx
    4. #切换至opt目录,将下载好的压缩包传进来解压
    cd /opt
    tar -zxf nginx-1.12.0.tar.gz 
    4. #切换至解压后的目录下编译
    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层调度
    5. #安装
    make && make install -j4
    6. #做软连接,让系统识别nginx的操作命令
    ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    7. #将nginx命令加入服务
    cd /lib/systemd/system
    vim nginx.service
    #!/bin.bash
    [Unit]
    Description=nginx
    After=network.target
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/bin/kill -s HUP $MAINPID
    ExecStop=/usr/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target
    chmod 754 /lib/systemd/system/nginx.service
    8. #重新加载单元.启动服务
    systemctl start nginx.service
    systemctl enable nginx.service
    9. #查看是否成功启动
    ss -ntap|grep nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    Tomcat部署

    部署第一台Tomcat应用服务器

    1. #关闭防火墙
    systemctl stop firewalld
    setenforce 0
    2. #切换至/opt,将安装 Tomcat 所需软件包传到/opt目录下
    apache-tomcat-9.0.16.tar.gz 
    jdk-8u201-linux-x64.rpm
    3. #安装JDK
    tar -zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
    4. #修改换将变量配置文件
    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:$PATH
    5. #刷新配置文件
    source /etc/profile
    6. #切换至/opt下,解压tomcat包
    cd /opt
    tar -zxf apache-tomcat-9.0.16.tar.gz 
    mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
    7. #重新加载服务,并开启,查看是否成功启动
    /usr/local/tomcat/bin/shutdown.sh 
    /usr/local/tomcat/bin/startup.sh
    ss -ntap |grep 8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    Tomcat多实例部署

    1.安装好 jdk
    2.安装 tomcat
    cd /opt
    tar zxvf apache-tomcat-9.0.16.tar.gz
    mkdir /usr/local/tomcat
    mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
    cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
    3.配置 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
    4.修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
    vim /usr/local/tomcat/tomcat2/conf/server.xml
    		#22行,修改Server prot,默认为8005 -> 修改为8006
     修改为8081
    	#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
    第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
    第二个连接器默认监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
    5.修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
    vim /usr/local/tomcat/tomcat1/bin/startup.sh 
    ##添加以下内容
    export CATALINA_BASE=$CATALINA_BASE1
    export CATALINA_HOME=$CATALINA_HOME1
    export TOMCAT_HOME=$TOMCAT_HOME1
    vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
    export CATALINA_BASE=$CATALINA_BASE1
    export CATALINA_HOME=$CATALINA_HOME1
    export TOMCAT_HOME=$TOMCAT_HOME1
    vim /usr/local/tomcat/tomcat2/bin/startup.sh 
    export CATALINA_BASE=$CATALINA_BASE2
    export CATALINA_HOME=$CATALINA_HOME2
    export TOMCAT_HOME=$TOMCAT_HOME2
    vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
    export CATALINA_BASE=$CATALINA_BASE2
    export CATALINA_HOME=$CATALINA_HOME2
    export TOMCAT_HOME=$TOMCAT_HOME2
    6.启动各 tomcat 中的 /bin/startup.sh 
    /usr/local/tomcat/tomcat1/bin/startup.sh 
    /usr/local/tomcat/tomcat2/bin/startup.sh 
    netstat -natp | grep java
    7.浏览器访问测试
    http://192.168.247.157:8080
    http://192.168.247.157:8081
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    动静分离配置

    1.192.168.247.157配置
    Tomcat1 server 配置

    mkdir /usr/local/tomcat/tomcat1/webapps/test
    vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    
    JSP test1 page   #指定为 test1 页面
    
    
    <% out.println("动态页面1,http://www.test1.com");%>
    
    
    vim /usr/local/tomcat/tomcat1/conf/server.xml
    #由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
    
    
    
    
    /usr/local/tomcat/tomcat1/bin/shutdown.sh 
    /usr/local/tomcat/tomcat1/bin/startup.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Tomcat2 server 配置192.168.247.157

    mkdir /usr/local/tomcat/tomcat2/webapps/test 
    vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    
    JSP test2 page   #指定为 test2 页面
    
    
    <% out.println("动态页面 2,http://www.test2.com");%>
    
    
    vim /usr/local/tomcat/tomcat2/conf/server.xml
    #删除前面的 HOST 配置
    
    
    
    /usr/local/tomcat/tomcat2/bin/shutdown.sh 
    /usr/local/tomcat/tomcat2/bin/startup.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.192.168.247.158配置
    Tomcat server 配置

    mkdir /usr/local/tomcat/webapps/test  #创建测试项目目录
    vim /usr/local/tomcat/webapps/test/index.jsp #编写动态页面文件
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    
    JSP test2 page   
    
    
    <% out.println("此为动态测试页面3 192.168.247.158");%>
    
    
    vim /usr/local/tomcat/conf/server.xml
    #删除原来的站点,添加此站点
    
                    
          
    /usr/local/tomcat/bin/shutdown.sh 
    /usr/local/tomcat/bin/startup.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.192.168.247.159配置
    Nginx server 配置

    #配置动态页面
    vim /usr/local/nginx/conf/nginx.conf
    ......
    http {
    ......
    	#gzip on;
    	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
    upstream tomcat_server {
    	server 192.168.247.158:8080 weight=1;
    	server 192.168.247.157:8080 weight=1;
    	server 192.168.247.157:8081 weight=1;
    }
    server {
    	listen 80;
    	server_name www.syw.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;
    proxy_set_header X-Real-IP $remote_addr;	#把$remote_addr赋值给X-Real-IP,来获取源IP
    #在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 -t 
    systemctl restart nginx
    #准备静态页面和静态图片
    echo '

    这是静态页面

    ' > /usr/local/nginx/html/index.html mkdir /usr/local/nginx/html/img cp /root/game.jpg /usr/local/nginx/html/img
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    测试效果

    测试负载均衡效果,不断刷新浏览器测试
    浏览器访问 www .syw.com/index.jsp

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EtbjYJPw-1659253747902)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220731154214927.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0obrZSX-1659253747903)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220731154219296.png)]
    ginx
    #准备静态页面和静态图片
    echo ‘

    这是静态页面

    ’ > /usr/local/nginx/html/index.html
    mkdir /usr/local/nginx/html/img
    cp /root/game.jpg /usr/local/nginx/html/img

    
    ##  测试效果
    
    测试负载均衡效果,不断刷新浏览器测试
    浏览器访问 www .syw.com/index.jsp
    
    [外链图片转存中...(img-EtbjYJPw-1659253747902)]
    [外链图片转存中...(img-I0obrZSX-1659253747903)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t4uLcovN-1659253747903)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220731154224144.png)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    mybatis-plus的批量新增
    MongoDB数据库
    【Java系列】ArrayList
    单个人工神经元模型示意图,人体神经元模型制作
    GLAMD: Global and Local Attention Mask Distillation for Object Detectors
    用于不同功率的模块式TEC半导体致冷器超高精度温度控制装置
    Leetcode 284. Peeking Iterator (Iterator设计题)
    《动手学深度学习 Pytorch版》 4.4 模型选择、欠拟合和过拟合
    [极客大挑战 2019]BuyFlag
    Unity UGUI的Mask(遮罩)组件的介绍及使用
  • 原文地址:https://blog.csdn.net/qq_49124206/article/details/126086476