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

172 阅读6分钟

Nginx

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

正向代理和反向代理

正向代理

image.png

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

举例:游戏加速器

反向代理

image.png

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。
反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
反向代理服务器就类似于前台,客户发送请求,反向代理服务器找到合适的服务器。

Nginx支持的代理类型

  • 正向代理:代理客户端,代理缓存(缓存到本地)
  • 反向代理:代理服务端
    • 7层反向代理:基于http、 https、 mail等七层协议的反向代理

      • 使用场景:动静分离
      • 特点:功能强大,但转发性能较4层偏低
      • 配置:在http块里设置upstream后端服务器池;在server块里用location匹配动态页面路径,使用proxy_pass http://服务器池名 进行七层协议(http协议)转发
    • 4层反向代理:基于IP+ ( tcp或者udp)端口的代理

      • 使用场景:负载均衡器/负载调度器,做服务器集群的访问入口
      • 特点:只能根据IP+端口转发,但转发性能较好
./configure --with-stream
在http块同一层上面配置stream模块,在stream模块中的upstream模块定义服务器组名和服务器列表,
在stream模块中的server模块配置监听的IP:端口,主机名和proxy_pass 服务器组名

七层反向代理:
http {
    upstream backerserver {
        server IP1:PORT1 [ weight= fail= ...];
        server IP2: PORT2[ weight= fail= ...];
        ......
    }

    server {
        listen 80;
        server_name XXX;
        location ~ 正则表达式 {
            proxy_pass http://backerserver;
            ......
        }
    }
}

四层反向代理:
http {
    upstream backerserver {
        server IP1:PORT1 [ weight= fail= ...];
        server IP2: PORT2[ weight= fail= ...];
        ......
    }

    server {
        listen 80;
        server_name XXX;
        proxy_pass appserver;
    }
}

负载均衡和动静分离

Nginx反向代理实现负载均衡

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

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

Nginx 负载均衡调度模式(算法)

  • rr 负载均衡模式: 每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。
    (每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动刷除故障系统,使用户访问不受影响)

  • 加权轮询: 轮询基础上设置weight值,weight的值越大分配到的权限概率越高,主要用于后端每台服务器性能不均匀情况,或者仅仅为在主从的情况下设置不同的权重值,达到合理利用主机资源

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

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

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

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

Nginx动静分离实现原理

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

image.png

Nginx静态处理优势

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

补充

  • 吞吐量是指系统处理客户请求数量的总和,可以指网络上传输数据包的总和,也可以指业务中客户端与服务器交互数据量的总和。

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

以Nginx作为负载均衡器,Tomcat作为应用服务器
Nginx处理静态资源页面的请求
动静分离实现:nginx使用location去正则匹配用户的访问路径的前缀或者后缀去判断接收的请求是静态的还是动态的,静态资源请求在 nginx本地进行处理响应,动态页面请求通过反向代理转发给后端应用服务器

Nginx+Tomcat负载均衡、动静分离配置步骤

  1. 部署Nginx 负载均衡器

    • 准备工作,关闭防火墙,安装依赖包,创建nginx用户 image.png

    • 解压包,配置软件模块,编译安装 image.png image.png image.png

    • 优化配置文件路径 image.png

    • 添加 Nginx 系统服务 image.png image.png

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

    • 配置jdk

      • 解压jdk包到/usr/local/ image.png

      • 设置JDK环境变量,编辑/etc/profile image.png image.png

    • 安装启动tomcat image.png image.png

    • 两台tomcat应用服务器部署方式相同

  3. 动静分离配置

    • 建立动态页面 image.png

    • 修改配置文件/usr/local/tomcat/conf/server.xml image.png

    • 重启tomcat image.png

    • tomcat2同样配置方式

  4. Nginx server 配置

    • 准备静态页面和静态图片 image.png

    • 修改配置文件nginx.conf,修改完重启服务 image.png image.png image.png

  5. 浏览器访问

    • 访问静态资源 image.png image.png

    • 访问动态资源 image.png image.png