• Ngunx + Tomcat 负载均衡和动态分离


    目录

    一、tomcat简介

    二、Nginx 负载均衡

    1. Nginx 应用

    2. Nginx 负载均衡实现原理

    2.1 正向代理

    2.2 反向代理

    2.3 具体过程接收请求:Nginx作为反向代理服务器,接收客户端的请求。选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。转发请求:Nginx将接收到的请求转发给选定的后端服务器。返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。返回客户端:Nginx将接收到的响应返回给客户端。      

     2.4 负载均衡原理

    2.5 配置方向代理的主要参数

    2.6 Nginx 代理转发类型

    3. Nginx 负载均衡模式

    三、Nginx 动静分离

    1、nginx动静分离原理 

    2、静态处理优势

    3、吞吐量

    4、并发量

    四、案例


    一、tomcat简介

    在现代 Web 服务架构中,Tomcat 和 Nginx 是两个至关重要的组件,负责处理用户请求并实现高性能的服务。本篇博客将深入探讨这些技术的原理和部署配置方法。

    最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发。
    安装Tomcat后,安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件。

    二、Nginx 负载均衡

    1. Nginx 应用

      Nginx是一款非常优秀的HTTP服务器软件。Nginx支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。

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

    2. Nginx 负载均衡实现原理

    2.1 正向代理

    首先我们需要明确,我们作为用户是从客户端去访问服务端,因此从客户端-→服务端可以简单的认为是正向。换句话说正向代理时,我们往往明确的知道我们需要访问哪个服务端,比如我想访问google,但是由于某种原因,我无法直接访问它,因此我需要一个能访问呢google的代理服务器去帮我完成这个通信,通过一系列代理服务器的配置,当我输入google的网站时,代理服务器接收请求并转交给目标服务端即google,最终返回内容给我客户端。至此完成了一个简单的正向代理,通过上文我们可以发现,服务端仅仅只与代理服务器产生了通信,因此服务端并不知道该请求来自于哪个客户端,它知道是从代理服务器而来,因此正向代理的最大特点即:其屏蔽或者隐藏了真实客户端的信息,即保护了客户端。

    2.2 反向代理

    弄清了正向代理,其实反向代理也很清晰了,不就是一个逆向思维嘛,即保护了服务端。反向代理往往应用于分布式环境下,例如我们的淘宝,为了解决高流星带来的服务器压力,单台服务器往往不能够解决问题,此时则需要搭建一个集群环境,并且其也拥有一个反向代理服务器,当大量的客户端请求淘宝时,往往请求并不会直接到服务端,而是先到代理服务器,由代理服务器进行反向代理,采用负载均衡9策略将请求分法给各台服务器,保证资源的充分利用。这就是反向代理最大的用处,我们是否也能发现,从某种意义上来说,反向代理屏蔽或者隐藏了服务器的信息,相对于单一服务端,采用了反向代理之后我们只知道访问了淘宝,却不知道访问了其具体的哪台服务器

    2.3 具体过程
    接收请求:Nginx作为反向代理服务器,接收客户端的请求。
    选择后端服务器:根据预先配置的负载均衡算法,Nginx选择一个后端服务器来处理请求。
    转发请求:Nginx将接收到的请求转发给选定的后端服务器。
    返回响应:后端服务器处理请求并生成响应,将响应发送回Nginx。
    返回客户端:Nginx将接收到的响应返回给客户端。      

    当使用Nginx服务器作为前端时,可以配置Nginx来进行静态页面的处理,而将动态页面请求转发给后端的Tomcat服务器来处理。由于Tomcat是轻量级应用服务器,可能无法满足所有访问量,因此需要多台Tomcat服务器,并通过Nginx的配置权重来进行负载均衡,以确保请求能够被分发到不同的Tomcat服务器上

     2.4 负载均衡原理

    客户端向反向代理发送请求,接着反向代理根据某种负载机制请求至目标服务器(这些服务器都运行着相同的应用),并把获取的内容返回给客户端,其中代理请求可能根据配置被发往不同的服务器。

    2.5 配置方向代理的主要参数

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

    upstream 服务池名{}
    

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

    proxy_pass http://服务池名
    
    2.6 Nginx 代理转发类型

    4层代理

      使用NAT (Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给nginx,nginx数据包再做一次类似的修改,就返回给请求的客户端了。

    四层代码配置:
     

    1. stream {
    2. upstream appserver {
    3. server 192.168.80.100:8080 weight=1;
    4. server 192.168.80.101:8080 weight=1;
    5. server 192.168.80.101:8081 weight=1;
    6. }
    7. server {
    8. listen 8080;
    9. proxy_pass appserver;
    10. }
    11. }
    12. http {
    13. ......

    7层代理

       nginx读取并解析Http请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

    七层代码配置

    3. Nginx 负载均衡模式

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

    3.2 least_conn 最少连接(自带的)
    优先将客户端请求调度到当前连接最少的服务器。

    3.3 weight 加权轮询(自带的)
    weight代表权重的意思,用于指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例。

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

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

    3.6 fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    三、Nginx 动静分离

    1、nginx动静分离原理

    客户端发送请求想要访问服务器端,首先会经过一个代理服务器(即包含Nginx服务的服务器),如果发送的请求中既有静态资源也有动态资源,其中的静态资源会有Nginx提供服务进行返回响应给客户端,动态资源则会由Nginx转发给后端(即包含Tomcat服务的服务器),然后由后端在进行返回响应给代理服务器,再由代理服务器返回响应给客户端。其本质就是是location规则的匹配

    2、静态处理优势

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

    3、吞吐量

     吞吐量可以理解成带宽流量,以每个请求0.5KB大小,并发每秒25万,0.5/1024MB*250000=122MB*8bit=977Mbps。

    4、并发量

     以10分钟有5000万用户平均每人访问2次为例,并发量为每秒(5000w*2)/(60*10)=16.7万,再double下,就说每秒25万并发量

    四、案例

    1、搭建七层代理准备三台服务器Nginx作为负载均衡器,Tomcat作为应用服务器

    nginx:20.0.0.100:80

    tomcat1:20.0.0.101:80

    tomcat2:20.0.0.102:8080          20.0.0.200:8081

    初始化三台机器

    1. ###关闭firewalld
    2. [root@localhost ~]# systemctl stop firewalld.service
    3. ###关闭防火墙开机自启
    4. [root@localhost ~]# systemctl disable firewalld.service
    5. Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    6. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    7. 关闭selinux
    8. [root@localhost ~]# setenforce 0

    部署nginx  编译安装

    1. [root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
    2. [root@localhost ~]# useradd -M -s /sbin/nologin nginx
    3. [root@localhost ~]# cd /opt/
    4. [root@localhost opt]# ls
    5. nginx-1.24.0.tar.gz rh
    6. [root@localhost opt]# tar xf nginx-1.24.0.tar.gz
    7. [root@localhost opt]# ls
    8. nginx-1.24.0 nginx-1.24.0.tar.gz rh
    9. [root@localhost opt]# cd nginx-1.24.0/
    10. [root@localhost nginx-1.24.0]# ./configure \
    11. --prefix=/usr/local/nginx \
    12. --user=nginx \
    13. --group=nginx \
    14. --with-file-aio \ #启用文件修改支持
    15. --with-http_stub_status_module \ #启用状态统计
    16. --with-http_gzip_static_module \ #启用 gzip静态压缩
    17. --with-http_flv_module \ #启用 flv模块,提供对 flv 视频的伪流支持
    18. --with-http_ssl_module #启用 SSL模块,提供SSL加密功能
    19. --with-stream #启用 stream模块,提供4层调度
    20. ###编译安装
    21. [root@localhost nginx-1.24.0]# make -j2 && make install
    22. ./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-stream

    添加nginx服务

    1. ###把nginx服务的可执行程序文件放入路径环境变量的目录中便于系统识别
    2. [root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    3. ###修改nginx服务的配置文件
    4. [root@localhost nginx-1.24.0]# vim /lib/systemd/system/nginx.service
    5. [Unit] #服务的说明
    6. Description=nginx #描述服务
    7. After=network.target #依赖,当依赖的服务启动之后再启动自定义的服务
    8. [Service] #服务运行参数的设置
    9. Type=forking #是后台运行的形式,使用此启动类型应同时指定
    10. PIDFile=/usr/local/nginx/logs/nginx.pid #PID文件位置以便systemd能够跟踪服务的主进程
    11. ExecStart=/usr/local/nginx/sbin/nginx #服务的具体运行命令
    12. ExecReload=/bin/kill -s HUP $MAINPID #重启命令
    13. ExecStop=/bin/kill -s QUIT $MAINPID #停止命令
    14. PrivateTmp=true #给服务分配独立的临时空间
    15. [Install] #服务安装的相关设置
    16. WantedBy=multi-user.target #可设置为多用户
    17. ###给予文件权限
    18. [root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
    19. ###启动nginx服务
    20. [root@localhost ~]# systemctl start nginx.service
    21. ###开机自启nginx服务
    22. [root@localhost ~]# systemctl enable nginx.service
    23. Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

    测试访问ip地址

    tomcat1部署

    安装jdk

    1. [root@localhost opt]# cd /opt
    2. ###查询指定软件包的文件列表
    3. [root@localhost opt]# rpm -qpl jdk-8u201-linux-x64.rpm
    4. ###安装jdk
    5. [root@localhost opt]# rpm -ivh jdk-8u201-linux-x64.rpm
    6. ###查看jdk版本号
    7. [root@localhost opt]# java -version
    8. openjdk version "1.8.0_262"
    9. OpenJDK Runtime Environment (build 1.8.0_262-b10)
    10. OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

    然后配置jdk环境变量

    vim /etc/profile

    保存退出 然后 source /etc/profile

    然后到根目录下 创建一个 XXX.java文件  我这里创建的是Hello.java文件

    配置内容如图

    保存退出

    此时 jdk环境变量配置好了

    安装tomcat

    此时 到浏览器访问本地路径

     出现tomcat服务  就是安装启动好了

    部署第二台tomcat  操作一样 但是端口号不能一样

    1. [root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
    2. ###22行,修改Server prot,默认为8005 -> 修改为8006
    3. <Server port="8006" shutdown="SHUTDOWN">
    4. ###69行,修改Connector port,HTTP/1.1 默认为8080 -> 修改为8081
    5. <Connector port="8081" protocol="HTTP/1.1"
    6. ###116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
    7. <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
  • 相关阅读:
    脚手架(vue-cli)创建Vue项目看这篇就够了
    安卓讲课笔记1.2 测试开发环境
    HDU 3549 Flow Problem (最大流ISAP)
    【PHPWord】PHPWord之动态生成表格、单元格合并、文字居中
    把握时机加入 Road to GDE 指导计划
    山西电力市场日前价格预测【2023-11-07】
    设计模式之状态模式
    准备前工作
    合并二叉树(力扣617)
    Three.js--》实现3d字体模型展示
  • 原文地址:https://blog.csdn.net/w1251427056/article/details/139469939