Nginx+SpringBoot实现负载均衡
前言
在上一篇中介绍了Nginx的安装,本篇文章主要介绍的是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/springBoot-study/tree/master/springboot-thymeleaf
首先我们下载这个项目,输入: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 的端口保持一致就可以了。
其他
参考
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
http://nginx.org/en/
相关文章
Nginx Linux和Windows安装教程:https://www.cnblogs.com/xuwujing/p/11899890.html
SpringBoot+SpringCloud实现负载均衡: https://www.cnblogs.com/xuwujing/p/10273989.html
音乐推荐
原创不易,如果感觉不错,希望点赞或推荐!您的支持是我写作的最大动力!
版权声明:
作者:虚无境
博客园出处:http://www.cnblogs.com/xuwujing
CSDN出处:http://blog.csdn.net/qazwsxpcm
掘金出处:https://juejin.im/user/5ae45d5bf265da0b8a6761e4
个人博客出处:http://www.panchengming.com
Nginx+SpringBoot实现负载均衡的更多相关文章
- Nginx+SpringBoot搭建负载均衡
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- nginx安装及负载均衡配置
Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二 ...
- Nginx 简单的负载均衡配置示例(转载)
原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...
- 观nginx与lvs负载均衡的较量
在技术工作者中,常用到的就是lvs负载均衡和Nginx负载均衡了.这两者也是比较普及的.那么,根据不同的需求,两者存在着不同的优势.具体选择哪一个,还要看您的要求了.那么我们在此为大家分享一篇文章,对 ...
- 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器
Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...
- Nginx+Tomcat+Memcached负载均衡集群服务搭建
操作系统:CentOS6.5 本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat负责实际服务,Memc ...
- 基于nginx的tomcat负载均衡和集群
要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务器即可共享SESSION了. 你可以自己写tomcat的扩展来保存SESSI ...
- nginx+tomcat+redis负载均衡及session共享
概述 本文档是用来详细描述 nginx+tomcat+redis负载均衡实现session共享 所需软件及下载地址 软件名称 下载地址 功能说明 Nginx-v1.6.0 http://nginx.o ...
- Nginx 简单的负载均衡配置示例
http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html 在此记录下Nginx服务器nginx.conf的配置文件说明, ...
随机推荐
- 现在Java 桌面应用程序能做到什么程度(Spring Boot+JavaFX2开发)
Spring Boot - JavaFX 2.0应用 很多人对Java开发native程序第一反应还停留在暗灰色单一风格的Java GUI界面,开发方式还停留在AWT或者Swing.本文主要基于Spr ...
- MAC idea&eclipse快捷键--笔记
idea: 1. command+d 删除行 2. command+o 重写父类方法 3. option+command+v 自动补全变量 4. 将普通java项目变成maven项目 在项目名称上点 ...
- 设计模式(二)Adapter模式
Adapter模式也被成为Wrapper模式.适配器模式用于填补“现有的程序”和“所需的程序”之间差异的设计模式. Adapter模式有两种,即使用继承的适配器和使用委托的适配器. 1.使用继承的适配 ...
- Java内存模型(JMM)详解
在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...
- JavaFX简介和Scene Builder工具的安装使用简易教程
JavaFX概述和简介 富互联网应用是那些提供与Web应用程序类似的功能,并可作为桌面应用程序体验的应用.与用户的正常网络应用程序相比,它们提供更好的视觉体验.这些应用程序可作为浏览器插件或作为虚拟机 ...
- <script>属性async和defer的区别
async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部脚本文件有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只 ...
- 大数据之路day02_2--if switch while for
在这一节,学习程序流程控制,具体包括判断结构.选择结构.循环结构. 1.判断结构(if.if-else) 三元运算符和if-else的区别 三元运算符,是一个运算符,所以运行必须有结果 而if-els ...
- Android常见内存泄露
前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...
- windsServer2008设置定时重启
点击“开始”——“管理工具”——“任务计划程序”. 右键“任务计划程序库”——“创建任务”. 输入计划名称.描述和安全选项(如下图). 点击触发器,点击“新建…”,输入计划周期和时间(如下图):无误后 ...
- 淘宝小练习#css
* { margin: 0; padding: 0; } a { text-decoration: none; } .box { background: #f4f4f4; } /* 头部样式STAR ...