利用Nginx中的Upstream模块配置服务器负载均衡
1. 前言
nginx
有一个最大的功能就是可以实现服务器的负载均衡,本篇博文就利用nginx
中的upstream
模块来配置一个简单的负载均衡。关于nginx
的安装和配置文件可以查阅博文:windows下安装nginx和基本配置,这里不再赘述。
2. 什么是负载均衡
所谓负载均衡,就是nginx
可以配置代理多台服务器主机,当前端页面的请求到来时,nginx
可以在多台服务器主机中选择一个当前负载压力较小的服务器,然后将该访问请求转发给被选择的服务器,这样就保证了当用户访问前端页面时,后端服务器集群中的每个服务器负载压力趋于平衡,分担了服务器压力,不至于累得累死,闲的闲死。
那么要实现负载均衡,就少不了nginx
中的负载均衡模块upstream
,负载均衡模块用于从nginx
配置文件中的upstream
指令定义的后端主机列表中选取一台主机。nginx
先使用负载均衡模块找到一台主机,再使用upstream
模块实现与这台主机的交互。
说了这么多,不如直接看代码!
3. 具体配置
3.1 基本配置
首先在
nginx.conf
配置文件中的http
节点内增加upstream
节点,如下:http {
# ...
upstream demo {
server 127.0.0.1:9000;
server 127.0.0.1:9002;
}
# ...
}
上面的代码表示:我们选取了两个服务器主机,分别是
127.0.0.1:9000
和127.0.0.1:9002
,这两个主机就是我们准备用来接收前端请求的负载机,当然你有多个负载机都可以写入里面。然后我们在
server
节点中配置反向代理,让前端的请求能够代理到上面配置的负载机上,如下:server {
# ...
location / {
root html;
index index.html index.htm;
proxy_pass http://demo;
}
# ...
}
注意:这里的
proxy_pass
配置应为http://
+upstream
名称。
OK,负载均衡的基本配置就已经配置好了,接下来我们写一个demo
来看看效果。
3.2 基本配置demo
首先,我们用node.js
分别起了两个后端服务,代码如下:
// 127.0.0.1:9000
const express = require("express");
const app = express();
const router = express.Router();
router.get("/", function(req, res) {
res.json({
msg: `这是来自9000端口的响应`
});
});
app.use(router);
const port = process.env.PORT || 9000;
module.exports = app.listen(port, () => {
console.log(`Server listening on http://localhost:${port}, Ctrl+C to stop`);
});
// 127.0.0.1:9002
const express = require("express");
const app = express();
const router = express.Router();
router.get("/", function(req, res) {
res.json({
msg: `这是来自9002端口的响应`
});
});
app.use(router);
const port = process.env.PORT || 9002;
module.exports = app.listen(port, () => {
console.log(`Server listening on http://localhost:${port}, Ctrl+C to stop`);
});
分别在命令行中将这两个后端服务都起起来,然后按照上面基本配置方法配置好nginx
,切记,修改过nginx
配置文件后一定要nginx -s reload
重启nginx
哦。好了,我们打开浏览器看下效果:
上图中我们可以看到:当我们每刷新一次浏览器,就相当于发了一次访问请求,nginx
将请求分别转发给了配置的两个负载机,从而页面上交替显示来自两个负载机的响应。
这就达到了两个负载机负载均衡的效果。
3.3 详细配置——ip_hash权重
上面的配置虽然基本实现了负载均衡,但是存在一个问题,就是我们的应用程序往往都会做用户的身份鉴别,即session
会话控制,上面的配置方法不能保证把这次请求和下一次请求发送到同一台机器上,所以我们需要让每个请求第一次访问哪个服务器后就记录,之后再访问都是该服务器,这就需要使用到ip_hash
了,配置如下:
upstream demo {
ip_hash;
server 127.0.0.1:9000;
server 127.0.0.1:9002;
}
当配置了ip_hash
后,每个请求按访问ip
的hash
结果分配,这样每个访客固定访问一个后端服务器,可以解决session
的问题。
demo
如下:
我们可以看到,当配置了ip_hash
后,响应的负载机就被固定下来了。
3.4 详细配置——weight权重
基本配置中每个负载机都是轮询响应的,但是在实际中,每个负载机的性能有高有低,我们更希望性能高的设备多承担一些负载,性能低的少承担一些,这就需要给负载机配置权重weight
了,weight
和访问比率成正比,weight
值越高,被访问到的频率越高。配置如下:
upstream demo {
ip_hash;
server 127.0.0.1:9000 weight=10;
server 127.0.0.1:9002 weight=80;
}
demo
如下:
我们可以看到,当配置了权重weight
后,本该按照轮询顺序响应的9000
负载机由于权重比9002
低,所以响应被9002
代理了。
3.5 详细配置——fair
与weight
分配策略相似。weight
是按照负载机权重不同从而分配请求,而fair
则是以负载机响应时间来分配请求,响应时间短的优先分配。配置如下:
upstream demo {
server 127.0.0.1:9000;
server 127.0.0.1:9002;
fair;
}
为了测试这一功能,我们将基本配置里的写好的后端服务做一下修改,我们给两个后端响应加个定时器,让9002
服务器1秒后响应,让9000
服务器3秒后响应,代码如下:
// 127.0.0.1:9000
setTimeout(()=>{
res.json({
msg: `这是来自9000端口的响应`
});
},3000)
// 127.0.0.1:9002
setTimeout(()=>{
res.json({
msg: `这是来自9002端口的响应`
});
},1000)
demo
如下:
我们可以看到,当配置了fair
后,本该按照轮询顺序响应的9000
负载机由于响应时间比9002
长,所以响应被9002
代理了。
3.6 详细配置——url_hash
url_hash
按访问url
的hash
结果来分配请求,使每个url
定向到同一个后端服务器,后端服务器为缓存时比较有效。例如,在实际中有时候只有一台服务器上存储了用户的登录信息,因此我们需要把用户登录的所有请求都转发给这一台服务器。配置如下:
upstream demo {
server 127.0.0.1:9000;
server 127.0.0.1:9002;
hash $request_uri; # $request_url为nginx变量 表示请求url
hash_method crc32;
}
3.7 详细配置——down
当给某一负载机配置了down
属性后,表示该负载机不参与负载,配置如下:
upstream demo {
server 127.0.0.1:9000 down;
server 127.0.0.1:9002;
}
3.8 详细配置——backup
backup
表示备用的意思,当其他全部非backup
负载机down
或者忙的时候,此时backup
负载机 就会接受负载,配置如下:
upstream demo {
server 127.0.0.1:9000 down;
server 127.0.0.1:9002;
server 127.0.0.1:9003 backup;
}
4. 总结
以上就是nginx
中的负载均衡模块upstream
的一些配置,下面给出一个基本负载均衡配置:
upstream demo{
ip_hash;
server 127.0.0.1:9000 down;
server 127.0.0.1:9001 weight=2;
server 127.0.0.1:9002;
server 127.0.0.1:9009 backup;
}
(完)
利用Nginx中的Upstream模块配置服务器负载均衡的更多相关文章
- Nginx 部署、反向代理配置、负载均衡
Nginx 部署.反向代理配置.负载均衡 最近我们的angular项目部署,我们采用的的是Nginx,下面对Nginx做一个简单的介绍. 为什么选择Nginx 轻:相比于Apache,同样的web服务 ...
- linux下nginx【反向代理】配置【负载均衡】配置
nginx 可以配置多个端口: 1.10088端口 配置反向代理,消除跨域问题. 2.10087端口 配置ip_hash模式的负载均衡,ip_hash可以绕开解决session共享的问题. nginx ...
- nginx配置服务器负载均衡
upstream servers { ip_hash; #hash,ip轮训 server localhost:8400; } server { listen 80; server_name loca ...
- 高性能Nginx服务器-负载均衡
Location正则表达式 location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作. locatio ...
- nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍
转自:http://blog.csdn.net/happydream_c/article/details/54943802 一.nginx简介 Nginx (发音为[engine x])专为性能优化而 ...
- Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...
- [转]CENTOS 6.5 配置YUM安装NGINX+服务器负载均衡
原文连接: CENTOS 6.5 配置YUM安装NGINX http://blog.sina.com.cn/s/blog_69f467b70102uyux.html 参考博文: Centos下安装. ...
- 善于利用python中的os模块
作为一个程序猿,平时善于利用python中的os模块进行路径等操作,会省去很多麻烦,下面总结一下我平时经常用到的方法: import os os.getcwd() # 获取当前文件所在的目录 os.p ...
- Nginx配置及负载均衡
转载:http://www.cnblogs.com/jingmoxukong/p/5945200.html nginx简易教程 目录 Nginx 概述 安装与使用 nginx 配置实战 参 ...
随机推荐
- Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用
多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程. 一.ThreadPoolTaskExecutor ...
- MIPI CSI2-TX接口基于FPGA实现
MIPI CSI2-TX用途: 跟海思的3559A芯片进行图像数据传输: MIPI CSI2-TX接口特性: xilinx 7系列芯片最大支持1.25Gbps: 最大支持lanes数量为4: 支持的图 ...
- 详述Python序列化
一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样.很多时候我们会有这样的需求: 把内存中的各种数据类型的 ...
- HashMap底层数据结构详解
一.HashMap底层数据结构 JDK1.7及之前:数组+链表 JDK1.8:数组+链表+红黑树 关于HashMap基本的大家都知道,但是为什么数组的长度必须是2的指数次幂,为什么HashMap的加载 ...
- C语言--最大公约数
//辗转相除法 int main() { int a,b; int t; scanf("%d %d", &a,&b); ) { t = a%b; a = b; b ...
- 流水线机制、滑动窗口协议、GBN、SR
一.滑动窗口协议 为了解决停等操作的性能问题(发了一个分组之后一直等到确认了这个分组才发下一个),推出了流水线机制,提供资源利用率.就是允许发送方在收到对方的ACK前,发送多个分组 其中窗口是一个范围 ...
- [LUOGU3413] SAC#1 - 萌数
题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数 ...
- Cocos2d-x 学习笔记(11.5) SkewTo SkewBy
1. SkewTo SkewBy node朝X和Y方向的歪斜.SkewTo是SkewBy的父类. 1.1 成员变量 create方法 // 两者成员变量一致 float _skewX; float _ ...
- 《全栈性能测试修炼宝典JMeter实战》学习记录
说明:原书中jmeter版本为2.x,我的笔记中截图为5.x
- 3. Rsync-远程同步(下)-企业案例
已知3台服务器主机名分别为web01.backup .nfs主机信息见下表: 角色 外网IP(NAT) 内网IP(LAN) 主机名 WEB eth0:10.0.0.7 eth1:172.16.1.7 ...