java 负载均衡概念 负载均衡cookie_Nginx

你好呀,我是赵兴晨,文科程序员。

在上篇文章中咱们一块聊了Nginx会话保持的那些事儿,从为啥要用它,到怎么用,再到怎么用得更溜,可谓是一网打尽了。

但是吧,可能是知识点太多了,还是有漏网之鱼,就比如有读者在文章底部留言提出了一个非常具体的问题:Nginx中实现基于cookie的会话保持,所需的sticky模块是Nginx自带的还是需要从第三方获取?能否直接配置使用?

这个问题我仔细想了一下,简单回答“能”或“不能”似乎显得有些敷衍,也不足以展现我对技术细节的尊重。因此,我决定带领大家亲自搭建一个实验环境,手把手地引导大家一步步开启基于cookie的会话保持功能。看看介个到底是怎么四儿?

实验环境:3台 4核8G Centos7.9虚拟机,Nginx版本1.20.1

3台服务器IP规划:
10.0.0.91:nginx 负载均衡器
10.0.0.92:nginx 模拟后端请求 A
10.0.0.93:nginx 模拟后端请求 B

一、安装Nginx(三台服务器操作步骤一样)

1、安装依赖

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel make wget

java 负载均衡概念 负载均衡cookie_Nginx_02

java 负载均衡概念 负载均衡cookie_Nginx_03

2、创建Nginx用户

# 创建名为nginx的新用户组
groupadd nginx

# 创建名为nginx的用户 指定用户的主目录为/home/nginx 并添加到nginx用户组
useradd nginx -m  -d /home/nginx -g nginx

# 设置用户 nginx的密码为 nginx 生产环境可以设置的再复杂一些
echo nginx:nginx|chpasswd

java 负载均衡概念 负载均衡cookie_java 负载均衡概念_04

3、创建Nginx相关目录

# 创建相关目录
mkdir -p /usr/local/nginx/{cache,logs,conf/conf.d}

# 授权/usr/local/nginx目录 所属nginx用户
chown -R nginx:nginx /usr/local/nginx

java 负载均衡概念 负载均衡cookie_运维_05

4、下载Nginx包并解压

# 创建目录 用于保存下载的nginx压缩包
mkdir /opt/software/

# 切换到 /opt/software/ 目录
cd /opt/software/

# 下载 nginx-1.20.1.tar.gz
wget http://nginx.org/download/nginx-1.20.1.tar.gz

# 解压
tar -zxvf nginx-1.20.1.tar.gz

java 负载均衡概念 负载均衡cookie_nginx_06

5、编译并安装Nginx

这个是做实验用的简易安装部署,生产环境部署请参考我之前写的文章

《Nginx 生产环境部署的最佳实践》

# 切换到刚解压的 nginx-1.20.1目录
cd nginx-1.20.1

# 设置预编译
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx

# 开始编译并安装
make && make install

java 负载均衡概念 负载均衡cookie_运维_07


java 负载均衡概念 负载均衡cookie_运维_08

java 负载均衡概念 负载均衡cookie_java 负载均衡概念_09


java 负载均衡概念 负载均衡cookie_运维_10

6、设置Nginx开机自启

整段复制粘贴即可。

cat << EOF |tee /etc/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

java 负载均衡概念 负载均衡cookie_Nginx_11

上面的操作是创建一个名为 nginx.service 的 Systemd 服务单元文件的 shell 脚本命令。它利用了 cat 命令和 here document(EOF 标记的多行文本)来传递一个服务单元文件的内容。创建后,使用 tee 命令将这个内容同时输出到 /etc/systemd/system/nginx.service 文件,从而创建或更新 Nginx 的服务配置。

即创建一个 Systemd 服务文件,之后通过 Systemd 的命令来控制 Nginx 服务的启动、停止和重启。

设置开机自启,并启动Nginx服务

systemctl daemon-reload && systemctl enable --now nginx

查看Nginx启动状态

systemctl status nginx

java 负载均衡概念 负载均衡cookie_java 负载均衡概念_12

到这咱们的Nginx就安装好了,咱们验证一下是否可以访问通

看到 Welcome to nginx就是Nginx部署成功了

curl 127.0.0.1

java 负载均衡概念 负载均衡cookie_负载均衡_13

另外的两台服务器装Nginx的步骤同上。

二、配置Nginx

1、模拟后端服务器 (10.0.0.92/10.0.0.93 配置相同)

# 编辑Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf

java 负载均衡概念 负载均衡cookie_nginx_14

# 修改内容如下 一个是A,一个是B 作后端服务器的区分。
# 10.0.0.92的配置文件
location / {
  add_header Content-Type text/html;
  return 200 "Hello A\n";
}

# 10.0.0.93的配置文件
location / {
  add_header Content-Type text/html;
  return 200 "Hello B\n";
}

java 负载均衡概念 负载均衡cookie_Nginx_15

# 修改之后,使用 nginx -t 对配置文件进行语法检测
# 然后加载Nginx配置文件
nginx -t
systemctl reload nginx

java 负载均衡概念 负载均衡cookie_负载均衡_16

