乐趣区

关于nginx:Nginx-Spring-Boot-实现负载均衡


本文起源:http://8rr.co/LSUH

前言

本篇文章次要介绍的是 Nginx 如何实现负载平衡。

负载平衡介绍

在介绍 Nginx 的负载平衡实现之前,先简略的说下负载平衡的分类,次要分为 硬件负载平衡和软件负载平衡,硬件负载平衡是应用专门的软件和硬件相结合的设施,设施商会提供残缺成熟的解决方案,比方 F5,在数据的稳定性以及安全性来说十分牢靠,然而相比软件而言造价会更加低廉;软件的负载平衡以 Nginx 这类软件为主,实现的一种音讯队列散发机制。

简略来说所谓的负载平衡就是把很多申请进行分流,将他们调配到不同的服务器去解决。比方我有 3 个服务器,别离为 A、B、C,而后应用 Nginx 进行负载平衡,应用轮询策略,此时如果收到了 9 个申请,那么会平均的将这 9 个申请分发给 A、B、Cf 服务器,每一个服务器解决 3 个申请,这样的话咱们能够利用多台机器集群的个性缩小单个服务器的压力。

Nginx 实现负载平衡的示例图:

负载平衡策略

NGINX 开源反对四种负载平衡办法,而 NGINX Plus 又减少了两种办法。

1.Round Robin: 对所有的申请进行轮询发送申请,默认的调配形式。

nginx.conf 配置示例:

upstream xuwujing {
   server www.panchengming.com;
   server www.panchengming2.com;
}

注: 下面的域名也能够用 IP 代替。

2.Least Connections:以起码的流动连接数将申请发送到服务器,同样要思考服务器权重。

nginx.conf 配置示例:

upstream xuwujing {
    least_conn;
    server www.panchengming.com;
    server www.panchengming2.com;
}

3.IP Hash : 发送申请的服务器由客户机 IP 地址决定。在这种状况下,应用 IPv4 地址的前三个字节或整个 IPv6 地址来计算散列值。该办法保障来自雷同地址的申请达到雷同的服务器,除非该服务器不可用。

upstream xuwujing {
     ip_hash;
     server www.panchengming.com;
     server www.panchengming2.com;
}

4.Generic Hash: 申请发送到的服务器由用户定义的键决定,该键能够是文本字符串、变量或组合。

upstream xuwujing {
     hash $request_uri consistent;
     server www.panchengming.com;
        server www.panchengming2.com;
 }

5.Least Time (NGINX Plus only) – 对于每个申请,NGINX Plus 抉择具备最低均匀提早和最低流动连接数的服务器,其中最低均匀提早是依据蕴含 least_time 指令的下列参数计算的:

  • header:从服务器接管第一个字节的工夫。
  • last_byte:从服务器接管残缺响应的工夫。
  • last_byte inflight:从服务器接管残缺响应的工夫。

    upstream xuwujing {least_time header; server www.panchengming.com; server www.panchengming2.com;}

6.Random:每个申请将被传递到随机抉择的服务器。如果指定了两个参数,首先,NGINX 依据服务器权重随机抉择两个服务器,而后应用指定的办法抉择其中一个。

  • least_conn:流动连贯的起码数量
  • least_time=header (NGINX Plus):从服务器接管响应标头的最短均匀工夫 ($upstream_header_time)。
  • least_time=last_byte (NGINX Plus):从服务器接管残缺响应的最短均匀工夫($upstream_response_time)。

    upstream xuwujing {
    random two least_time=last_byte;
    server www.panchengming.com;
    server www.panchengming2.com;
    }

Nginx+SpringBoot 实现负载平衡

环境筹备

  • 依赖 JDK1.8 以上的版本;
  • 依赖 Nginx 环境;

这里的我的项目就用自己之前的一个 springboot 我的项目,SpringBoot 的我的项目地址: https://github.com/xuwujing/s…

首先咱们下载这个我的项目,输出:mvn clean package 将我的项目进行打包为 jar 文件, 而后将 application.properties 和此 jar 我的项目放在一个文件夹中,而后复制该文件夹 (这里为了清晰所以进行复制,理论不复制更改端口重启也行),批改复制文件夹application.properties 的端口,比方改为 8086。

Nginx 配置

咱们找到 nginx 的配置文件 nginx.conf,该配置在 nginx/conf/nginx.conf 目录下,而后咱们来批改该配置,新增如下配置:

upstream pancm{
   server 127.0.0.1:8085;
   server 127.0.0.1:8086;
}
  • upstream pancm:定义一个名称,随便就行;
  • server + ip: 端口 or 域名;

如果不想应用 Round Robin 策略,也能够换成其余的。

而后在 server 增加 / 批改如下配置:

server {
        listen       80;
        server_name  127.0.0.1;
        location / {
            root   html;
            proxy_pass http://pancm;
            proxy_connect_timeout 3s;
            proxy_read_timeout 5s;
            proxy_send_timeout 3s;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {root   html;}
    }

配置阐明:

  • server: 虚拟主机的名称,一个 http 中能够配置多个 server;
  • listen:Nginx 默认的端口;
  • server_name:Nginx 服务的地址,能够应用域名,多个用空格分隔。
  • proxy_pass:代理门路,个别配置 upstream 前面的名称用于实现负载平衡,能够间接配置 ip 进行跳转;

nginx.conf 残缺的配置:

events {worker_connections  1024;}
error_log nginx-error.log info;
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
      upstream pancm{
       server 127.0.0.1:8085;
       server 127.0.0.1:8086;
    }
    
    server {
        listen       80;
        server_name  127.0.0.1;
        location / {
            root   html;
            proxy_pass http://pancm;
            proxy_connect_timeout 3s;
            proxy_read_timeout 5s;
            proxy_send_timeout 3s;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {root   html;}
    }
}

负载平衡测试

在实现 Nginx 配置之后,咱们启动 Nginx。linux输出 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,如果曾经启动能够应用/usr/local/nginx/sbin/nginx -s reload 命令进行热加载配置文件,Windows间接点击 Nginx 目录下的 nginx.exe 或者 cmd运行 start nginx 进行启动,如果启动了仍旧能够应用 nginx -s reload 进行热加载。

Nginx 启动实现之后,咱们顺次启动刚刚下载的 springboot 和复制更改端口的我的项目,输出:java -jar springboot-jsp-thymeleaf.jar启动。

都启动胜利之后,咱们在浏览器输出服务的 ip 即可进行拜访。

示例图:

注: 这里我应用的是 windows 零碎做测试,理论 linux 也是一样的。

而后咱们进行操作,并查看控制台日志!

从上述示例图中咱们进行 4 次界面刷新申请,最终平均分配到两个服务中去了,从上述的测试后果中咱们实现了负载平衡。

这里我在说一下应用 Nginx 的注意事项,在进行学习和测试的时候,应用 nginx 默认的端口实现负载平衡个别没有什么问题,然而当咱们在我的项目中应用的时候,特地有登录界面的并且端口不是 80 的时候,会呈现登录的界面无奈跳转,进行调试的话会呈现 net::ERR_NAME_NOT_RESOLVED这样的谬误,呈现这个起因的是因为 nginx 默认的端口是 80,那么默认跳转的也是这个,所以呈现这种状况的时候,须要在 location 下增加 proxy_set_header Host $host:port 这个配置,port 和 listen 的端口保持一致就能够了。

退出移动版