Nginx 实现会话保持的方式配置

news/2024/9/19 8:53:11/ 标签: nginx, 运维, java, 开发语言, spring

在 NGINX 中实现会话保持(Session Persistence),可以通过多种方法完成。以下是一些常见的方式:

1. 使用 IP 哈希(IP Hash)

IP 哈希是一种简单的负载均衡策略,它基于客户端的 IP 地址将请求分配到同一个后端服务器。该方法适合基本的会话保持场景。

配置示例:

java">
upstream backend {ip_hash;  # 使用 IP 哈希来实现会话保持server backend1.example.com;server backend2.example.com;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
}

这种方式比较简单,但如果客户端的 IP 发生变化,会话保持就会失效(例如,移动客户端切换网络)。

2. 基于 Cookie 的会话保持

NGINX 可以通过设置一个特定的 Cookie 来实现会话保持,客户端的请求将基于 Cookie 被路由到同一台后端服务器。

配置示例:

java">
upstream backend {server backend1.example.com;server backend2.example.com;sticky cookie srv_id expires=1h;  # 基于 Cookie 实现会话保持
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
}

在这个示例中,`sticky cookie srv_id expires=1h;` 会为客户端设置一个名为 `srv_id` 的 Cookie,并且该 Cookie 的有效期为 1 小时。当客户端发起请求时,它会带上这个 Cookie,NGINX 将根据 Cookie 将请求路由到正确的服务器。

3. 基于 URL 参数的会话保持

如果应用程序能够在 URL 中传递某种标识符,NGINX 也可以基于 URL 参数实现会话保持。配置示例:

java">
upstream backend {server backend1.example.com;server backend2.example.com;sticky route $arg_session_id;  # 基于 URL 参数实现会话保持
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
}

在这个示例中,NGINX 使用 `$arg_session_id` 来决定请求应该路由到哪一台后端服务器。需要确保应用程序在 URL 中正确地传递 `session_id` 参数。

4. 基于 Session Sticky 模块

如果需要更加灵活的会话保持配置,你可以使用第三方的 `nginx-sticky-module` 模块(需要手动编译 NGINX 支持此模块)。

配置示例:

java">upstream backend {sticky;  # 使用 sticky 模块server backend1.example.com;server backend2.example.com;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
}

这需要额外安装模块,可以提供更丰富的会话保持功能,如基于 Cookie 或其他自定义规则。

具体实现

基于 `nginx-sticky-module` 模块实现会话保持需要先编译并安装该模块,然后配置 NGINX 使用它。以下是详细的实现步骤,包括模块的安装和配置过程。

 1. 安装 NGINX Sticky 模块

        Step 1: 下载并编译 NGINX 源码和 Sticky 模块

要安装 `nginx-sticky-module`,需要重新编译 NGINX 并加入该模块。以下是基于 Linux 的示例:

- 首先,安装必要的依赖:

sudo apt-get updatesudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

- 下载 NGINX 源码(可根据需要下载你所用的版本):

cd /usr/local/srcwget http://nginx.org/download/nginx-1.24.0.tar.gz   版本号可以根据需要调整tar -zxvf nginx-1.24.0.tar.gzcd nginx-1.24.0

- 下载 `nginx-sticky-module` 模块:

git clone https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng.git

        Step 2: 编译并安装 NGINX

在编译 NGINX 时,指定模块路径,将 `sticky-module` 添加到 NGINX 中:

- 检查当前 NGINX 的编译参数(如果 NGINX 已经安装):

nginx -V

- 进入 NGINX 源码目录,编译并安装 NGINX:

./configure --with-http_ssl_module --add-module=/usr/local/src/nginx-sticky-module-ng   根据路径调整makesudo make install

- 验证 NGINX 是否正确编译和安装:

/usr/local/nginx/sbin/nginx -v

 2. 配置 NGINX 使用 Sticky 模块

`nginx-sticky-module` 安装好后,你就可以使用它来实现会话保持。

 配置示例:


upstream backend {sticky;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
}

- `sticky`:此指令开启会话保持,模块会自动为每个客户端生成一个基于 Cookie 的哈希值,并将请求路由到同一台服务器。

该配置基于 `nginx-sticky-module`,它会为客户端设置一个名为 `route` 的 Cookie,后续请求将通过该 Cookie 进行会话保持。

 3. Sticky 指令的更多配置选项

`nginx-sticky-module` 支持多种配置参数,可以根据需求进行调整。常用选项如下:

