利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞

2018年08月02日 10:06:03 Minza 阅读数 483
https://blog.csdn.net/ha_weii/article/details/81350087

学习一下如何使用sticky 
 
 版权声明:创作不易,转载请注明出处 https://blog.csdn.net/ha_weii/article/details/81350087

一,普通的负载均衡

1,启动nginx服务器

之前已经把/usr/local/nginx/sbin/nginx链接到/sbin下,所以直接使用nginx命令打开

2,修改主配置文件/usr/local/nginx/conf/nginx.conf

user  nginx nginx; #原来的nobody设置为nginx和nginx组

# 需要创建用户

[root@server4 conf]# useradd -M -d /usr/local/nginx/ nginx

[root@server4 conf]# id nginx

uid=500(nginx) gid=500(nginx) groups=500(nginx)

#  -M, --no-create-home          do not create the user's home directory

#  -d, --home-dir HOME_DIR       home directory of the new account

events {

worker_connections  65535;   #这里原来的1024太小了

}

http语句块添加:

upstream westos{       #代理这个label和下面的要一样

server 172.25.28.2:80;

server 172.25.28.3:80;

}

http最后面仿照例子添加:

server {

listen 80;

server_name www.westos.org  #这里指定了只能访问www.westos.org,访问ip都是不对的,所以客户端访问必须要本地解析/etc/hosts

172.25.28.4 www.westos.org

location / {

proxy_pass http://westos;    #代理是westos

}

}

内核限制>操作系统>程序

内核

[root@server4 conf]# sysctl -a | grep file

fs.file-nr = 480 0 98861

fs.file-max = 98861

3,操作系统文件限制配置

/etc/security/limits.conf

# End of file

nginx   -       nofile  65536 #比程序限制65535大,比内核限制98861小

4,nginx -t  检查语法错误

nginx -s reload 重新加载

5,访问测试

注意一定要先解析,访问域名,如果访问ip,那么就没有负载均衡的作用了,直接把nginx当作web服务器使用

6,负载均衡测试

停掉一个RS,不影响访问

停掉两个RS,报502错误,这个页面是nginx默认发布目录下的50x.html

[root@server4 html]# pwd

/usr/local/nginx/html

[root@server4 html]# ls

50x.html  index.html

(官方文档https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/

有很多不同种类的负载均衡实现方法)

二,哈希算法

修改配置文件

