Nginx · 2021年3月24日 0

Nginx如何实现负载均衡?且保证会话不丢失?

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名

这里我使用Docker创建了2个Nginx容器,宿主机上有安装Nginx.

宿主机Nginx实现负载均衡配置:

# 可配置多个服务器,此配置在http下
upstream dockerContainer {

    server 127.0.0.1:8081 weight=10;# 容器1
    server 127.0.0.1:8082 weight=5;# 容器2
}

如果设置了weight,则nginx会将请求按照weight比例分配给服务器。如上面的配置,2次请求到了127.0.0.1:8081,下一次就会请求到127.0.0.1:8082(请求数量是2:1)

# 配置
server {
 listen 80;
 server_name www.xxx.com;
    location / {

       # 配置代理转发,此时的www.xxx.com的请求会使用dockerContainer的规则进行转发
       proxy_pass http://dockerContainer;
    }
}

当然,nginx还支持多种规则进行转发,比如还可以根据IP进行转发,即相同的IP会被转发至同一台服务器。

如果你使用了session会话,那么每次请求都可能请求到了不同的服务器上处理,可能导致session不一致的问题,比如无法维护登录状态。此时一个比较好的解决办法就是使用nginx的sticky模块。

Sticky工作原理: Sticky是nginx的一个模块,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,这样就不会出现session不一致的问题。

sticky下载:https://code.google.com/archive/p/nginx-sticky-module/downloads(需翻墙)

sticky下载:http://static.lushaoming.cn/nginx/nginx-goodies-nginx-sticky-module.zip(无需翻墙)

安装nginx+sticky

# 在nginx源码目录重新安装nginx的时候加上--add-module
./configure ... --add-module=nginx-sticky-module-path
make && make install

安装完成之后,负载均衡配置:

# 可配置多个服务器,此配置在http下
upstream dockerContainer {
    sticky name=sticky_route;
    server 127.0.0.1:8081 weight=10;# 容器1
    server 127.0.0.1:8082 weight=5;# 容器2
}

重启nginx,这样就可以保证同一个客户端请求到了同一台服务器。name表示cookie的名称,可以自己定义,但要确保不跟其他cookie冲突。