共计 4284 个字符,预计需要花费 11 分钟才能阅读完成。
本文起源: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 的端口保持一致就能够了。