zoukankan      html  css  js  c++  java
  • ⑰.nginx会话保持和负载均衡

    需求
    在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接。使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie会是一种什么情形,想想看, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐。
    如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的.
    Nginx 基于nginx-sticky-module模块进行会话保持
    sticky介绍
    sticky模块与Ip_hash都是与负载均衡算法相关,但又有差别,差别是
    ip hash,根据客户端的IP,将请求分配到不同的服务器上 sticky,根据服务器给客户端的cookie,客户端再次请求时会带上此cookie,nginx会把有此cookie的请求转发到颁发cookie的服务器上
    sticky原理
    Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route :
    客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。 后端服务器处理完请求,将响应数据返回给nginx。 此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。 客户端接收请求,并保存带route的cookie。 当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。
    sticky官网
    官方地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src 下载地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
    注意点

    同一客户端,如果启动时同时发起多个请求,有可能落在不同的后端服务器上。 由于cookie最初由服务器端下发,如果客户端禁用cookie,则cookie不会生效。 客户端可能不带cookie,Android客户端发送请求时,一般不会带上所有的cookie,需要明确指定哪些cookie会带上。如果希望用sticky做负载均衡,请对Android开发说加上cookie。 cookie名称不要和业务使用的cookie重名。Sticky默认的cookie名称是route,可以改成任何值 客户端发的第一个请求是不带cookie的。服务器下发的cookie,在客户端下一次请求时才能生效。 Nginx sticky模块不能与ip_hash同时使用 
    

    Nginx安装Sticky模块

    如果你还没有部署Nginx,那么就在部署Nginx的时候进行 --add-module 添加上此模块就行了,我这里是Nginx已经安装过了,需要再把此模块加载进NGINX

    1.下载nginx及sticky
    wget http://nginx.org/download/nginx-1.20.0.tar.gz
    wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
    tar xf master.tar.gz
    cd master
    

    把此模块放进nginx/module目录下,名称太长,重命名一下

    mkdir /usr/local/nginx-1.20.0/module
    mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 /usr/local/nginx-1.20.0/module/nginx-sticky-module
    
    2.重新编译NGINX 下载一个NGINX后重新解压,然后看之前NGINX编译了那些模块,这里都给加上,在最后加上 --add-module载入sticky模块
    cd /usr/local/nginx-1.20.0
    ./configure --prefix=/usr/local/nginx 
    --sbin-path=/usr/local/nginx/sbin/nginx 
    --conf-path=/usr/local/nginx/conf/nginx.conf 
    --pid-path=/usr/local/nginx/run/nginx.pid 
    --error-log-path=/usr/local/nginx/logs/error.log 
    --http-log-path=/usr/local/nginx/logs/access.log 
    --with-pcre 
    --user=nginx 
    --group=nginx 
    --with-stream 
    --with-threads 
    --with-file-aio 
    --with-http_v2_module 
    --with-http_ssl_module 
    --with-http_realip_module 
    --with-http_gzip_static_module 
    --with-http_stub_status_module 
    --add-module=/usr/local/nginx-1.20.0/module/nginx-sticky-module            #在此载入sticky模块
    

    ./configure完后进行编译,然后更换 nginx 程序

    make 
    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
    cp -rf objs/nginx /usr/local/nginx/sbin/
    

    最后再 make upgrade 进行更新检测

    [root@nginx_proxy02 nginx-1.20.0]# make upgrade
    /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    kill -USR2 `cat /usr/local/nginx/run/nginx.pid`
    sleep 1
    test -f /usr/local/nginx/run/nginx.pid.oldbin
    kill -QUIT `cat /usr/local/nginx/run/nginx.pid.oldbin`
    

    以上就完成了Nginx载入第三方模块,使用 nginx -V 来查看是否载入成功

    3.修改NGINX配置文件 修改NGINX配置文件来启用sticky

    upstream backend {
            sticky name=ngx_cookie expires=6h;
            server 192.168.31.240:8080 weight=3 max_fails=3 fail_timeout=10s;
            server 192.168.31.241:8080 weight=3 max_fails=3 fail_timeout=10s;
            server 192.168.31.242:8080 weight=6 max_fails=3 fail_timeout=10s;
            server 192.168.31.243:8080;
            server 192.168.31.244:8080 down;
    }
    
    mkdir /usr/local/nginx/ngx_cookie
    
    

    4.sticky语法解析
    指令 描述 name 设置记录cookie的名称(可自定义),默认为route domain 设置cookie要使用的域名 path 设置cookie作用的URL路径,默认根目录 expires 设置cookie的生存期 hash 值为 index、md5、sha1,对应明文、md5、和sha1,默认md5,测试sha1后端服务器会变 no_fallback 当sticky的后端机器挂了以后,nginx返回502,而不转发到其他服务器,不建议设置 secure 设置启用安全的cookie,需要HTTPS支持 httponly 允许cookie不通过JS泄漏

    5.重启NGINX 

    /usr/local/nginx/sbin/nginx -s reload
    

    测试访问NGINX

    第一次访问的时候是没有Cookie的,访问完成后NGINX才会把Cookie包含在返回的数据中,在下次请求数据的时候就会出现Cookie。 所以刷新一下后才能看到Cookie。

  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/yangtao416/p/14689264.html
Copyright © 2011-2022 走看看