你好呀,我是赵兴晨,文科程序员。
在上篇文章中咱们一块聊了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
2、创建Nginx用户
# 创建名为nginx的新用户组
groupadd nginx
# 创建名为nginx的用户 指定用户的主目录为/home/nginx 并添加到nginx用户组
useradd nginx -m -d /home/nginx -g nginx
# 设置用户 nginx的密码为 nginx 生产环境可以设置的再复杂一些
echo nginx:nginx|chpasswd
3、创建Nginx相关目录
# 创建相关目录
mkdir -p /usr/local/nginx/{cache,logs,conf/conf.d}
# 授权/usr/local/nginx目录 所属nginx用户
chown -R nginx:nginx /usr/local/nginx
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
5、编译并安装Nginx
这个是做实验用的简易安装部署,生产环境部署请参考我之前写的文章
# 切换到刚解压的 nginx-1.20.1目录
cd nginx-1.20.1
# 设置预编译
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx
# 开始编译并安装
make && make install
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
上面的操作是创建一个名为 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
到这咱们的Nginx就安装好了,咱们验证一下是否可以访问通
看到 Welcome to nginx就是Nginx部署成功了
curl 127.0.0.1
另外的两台服务器装Nginx的步骤同上。
二、配置Nginx
1、模拟后端服务器 (10.0.0.92/10.0.0.93 配置相同)
# 编辑Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
# 修改内容如下 一个是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";
}
# 修改之后,使用 nginx -t 对配置文件进行语法检测
# 然后加载Nginx配置文件
nginx -t
systemctl reload nginx
到这咱们的模拟后端服务器就配置完成了
访问 http://10.0.0.92 响应的是Hello A
访问 http://10.0.0.93 响应的是Hello B
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的过程中报错 ,如下图:
可以修改 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
配置基于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的配置文件中定义的。
用户后续访问网站时,浏览器会自动将存储的cookie随请求一起发送到服务器,nginx接收到请求后会检查请求中的cookie,如果cookie存在且有效,nginx会根据cookie中的信息将请求路由到之前处理该用户请求的后端服务器。
OK,今天的分享就到这里啦,今天聊了Nginx开启基于cookie会话保持的姿势,还配置了视频辅助大家的理解,希望大家能够有所收获。
如果你对今天的内容有任何疑问,或者想要了解更多关于Nginx的知识和技巧,欢迎在文章下方留言,我会尽力为你解答。
对了,如果你觉得这篇文章挺赞的,那就:
点个赞,让我感受到你的鼓励和支持。
点个在看,让这篇文章飞到更多人的屏幕上。
收藏一下,下次想找的时候,一下就能找到。
关注一波,这样咱们就能经常见面,不断有新的技术话题可以聊。
你的支持对我来说超级重要,真的非常感谢!如果你对Nginx还有更多好奇,记得去看看我的Nginx系列文章,那里头也有很多干货的。
点击Nginx文章合集了解更多我分享的Nginx相关文章!
最后,我为您准备了一份特别的技术学习礼物,包括:
Linux学习笔记:详尽记录了Linux的核心知识点和实用技巧。
Java基础笔记:为您打下坚实的Java编程基础。
Java面试总结:十万字的面试经验,助您轻松应对各种技术面试。