在我们做Nginx负载均衡的时候经常会遇到会话保持的问题,为了保证同一用户session会被分配到同一台服务器上,这时就需要会话保持,本文介绍了两种方法,感兴趣的可以了解一下
前言
我们在做Nginx负载均衡的时候,经常会遇到会话保持的问题。为了确保相同用户的会话将被分配到相同的服务器,此时需要会话保持。我们通常使用基于ip_hash的会话保持和基于cookie的会话保持。
一、基于ip_hash的会话保持
负载均衡Nginx时,可以在上游设置ip_hash。每个请求根据ip访问的哈希结果进行分配,并映射到一个固定的服务器。当后端服务器关闭时,会话将丢失,当再次发出请求时,它将重新修复对另一个标准服务器的访问并保持会话。缺点是同一个IP客户端总是访问一个后端服务器,可能会导致负载不均衡。下面是ip_hash的会话保持格式。
这里假设所有后端服务器都正常运行。
在Nginx代理服务器(负载均衡服务器)中配置:===========================================upstream test { ip_hash; server 10.20.151.112:80; server 10.20.151.113:80;}
至于为什么这里会返回这个结果,我的博客里有关于Nginx中负载均衡的具体配置操作。有兴趣的可以看看。所以不难看出,我在使用ip_hash时,实现了会话保持,即客户端会访问112这个后端服务器(除非这个服务器宕机)并且即使页面再次刷新,也不会返回其他后端服务器的内容(注:实际生产中,后端服务器返回给请求客户端的内容是一样的,这只是为了测试结果)。
假设具有固定访问权限的服务器关闭。
二、基于cookie的会话保持
该方法将用户的会话存储在cookie中。当用户被分配到不同的服务器时,首先判断服务器是否有用户的会话。如果没有,首先将会话存储在服务器的cookie中,以便维护会话。缺点是存储cookies有安全隐患。例如,黑客可能会获取您的cookies来获取您的相关信息。这样就需要添加sticky_cookie_insert模块,这个模块和ip_hash的区别在于它判断客户端不是基于ip,而是基于cookie。
添加粘性模块(我用yum安装了Nginx)
yum install -y pcre* openssl* gcc gcc-c++ make --安装编译环境wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip --下载sticky模块nginx -v --查看Nginx版本,因为要下载和yum安装nginx对应版本的源码包wget http://nginx.org/download/nginx-1.18.0.tar.gzyum install -y unzip --安装解压工具unzip 08a395c66e42.zip --解压模块包mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng/ --改名tar xzvf nginx-1.18.0.tar.gz -C /usr/local/ --解压nginx的源码包cd /usr/local/nginx-1.18.0/nginx -V --查看yum安装nginx所有模块======================================================================================./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/root/nginx-sticky-module-ng======================================================================================make amp;amp; make installNginx -V --再次查看Nginx模块,添加成功
在代理服务器(负载平衡服务器)中配置
vim upstream.conf --在子配置文件conf.d中创建upstream.conf=====================================================================================upstream qfedu { server 192.168.198.143; server 192.168.198.145; sticky;}vim proxy.conf ----在子配置文件conf.d中创建proxy.conf=====================================================================================server { listen 80; server_name localhost; location / { proxy_pass http://testweb; }}nginx -t --检查配置文件语法是否有错nginx -s reload --重新加载配置文件
请访问http://10.20.151.240/
总结
一般来说,维护NGX会话有两种方式:基于ip_hash和基于cookie。Nginx会话虽然可以让一个ip客户端访问一个固定的后端服务器,但是可能会导致负载不均衡。当使用cookie来保持会话时,需要引入第三方模块(sticky module)。使用sticky_cookie_insert启用会话关联性,这将导致来自同一客户端的请求被传递到一组服务器中的同一服务器。这种方法可以避免上述ip_hash中来自同一局域网的客户端和前端代理造成的负载不均衡。使用后端服务器本身通过相关机制保持会话同步,如数据库、redis、memcached等。用于会话复制。
关于Nginx会话保持的两种方式的文章到此结束。关于Nginx会话保持的更多信息
精彩评论