Nginx负载均衡以及动静分离的原理与配置

2021-06-24

目录
  • 一、Nginx实现负载均衡原理
  • 二、Nginx动静分离原理
    • Nginx 静态处理优势
  • 三、Nginx + Tomcat 动静分离、负载均衡配置步骤
    • 环境准备:
    • 动静分离配置
  • Nginx 负载均衡模式
    • 总结

      一、Nginx实现负载均衡原理

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

      Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。

      但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。

      Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略

      Nginx服务器

      1、首页使用精准匹配

      2、静态页面使用正则匹配自己处理

      3、动态页面使用正则匹配jsp结尾的请求,使用proxy_pass转发给Tomcat服务器

      二、Nginx动静分离原理

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

      Nginx 静态处理优势

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

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

      环境准备:

      Nginx 服务器:192.168.121.13

      Tomcat 服务器1:192.168.121.12:8080 192.168.121.12:8081

      Tomcat 服务器2:192.168.121.10

      1、部署 Nginx 负载均衡服务器

      首先将 nginx-1.12.0.tar.gz 压缩包上传到 /opt 目录下
      
      systemctl stop firewalld.service 
      systemctl disable firewalld.service 
      setenforce 0
      
      yum install -y pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
      
      useradd -M -s /sbin/nologin 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 \
      --with-http_flv_module \
      --with-http_ssl_module
      
      make && 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
      ExecReload=/bin/kill -s HUP $MAINPID
      ExecStop=/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 应用服务器

      所需安装包为:
      apache-tomcat-9.0.16.tar.gz  
      jdk-8u201-linux-x64.rpm 
      #scp apache-tomcat-9.0.16.tar.gz root@192.168.121.10:/opt    #将所需的压缩包在Tomcat1上传给Tomcat2 server,当然我们也可以自己直接将压缩包拉到/opt目录下
      
      
      systemctl stop firewalld.service 
      systemctl disable firewalld.service 
      setenforce 0
      
      rpm -qpl jdk-8u201-linux-x64.rpm
      rpm -ivh jdk-8u201-linux-x64.rpm 
      java -version
      
      vim /etc/profile.d/java.sh
      export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
      export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
      export PATH=$JAVA_HOME/bin:$PATH
      
      source /etc/profile.d/java.sh
      java -version
      
      cd /opt
      vim abc.java
      public class abc {
        public static void main(String[] args){
          System.out.println("Hello World!")
        }
      }
      
      [root@localhost?opt]#javac abc.java      #用来检测JDK环境是否设置成功
      [root@localhost?opt]#java abc
      Hello World!
      
      cd /opt
      tar zxvf apache-tomcat-9.0.16.tar.gz
      mv apache-tomcat-9.0.16 /usr/local/tomcat
      
      ##启动tomcat##
      /usr/local/tomcat/bin/startup.sh
      netstat -natp | grep  8080
      

      动静分离配置

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

      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(第三方)负载均衡模式:

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

      总结

      到此这篇关于Nginx负载均衡以及动静分离的原理与配置的文章就介绍到这了,更多相关Nginx负载均衡及动静分离内容请搜索北冥有鱼以前的文章或继续浏览下面的相关文章希望大家以后多多支持北冥有鱼!

      《Nginx负载均衡以及动静分离的原理与配置.doc》

      下载本文的Word格式文档,以方便收藏与打印。