- `sticky name=cookiename expires=1h domain=.example.com path=/`:
  - `name`: 指定 Cookie 名字,默认为 `route`。
  - `expires`: Cookie 的过期时间,例如 `1h` 表示 1 小时。
  - `domain`: 指定 Cookie 作用的域名。
  - `path`: 指定 Cookie 的路径。 配置示例:

upstream backend {sticky name=sessionid expires=2h domain=.example.com path=/;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
}

此配置将创建一个名为 `sessionid` 的 Cookie,Cookie 的有效期为 2 小时,且适用于 `.example.com` 域名下的所有路径。

 4. 验证 Sticky 会话保持

- 启动 NGINX 服务:

sudo /usr/local/nginx/sbin/nginx

        - 测试配置是否生效:可以通过浏览器或 curl 工具测试,观察是否客户端的后续请求会被路由到同一台服务器。

curl -I http://example.com

5. 常见问题排查

- 模块安装失败:确保 NGINX 是通过源码编译的,并且在编译时指定了 `--add-module` 参数。如果 NGINX 是通过包管理器安装的,可能需要先卸载再重新编译。
- NGINX 无法启动:确保所有 NGINX 配置文件语法正确,可以使用以下命令检查配置:

sudo /usr/local/nginx/sbin/nginx -t

总结
- IP Hash:适合简单场景,但对网络变化敏感。
- Cookie:最常用、灵活,适合大部分会话保持需求。
- URL 参数:适合特定业务场景,例如 URL 中带有用户标识符。
- 第三方模块:适用于需要更多控制或特殊功能的场景。
 


http://www.ppmy.cn/news/1526393.html

相关文章

vue中使用fabric.js创建画布、加载图片图形元素、并实现拖拽移动缩放功能(在线组态)

在Web应用开发中,有时我们需要实现图形元素的拖拽、移动和缩放功能,以便构建在线组态、绘图等应用。fabric.js是一个强大的JavaScript库,可以轻松地在浏览器中实现这些功能。本文将介绍如何在Vue项目中使用fabric.js库创建画布,加…

java基于PDF底层内容流的解析对文本内容进行编辑

本文实现了基于坐标位置对PDF内容的底层修改而非覆盖,因此不会出现在某些高级PDF编辑器中可以移除插入内容或者文件随着编辑次数增多而大幅增大(原因是原内容还在文件中)的问题,而且使用的pdfbox是一个开源的、免费的PDF处理库&am…

Redis的存储原理和数据模型

一、Redis是单线程还是多线程呢? 我们通过跑redis的代码,查看运行的程序可以得知,Redis本身其实是个多线程,其中包括redis-server,bio_close_file,bio_aof_fsync,bio_lazy_free,io_t…

Django——多apps目录情况下的app注册

