转自: https://blog.csdn.net/yyysylvia/article/details/80198021

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+sticky安装

nginx安装最好采用编译安装的方式,这样可以很方便的找到nginx的安装位置,方便添加nginx-sticky模块。如果之前已经编译安装过nginx,只是添加sticky模块,则可跳过nginx安装解压等过程,直接进行步骤4

  1. 获取linux下的nginx安装包,官网下载 https://nginx.org/en/download.html, 书写本文档时使用的安装包为nginx-1.14.0.tar.gz

  2. 获取nginx-sticky模块包,一个比较靠谱的github下载地址 https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/downloads/ , 书写本文档时使用的安装包为nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

    • wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip -O ./nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
  3. 安装前编译环境准备

    • centos:
    1
    yum -y install gcc-c++  pcre pcre-devel  zlib zlib-devel openssl openssl-devel --setopt=protected_multilib=false
    • ubuntu:
    1
    apt-get install build-essential libtool libpcre3 libpcre3-dev
  4. 安装步骤

    • 解压nginx和sticky安装包
    1
    2
    3
    4
    tar -zxvf nginx-1.14.0.tar.gz
    unzip -D nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
    mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 nginx-sticky-module-ng
    cd nginx-1.14.0
    • 输入安装命令并指定安装路径,可以再添加其他需要的属性,但最好不要减少,否则sticky模块添加过程可能出现报错;如果之前已经编译安装过nginx,可以用nginx -V指令查看之前的命令,在之前configure argument的基础上添加下列安装属性
    1
    ./configure --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gunzip_module --with-http_gzip_static_module --add-module=${absolutPath}/nginx-sticky-module-ng

    ${absolutePath}为本机上nginx-sticky-module-ng文件夹所在路径

    出现如下提示信息表示没有问题:

    • 执行编译安装(覆盖安装)

      1
      make && make install

      安装成功后输入指令查看编译信息:

      1
      /usr/local/nginx/sbin/nginx -V

    可以看到上一次编译使用的是我们输入的指令

    启动nginx

    1
    /usr/local/nginx/sbin/nginx

    之后可以访问80端口在网页上查看效果, 此时sticky模块也一起生效,可以在nginx.conf中使用了

    • 将nginx设置为系统服务
    1
    vim /lib/systemd/system/nginx.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [Unit]  
    Description=The nginx HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target
    1
    2
    chmod 745 /lib/systemd/system/nginx.service
    systemctl enable nginx.service

    完成后就可以使用以下这些命令了

    1
    2
    3
    4
    systemctl start nginx
    systemctl stop nginx
    systemctl restart nginx
    systemctl status nginx

负载均衡配置(需要结合具体项目,仅供参考需要)

/usr/local/nginx/conf/nginx.conf关键配置如下(配置在http块中):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
upstream backend {
sticky; #使用sticky算法
server 114.55.91.85:8180; #后端服务器1
server 106.14.81.62:8180; #后端服务器2
}

#负载均衡设置
server{
listen 8080;
server_name _;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_http_version 1.1; #websocket
proxy_set_header Upgrade $http_upgrade; #websocket
proxy_set_header Connection "upgrade"; #websocket
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

#前端静态资源部署
server {
listen 80;
server_name ide.mooctest.net; #服务器对应ip
root /software/webide-frontend; #前端静态文件所在位置

location / {
}

location /ws {
rewrite ^/ws/.*$ /workspace.html;
}
}

sticky其他用法

1
2
3
4
5
6
7
格式: sicky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];

name: cookie名,可以为任何的string字符,默认是route
domain: 哪些域名下可以使用这个cookie
path: 哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡
expires: cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
no_fallbackup: 如果设置了这个,cookie对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用