nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx sticky负载均衡

Nginx使用sticky模块完成对Nginx的负载均衡(最佳实践)

作者:難釋懷

本文详细介绍了Nginx sticky模块的安装与配置,强调其在会话保持方面比优于Nginx内置hash策略的,并提供给出具体操作步骤与配置示例,感兴趣的朋友跟随小编一起看看吧

一、引言:为什么需要 sticky 模块?

在使用 Nginx 作为反向代理进行负载均衡时,一个经典难题是 会话保持(Session Persistence)。用户的请求可能会被分发到不同的后端应用服务器(如 Tomcat, Node.js),而这些服务器之间通常不共享 Session 数据,导致用户频繁“掉线”。

Nginx 自带的 ip_hash 策略虽然能解决部分问题,但它存在致命缺陷:

为了解决这个问题,社区开发了 nginx-sticky-module 这个强大的第三方模块。它通过 植入 Cookie 的方式,精准地将同一用户的请求始终路由到同一台后端服务器,完美实现了会话保持。

💡 核心价值
sticky 模块提供了一种比 ip_hash 更精准、更可靠的会话保持机制,是开源 Nginx 实现粘性会话的最佳实践!

二、准备工作:环境与依赖

由于 sticky 是一个第三方模块,我们需要从源码重新编译 Nginx 来集成它。

1. 系统环境

本文以 CentOS 7 / Rocky Linux 8 为例。

2. 安装编译依赖

sudo yum install -y gcc gcc-c++ make libtool pcre pcre-devel openssl openssl-devel zlib zlib-devel

3. 下载 Nginx 源码

请务必下载与你当前生产环境相同版本的 Nginx 源码,以避免兼容性问题。

# 例如,下载 Nginx 1.24.0
cd /usr/local/src
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz

4. 下载 sticky 模块源码

nginx-sticky-module 有多个分支,推荐使用维护较好的 nginx-sticky-module-ng

cd /usr/local/src
wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip
unzip 08a395c66e42.zip
# 解压后会得到一个类似 "nginx-goodies-nginx-sticky-module-ng-08a395c66e42" 的目录
mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 nginx-sticky-module-ng

三、核心步骤:编译并集成 sticky 模块

1. 查看现有 Nginx 的编译参数(重要!)

为了保证新编译的 Nginx 功能完全一致,我们需要先获取当前 Nginx 的编译参数。

nginx -V

你会看到类似如下的输出:

configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx ... --with-http_ssl_module ...

复制 configure arguments 后面的所有内容。

2. 进入 Nginx 源码目录并配置

cd nginx-1.24.0
# 在原有参数的基础上,加上 --add-module 指向 sticky 模块的路径
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
... # 这里是你之前复制的所有原有参数
--add-module=/usr/local/src/nginx-sticky-module-ng

3. 编译(但不要安装!)

执行 make 命令进行编译。这一步不会覆盖你现有的 Nginx 安装,只会生成一个新的可执行文件。

make

编译成功后,新的 Nginx 可执行文件位于 objs/nginx

4. 备份并替换原 Nginx 二进制文件

# 备份原文件
sudo cp /usr/sbin/nginx /usr/sbin/nginx.bak
# 替换为新编译的文件
sudo cp objs/nginx /usr/sbin/nginx

5. 验证模块是否加载成功

nginx -V 2>&1 | grep -o with-http_sticky_module

如果输出 with-http_sticky_module,则说明模块已成功集成。

四、配置与实战:启用 sticky 负载均衡

现在,我们可以在 Nginx 配置文件中使用 sticky 指令了。

1. 基本配置示例

编辑你的 nginx.conf 文件,在 upstream 块中添加 sticky 指令。

upstream backend {
    # 启用 sticky 模块
    # name: Cookie 名称
    # expires: Cookie 过期时间
    # path: Cookie 作用路径
    sticky cookie srv_id expires=1h domain=.yourdomain.com path=/;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}
server {
    listen 80;
    server_name yourdomain.com;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

2. 关键参数详解

3. 工作原理

  1. 首次访问:客户端请求头中没有 srv_id Cookie。Nginx 根据负载均衡策略(如轮询)选择一台后端服务器,并在响应头中植入 Set-Cookie: srv_id=xxx; ...
  2. 后续访问:客户端在请求头中携带 Cookie: srv_id=xxx。Nginx 解析此 Cookie,直接将请求转发给上次分配的那台服务器。

五、验证与排错

1. 验证会话保持

2. 常见问题与解决

六、结语

到此这篇关于Nginx使用sticky模块完成对Nginx的负载均衡(最佳实践)的文章就介绍到这了,更多相关Nginx sticky负载均衡内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文