到这咱们的模拟后端服务器就配置完成了

访问 http://10.0.0.92 响应的是Hello A

java 负载均衡概念 负载均衡cookie_java 负载均衡概念_17

访问 http://10.0.0.93 响应的是Hello B

java 负载均衡概念 负载均衡cookie_nginx_18

2、配置10.0.0.91的Nginx 实现会话保持

Nginx 默认并不提供基于 cookie 的会话保持功能。为了实现基于 cookie 的会话保持,需要安装第三方模块 nginx-sticky-module。这个模块允许 Nginx 通过设置特定的 cookie 来绑定客户端的会话到特定的后端服务器,从而实现会话保持。安装和配置该模块后,可以通过在 Nginx 配置文件中添加相应的指令来启用会话保持功能。Nginx 的商业版本Nginx Plus不需要额外安装 nginx-sticky-module 这样的第三方模块,可以直接使用。

给Nginx编译安装sticky模块

# 查看 Nginx已有d的模块
nginx -V

#下载 sticky模块(我下载到了/root,大家可以指定到其他目录)
wget  https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip

# 下载解压工具
yum install -y unzip

# 解压刚才下载的sticky模块压缩包
unzip 08a395c66e42.zip

# 修改目录名称
mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng

# 重新编译Nginx
cd /opt/software/nginx-1.20.1

# 设置预编译 23行是你要添加的模块,注意模块的存放路径
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--add-module=/root/nginx-sticky-module-ng

# 重新编译
make

如果make的过程中报错 ,如下图:

java 负载均衡概念 负载均衡cookie_nginx_19

可以修改 ngx_http_sticky_misc解决报错问题

vim /root/nginx-sticky-module-ng/ngx_http_sticky_misc.c

# 在第12行添加
#include <openssl/sha.h>
#include <openssl/md5.h>

备份之前的Nginx二进制文件

cp /usr/sbin/nginx /usr/sbin/nginx_bak

再尝试编译

make

将编译好的Nginx二进制文件替换到原来的目录里

# 停止Nginx
systemctl stop nginx

# 替换新编译好的Nginx
cp objs/nginx /usr/sbin/

# 启动Nginx
systemctl start nginx

然后检查程序中是否包含新模块

nginx -V

java 负载均衡概念 负载均衡cookie_java 负载均衡概念_20

配置基于cookie的会话保持

咱们先试试没有配置会话保持是什么样子的

需要配置一下 10.0.0.91的Nginx

# vim /usr/local/nginx/conf/nginx.conf

http {
    upstream backend {
        server 10.0.0.93;
        server 10.0.0.92;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}

# 语法检测
nginx -t

# 加载配置文件
systemctl reload nginx

然后咱们看一下效果

从视频中(我的公众号可看)可以看出,没有配置会话保持前,咱们访问 http://10.0.0.91 是轮询到后端服务器 10.0.0.92/10.0.0.93。

下面咱们开启会话保存

# vim /usr/local/nginx/conf/nginx.conf

http {
    upstream backend {
        server 10.0.0.93;
        server 10.0.0.92;
        sticky name=myappsession;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}

# 语法检测
nginx -t

# 加载配置文件
systemctl reload nginx

看一下开启会话保持的效果(公众号可看)

开启会话保持之后,用户首次访问网站时,请求会被发送到nginx服务器,nginx使用负载均衡算法(如轮询,最少连接数等)选择一个后端服务器来处理这个请求。在用户浏览器中设置一个cookie,通常包含后端服务器的标识信息如下图,这个cookie的名称和属性实在nginx的配置文件中定义的。

java 负载均衡概念 负载均衡cookie_运维_21

用户后续访问网站时,浏览器会自动将存储的cookie随请求一起发送到服务器,nginx接收到请求后会检查请求中的cookie,如果cookie存在且有效,nginx会根据cookie中的信息将请求路由到之前处理该用户请求的后端服务器。

OK,今天的分享就到这里啦,今天聊了Nginx开启基于cookie会话保持的姿势,还配置了视频辅助大家的理解,希望大家能够有所收获。

如果你对今天的内容有任何疑问,或者想要了解更多关于Nginx的知识和技巧,欢迎在文章下方留言,我会尽力为你解答。

对了,如果你觉得这篇文章挺赞的,那就:
点个赞,让我感受到你的鼓励和支持。
点个在看,让这篇文章飞到更多人的屏幕上。
收藏一下,下次想找的时候,一下就能找到。
关注一波,这样咱们就能经常见面,不断有新的技术话题可以聊。
你的支持对我来说超级重要,真的非常感谢!如果你对Nginx还有更多好奇,记得去看看我的Nginx系列文章,那里头也有很多干货的。

点击Nginx文章合集了解更多我分享的Nginx相关文章!


最后,我为您准备了一份特别的技术学习礼物,包括:
Linux学习笔记:详尽记录了Linux的核心知识点和实用技巧。
Java基础笔记:为您打下坚实的Java编程基础。
Java面试总结:十万字的面试经验,助您轻松应对各种技术面试。