http {

upstream westos{

ip_hash;  #加入哈希函数

server 172.25.28.2:80;

server 172.25.28.3:80;

}

ip_hash是针对客户端的,对于同一个客户端ip,nginx给它分配的RS是一定的,除非改RS异常停止,而对于不同的客户端ip,nginx给它分配的RS不同,

三,改变权重

(为了实验效果,注释ip_hash)

http {

upstream westos{

#ip_hash;

server 172.25.28.2:80 weight=2;

server 172.25.28.3:80;

}

后端服务器RS中vm2出现的次数是vm3的两倍

四,nginx自身充当web服务器

http {

upstream westos{

#ip_hash;

server 172.25.28.2:80;

server 172.25.28.3:80;

server 127.0.0.1:80 backup;  #备用

}

只有当后端服务器vm2和vm3都停止时,本机才会重当web服务器

五, sticky模块实现session粘滞

在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:

1.ip hash,根据客户端的IP,将请求分配到不同的服务器上;

2.cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者,

注意:cookie需要浏览器支持,且有时候会泄露数据
Sticky工作原理 :

Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route

1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。

2.后端服务器处理完请求,将响应数据返回给nginx。

3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值

4.客户端接收请求,并保存带route的cookie。

5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。

实现过程

nginx-1.10.1.tar.gz

nginx-sticky-module-ng.tar.gz

1,这里需要停止原来的nginx-1.14.0,当前nginx-sticky-module-ng.tar.gz不支持14版

nginx -s stop

2,配置1.10.1版本的nginx

编译

./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-sticky-module-ng

##添加粘滞模块

##不要把之前的覆盖了,修改安装路径

##这种编译是静态编译,对于这个软件,需要什么模块了得把之前的模块再写一次,然后把需要的模块写在后面,而动态编译是只编译此次需要的,编译完成后之前的模块还在

make

make install

添加配置文件

把原来的配置文件复制过来

[root@server4 conf]# pwd

/opt/nginx/conf

[root@server4 conf]# cp /usr/local/nginx/conf/nginx.conf .

cp: overwrite `./nginx.conf'? y

注意:

[root@server4 conf]# which nginx

/sbin/nginx

[root@server4 conf]# ll /sbin/nginx

lrwxrwxrwx 1 root root 27 Aug  1 11:55 /sbin/nginx -> /usr/local/nginx/sbin/nginx

我们之前把nginx做了链接,但是那是1.14.0版本,现在这个不能在直接使用nginx命令,其实也可以做一个软链接,这里我们使用绝对路径

检查语法

[root@server4 conf]# /opt/nginx/sbin/nginx -t

nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /opt/nginx/conf/nginx.conf test is successful

修改配置文件

http {

upstream westos{

#ip_hash;

sticky;  #粘滞算法

server 172.25.28.2:80;

server 172.25.28.3:80;

#server 127.0.0.1:80 backup;

}

3,访问测试

这是针对浏览器的cookie,curl不是浏览器,所以不能使用curl,必须要在浏览器里面查看

F12打开关闭cookie

#什么是Sticky?# 为了理解Sticky的工作原理,我们可以先考虑一个问题:负载均衡怎么做?

DNS解析,在域名解析时分配给不同的服务器IP;

IP Hash,根据客户端的IP,将请求分配到不同的服务器上;

cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发行者。

Sticky就是基于cookie的一种负载均衡解决方案,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。请求来了,服务器发个cookie,并说:下次来带上,直接来找我。

Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route

1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。

2.后端服务器处理完请求,将响应数据返回给nginx。

3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值

4.客户端接收请求,并保存带route的cookie。

5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。

[转帖]利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞的更多相关文章

  1. Nginx sticky模块实现session粘滞

    一:下载,解压nginx sticky模块. 1 2 3 # cd /usr/local/src # wget http://nginx-sticky-module.googlecode.com/fi ...

  2. liunx 利用nginx 实现负载均衡

    一般采用软件实现负载均衡的有Nginx.apache.nginx 近年来使用频繁,其官网上面显示可以承载5万并发访问量,太牛了. nginx 相比 apache优势明显:Nginx 服务程序比较稳定, ...

  3. 若依项目利用nginx实现负载均衡及保持会话

    记录一下若依项目利用nginx实现负载均衡及保持会话的步骤. 此次作为试验性的测试,为了方便在本地window的环境上实现. 具体步骤: 1.安装两个tomcat8,可以下载一个后,另一个复制即可,下 ...

  4. Linux下利用nginx实现负载均衡

    linux下利用nginx实现负载均衡 前提条件: 1,安装好jdk 2,安装好tomcat和nginx(可以参考我前两篇文章) 满足前提条件后,要用nginx实现负载均衡,主要是靠配置nginx的配 ...

  5. 如何利用nginx实现负载均衡(总结)

    如何利用nginx实现负载均衡(总结) 一.总结 一句话总结: 推荐使用nginx七层(应用层)负载均衡的实现:配置那是相当的简单 1.nginx配置实例? |||-begin #这里的域名要和下面p ...

  6. 利用nginx实现负载均衡和动静分离

    1.Nginx介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 . Nginx 是由 ...

  7. 利用Nginx构建负载均衡server

    大家都知道.一个域名相应一个IP地址,而一个WebSite则相应一个IP地址上相应port服务的应用程序(或位置).而大型站点的并发訪问量很大,这些站点是怎样在一台Webserver上实现负载均衡的呢 ...

  8. 利用nginx实现负载均衡

    1.安装nginx和tomcat 我这里是使用docker安装的.安装流程可参照 dockerfile 这里安装了两个tomcat,端口分别是42000和42001.第二个tomcat的首页随便加了些 ...

  9. nginx系列11:负载均衡哈希算法ip_hash与hash模块

    使用默认的round-robin负载均衡算法无法保证某一类请求只能由上游的某一台应用服务器处理,它只适用于AKF扩展中的水平扩展,如果要保证某一类请求只能由上游的某一台应用服务器处理,就需要用到AKF ...

随机推荐

  1. PHP mysqli_fetch_assoc() 函数

    从结果集中取得一行作为关联数组: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localhost& ...

  2. CSS 图片自适应容器

    https://www.jb51.net/css/660677.html 经常有这样一个场景,需要让图片自适应容器的大小. 1.img标签的方式 我们马上就能想到,把width.height 设置为1 ...

  3. 收藏一个ST表模板

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...

  4. TTTTTTTTTTTTTTTT hdu 5727 Necklace 阴阳珠 二分图匹配+暴力全排列

    Necklace Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  5. 快速掌握Python的捷径-Python基础前传(1)

    文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事. 方丈高楼平地起,无论 ...

  6. ArcGIS Python查看geodatabase(.gdb)版本

    代码:10.0不能运行 import arcpy desc = arcpy.Describe(r'C:\Users\dell\Documents\ArcGIS\default.gdb') print ...

  7. vs2017+opencv配置参考链接

    本人通过以下几篇博客完成vs2017+opencv3.4.1的配置: OpenCV 3.4.1 + VS2017 开发环境搭建 - 简书 WIN10下 VS2017+OpenCv 3.4.1 配置 - ...

  8. 括号序列模型--序列dp--U86873 小Y的精灵国机房之旅

    括号序列模型及解法 >Codeforces314E◦给定一个长度为n的仅包含左右括号和问号的字符串,将问号变成左括号或右括号使得该括号序列合法,求方案总数.◦例如(())与()()都是合法的括号 ...

  9. 发布机制-灰度发布-例子:Gmail Labs

    ylbtech-发布机制-灰度发布-例子:Gmail Labs Gmail Labs是一个新特性橱窗,用户可以自己选择一些未正式发布的新特性进行体验,不喜欢可以关闭,在这个过程中,吃了螃蟹,也当了Go ...

  10. C# AES的128位、192位、256位加密

    C# AES的128位.192位.256位加密   AES加密原理,这里就不解释了,自行百度.这里主要细说AES的CBC加密模式下的128位.192位.256位加密区别,参考 对称加密和分组加密中的四 ...