文章目录 多apps目录下的app注册方式1-添加python导包路径方式2-修改AppConfig类名 多apps目录下的app注册 方式1-添加python导包路径 import sys sys.path.insert(0, str(BASE_DIR / "apps")) print(sys.path)INSTALLED_APPS [django.contrib.admin,django.contr…

leetcode01——27. 移除元素(双指针)、977. 有序数组的平方(双指针)、209. 长度最小的子数组(双指针/滑动窗口)

27. 移除元素 /** 定义快慢指针,均从0开始,fast向后移动,遇到不为删除值的就停下,将值赋值给slow,slow 遇到等于目标值就直接跳过,不等于目标值就赋值,这样就能 过滤掉(也就是删除掉&#xff0…

UAC2.0 麦克风——单通道 USB 麦克风

文章目录 单通道 USB 麦克风描述符结构设备描述符配置描述符集合配置描述符接口关联描述符类特殊描述符接口 1 的类特殊描述符Standard AC InterfaceClass-Specific AC Interface HeaderClock SourceInput TerminalOutput TerminalFeature Unit接口 2 的类特殊描述符Standard A…

iOS 18 RC 版本更新,为相机应用引入了“暂停录制视频”功能

苹果公司9月10日正式向全球iPhone用户推送了iOS 18 Release Candidate(RC)版本。这一版本的发布不仅标志着iOS系统的又一次重大更新,更预示着苹果在提升用户体验、增强隐私保护以及推动AI应用方面的持续努力。 并且此次苹果公司最新推出的 i…

Deep Learning-Based Object Pose Estimation:A Comprehensive Survey

论文:https://arxiv.org/pdf/2405.07801v3 项目:https://github.com/CNJianLiu/Awesome-Object-Pose-Estimation 年份:2024 方向:姿态估计 1. 目标姿态估计定义 估计图像中目标相对于相机的姿态, 目标姿态估计是增…

Leetcode 缺失的第一个正整数

题目意思是找出第一个没出现的最小正整数。 Explanation: Move Numbers to Correct Positions: The idea is to place each number in its corresponding index. For example, 1 should be at index 0, 2 should be at index 1, and so on. This is done using a while loop t…

新手教学系列——用Nginx将页面请求分发到不同后端模块

在当今的Web开发中,前后端分离架构已经成为主流,尤其是大型应用项目。前端可以通过Vue这样的框架来统一管理页面和用户交互,而后端则通常会拆分成多个微服务模块,以便应对不同业务需求和功能扩展。在这样的架构下,Nginx作为一个高效、灵活的Web服务器,能够帮助我们将前端…

下载chromedriver驱动

首先进入关于ChromeDriver最新下载地址:Chrome for Testing availability 进入之后找到与自己所匹配的,在浏览器中查看版本号,下载版本号需要一致。 下载即可,解压,找到 直接放在pycharm下即可 因为在环境变量中早已配…

用Inno Setup打包QT程序输出安装包

InnoSetup打包编译好的QT程序 文章目录 InnoSetup打包编译好的QT程序介绍具体步骤自定义脚本更改引入配置文件/动态库路径申请管理员权限设置安装过程界面的图标和图片C程序依赖运行库 介绍 Inno Setup:用于打包安装程序 具体步骤 首先打开inno setup compiler 第…

Prometheus+grafana+kafka_exporter监控kafka运行情况

使用Prometheus、Grafana和kafka_exporter来监控Kafka的运行情况是一种常见且有效的方案。以下是详细的步骤和说明: 1. 部署kafka_exporter 步骤: 从GitHub下载kafka_exporter的最新版本:kafka_exporter项目地址(注意&#xff…

C++11:lambda表达式和包装器(function bind)

目录 1. lambda表达式 1.1 引入原因 1.2 lambda表达式 1.3 捕获列表 mutable关键字 1.4 lambda表达式原理 2. 包装器 2.1 function 2.2 bind 1. lambda表达式 1.1 引入原因 C11之前,如果想要对一个数组排序,可以使用algorithm算法库中sort排序…

大模型教程:使用 Milvus、vLLM 和 Llama 3.1 搭建 RAG 应用

vLLM 是一个简单易用的 LLM 推理服务库。加州大学伯克利分校于 2024 年 7 月将 vLLM 作为孵化项目正式捐赠给 LF AI & Data Foundation 基金会。欢迎 vLLM 加入 LF AI & Data 大家庭!🎉 在主流的 AI 应用架构中,大语言模型&#xff…

Spring6学习笔记4:事务

1 JdbcTemplate 1.1 简介 Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作 准备工作 ①搭建子模块 搭建子模块&#xff1a;spring-jdbc-tx ②加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dep…

微信小程序中巧妙使用 wx:if 和 catchtouchmove 实现弹窗禁止页面滑动功能

大家好&#xff0c;今天我要和大家分享的是在微信小程序开发过程中&#xff0c;如何利用 wx:if 或 wx:elif 来条件性地渲染不同的元素&#xff0c;并结合 catchtouchmove 事件处理函数来解决弹窗弹出时禁止背后页面滑动&#xff0c;而弹窗消失时恢复滑动的功能。 在微信小程序…

redis详细解析和配置选择

Redis是一个开源的、使用ANSI C语言编写的、基于内存亦可持久化的日志型Key-Value非关系型数据库。它以其高性能、丰富的数据结构和灵活的数据模型而广受欢迎&#xff0c;被广泛应用于缓存、消息队列、实时数据处理等多种场景。以下是对Redis的详细解析和配置选择的详细阐述。 …

Vm软件安装_链接相机

工业相机的驱动连接 下载安装MVS MVS 客户端支持安装在 Windows XP/7/10 32/64bit&#xff0c;Linux 32/64bits 以及MacOS64bits操作系统上。本文以 Windows 系统为例进行介绍。 具体操作步骤如下&#xff1a; 请从海康机器人官网&#xff08;www.hikrobotics.com&#xff0…

Unity3D 实现水体交互详解

前言 在Unity3D中实现水体交互是一个既有趣又富有挑战性的任务&#xff0c;它涉及到图形渲染、物理模拟以及用户交互等多个方面。下面&#xff0c;我将详细介绍如何在Unity中创建一个基本的水体交互系统&#xff0c;包括技术概览、步骤分解以及关键代码实现。 对惹&#xff0…