大家的网站都难免会遇到验证码的议题,前台后台的登入,都需要有验证码来做登入校验。

因为有些应用的验证码是在系统缓存中产生的,如果你使用的是负载均衡,那可能就会出现和我一样的情况:在验证验证码时,负载均衡在起着作用,用户访问的页面因在两台服务器间承接跳转的,会导致用户一直无法验证成功,所以在负载均衡上需要做sticky session支持,才能解决此问题。

所以我就要着手去处理这个问题。

安装环境及软件版本:

操作系统版本:CentOS 7.2 64bit

负载均衡层:Nginx-1.10.1

服务层:Tomcat 7.0.72

Nginx-sticky-module版本:1.1


因为我之前在负载均衡层Nginx已经编译完成并使用,所以要增加sticky session的话,就需要在Nginx上再安装支持粘性会话的插件即可

在官网上有看到Nginx plus对于应用模块的支持,但是对于开源免费版的Nginx貌似却还没有,所以我们先去下载第三方支持的插件


1.下载地址:

https://Nginx-sticky-module.googlecode.com/files/Nginx-sticky-module-1.1.tar.gz

发现在Nginx-sticky-module中最新的也是2012年出的Nginx-sticky-module-1.1.tar.gz,之后就没有再出过新版了,所以就选择最新版本就好了,Nginx-sticky-module-1.0.tar.gz好像不在支持使用了,而且1.1版本增加了权重的参数.


2.把下载好的安装包放到你想要放置的位置去解压:

我就把它放在经常放置的位置/data0/soft/,然后解压:

[root@soft]# tar -xf Nginx-sticky-module-1.1.tar.gz

在/data0/soft/Nginx-sticky-module-1.1里需要做些准备工作,否则在后续编译Nginx时会报错


为了明确了解看到错误提示,直接进行编译Nginx查看,后续再处理也可以。所以为了方便了解错误,我就直接编译了。


3.在Nginx上安装sticky模块

如果你和我一样之前也安装过Nginx,又不记得曾经安装过哪些模块,但又不想影响原有的模块,有个指令可以帮到你。

就是到你现系统在跑的Nginx目录的sbin里用./Nginx -V查看曾经编译时所用的历史指令

[root@~]# /data0/work/Nginx/sbin/Nginx -V

Nginx version: Nginx/1.10.1

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)

built with OpenSSL 1.0.1e-fips 11 Feb 2013

TLS SNI support enabled

configure arguments:

--prefix=/data0/work/Nginx

--pid-path=/data0/work/Nginx/logs/Nginx.pid

--lock-path=/var/lock/Nginx.lock

--user=Nginx

--group=Nginx

--with-http_ssl_module

--with-http_flv_module

--with-http_stub_status_module

--with-http_gzip_static_module

--http-client-body-temp-path=/var/tmp/Nginx/client/

--http-proxy-temp-path=/var/tmp/Nginx/proxy/

--http-fastcgi-temp-path=/var/tmp/Nginx/fcgi/

--http-uwsgi-temp-path=/var/tmp/Nginx/uwsgi

--http-scgi-temp-path=/var/tmp/Nginx/scgi

--with-pcre

--add-module=/data0/soft/Nginx_upstream_check_module-master/


然后到你需要安装的Nginx源码包当中去,编译语句参照原先的,只要末尾添加sticky session模块--add-module=/data0/soft/Nginx-sticky-module-1.1/即可

[root@~]# cd /data0/work/Nginx-1.10.1

[root@Nginx-1.10.1 ]# ./configure --prefix=/data0/work/Nginx

--pid-path=/data0/work/Nginx/logs/Nginx.pid

--lock-path=/var/lock/Nginx.lock

--user=Nginx --group=Nginx

--with-http_ssl_module --with-http_flv_module

--with-http_stub_status_module

--with-http_gzip_static_module

--http-client-body-temp-path=/var/tmp/Nginx/client/

--http-proxy-temp-path=/var/tmp/Nginx/proxy/

--http-fastcgi-temp-path=/var/tmp/Nginx/fcgi/

--http-uwsgi-temp-path=/var/tmp/Nginx/uwsgi

--http-scgi-temp-path=/var/tmp/Nginx/scgi

--with-pcre

--add-module=/data0/soft/Nginx_upstream_check_module-master/

--add-module=/data0/soft/Nginx-sticky-module-1.1/


接着进行make编译

[root@Nginx-1.10.1 ]# make && make install


发现报错了:

cc1: all warnings being treated as errors

make[1]: *** [objs/addon/Nginx-sticky-module-1.1/ngx_http_sticky_module.o] Error 1

make[1]: Leaving directory `/data0/work/Nginx-1.10.1'

make: *** [build] Error 2


处理办法:

a.根据资料把ngx_http_sticky_misc.c 的281行修改如下即可解决问题

[root@~ ]vim /data0/soft/Nginx-sticky-module-1.1/ngx_http_sticky_misc.c


281 digest->len = ngx_sock_ntop(in,digest->data,len,1);


原digest->len = ngx_sock_ntop(in,digest

->data,1);

改后digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in),1);


b.还要把ngx_http_sticky_module.c 的322行修改如下可解决问题

[root@~ ]vim /data0/soft/Nginx-sticky-module-1.1/ngx_http_sticky_module.c

332 #if defined(Nginx_version) && Nginx_version >= 1009000 ---加

333 iPHP->rrp.current = peer; --加

334 #else --加

335 iPHP->rrp.current = iPHP->selected_peer; --原有内容

336 #endif --加

备注:其实就是找到iPHP->rrp.current = iPHP->selected_peer;在其前后添加内容

接着继续进行make&& make install编译即可

[root@Nginx-1.10.1 ]# make && make install

4.在Nginx的配置文档里配置启用sticky模块功能

因为我是在原有的基础上进行编译安装,且没有更换版本升级,直接安装,所以原有的Nginx.conf配置文件不会被覆盖,只是Nginx的执行档会重新生成一个

那Nginx的upstream如何使用sticky呢,很简单,方法如下:

[root@~]# vim /data0/work/Nginx/conf/Nginx.conf

找到upstream模块添加sticky;

upstream information{

sticky;

server 172.16.22.3:80 max_fails=2 ;

server 172.16.22.4:80 max_fails=2 ;

check interval=3000 rise=2 fall=5 timeout=1000 type=http;

}

注: sticky; 是针对--sticky模块的设定

check interval=3000 rise=2 fall=5 timeout=1000 type=http; 是针对upstream后台健康检查使用,增加模块是Nginx_upstream_check_module-master

当然你还没有安装Nginx_upstream_check_module-master模块,可以先注释掉这个设定。等到后续有需求再进行开启。

5.Nginx sticky其他语法使用说明

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];

name: 可以为任何的string字符,默认是route

domain:哪些域名下可以使用这个cookie

path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡

expires:cookie过期时间,默认浏览器关闭就过期,也就是会话方式。

no_fallbackup:如果设置了这个,cookie对应的服务器挂了,那么将会返回502(bad gateway 或者 proxy error),不建议启用


Nginx sticky expires用法:

upstream information {

sticky expires=1h;

server 172.16.22.3:80 max_fails=2 ;

server 172.16.22.4:80 max_fails=2 ;

}

启用了过期,cookie 1个小时才过期


6.经过上述的相关设定后,便可查看stitcky session的问题是否成功解决

#注:下列谈及的tomcat服务器是在做了集群(即session共享的前提下)

a.重启Nginx服务

先测试配置文件是否准确无误

[root@~ ]# /data0/work/Nginx/sbin/Nginx -t

Nginx: the configuration file /data0/work/Nginx/conf/Nginx.conf Syntax is ok

Nginx: configuration file /data0/work/Nginx/conf/Nginx.conf test is successful

#如果有问题,请按照它给的提示进行查找和修改即可

重启Nginx服务

[root@~ ]# /data0/work/Nginx/sbin/Nginx -s reload


b.为了方便查看,我们就在后端的那两台tomcat服务上设定下

因为我后端是两台tomcat服务器,每台服务器的JESSIONED值都有特殊的标志。

所以在我的两台后端Tomcat服务器上,我都做了些准备工作来方便我辨别,并通过浏览器访问负载均衡层来查看实际是哪一台机器在提供服务。

请到你的tomcat服务器上进行下列操作:

[root@~ ]# vim /data0/work/tomcat01/conf/server.xml

找到里面的第103行

<!-- You should set jvmRoute to support load-balancing via AJP ie :

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

-->

取消掉注释,并修改成如下内容:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat01">

#注:为了好辨别,我就把jvmRoute改成Tomcat01,同样Tomcat02的服务器也做同样的上述操作,不同的是把jvmRoute设置成Tomcat02

在tomcat服务器的发布文档里的编写放置一个index.jsp页面,内容如下:

[root@~ ]# vim /data0/work/tomcat01/webapps/ROOT/jsp/index.jsp

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head>

<title>tomcat01</title>

</head>

<body>

<h1><font color="red">Session serviced by tomcat </font></h1>

<table aligh="center" border="1">

<tr>

<td>Session ID </td>

<td><%=session.getId() %></td>

<% session.setAttribute("abc","adc");%>

</tr>

<tr>

<td>Created on</td>

<td><%=session.getCreationTime() %></td>

</tr>

</table>

</body>

<html>


然而tomcat02服务器做同样的动作,只是把index.jsp页面中tomcat01替换成tomcat02


c.比如172.16.22.3这台是tomcat01,172.16.22.4这台是tomcat02.当你访问http://172.16.22.2/index.jsp页面时,在为开启sticky session模块前,不管怎么刷新访问页面,JESSIONED值都是不变的,但是承载的tomcat会交替变化.

如下图所示:

在tomcat01上承接服务:

wKiom1kUeRjh4vVxAACQ1tuxmno828.png-wh_50

刷新页面后,发现是tomcat02上承接服务,且session ID不变

wKioL1kUed-Dx5HlAACQqTpmBJU159.png-wh_50


但是如果Nginx配置档开启了sticky模块,我们可以看到JESSIONED值也不会发生变化.但无论你怎么刷新,它都死死的粘滞在其中一台tomcat服务器上.

wKioL1kUdkDji4ihAACQqTpmBJU199.png-wh_50

备注:每台后端真实服务器都会有一个唯一的route值,所以不管你真实服务器前端有几个装了sticky的Nginx代理,他都是不会变化的. 这个cookie是会话方式的,所以你浏览器关闭了,服务器会给你重新分配一台服务器。


经过上述操作,发现sticky模块添加成功!

CentOS7.2 负载均衡层nginx-1.10.1增加sticky session模块支持的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  3. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  4. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  5. ios – 200在xcode 7中生成DSMM警告

    解决方法我有同样的问题.Facebook表示他们已经意识到这一点并且不是高优先级,因为它不会影响应用程序.我回退到4.7.1警告问题不再存在.我不认为它会被拒绝但不能确定.

  6. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  7. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

    解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

  8. 我可以在iOS中自定义Twitter工具包的登录按钮吗?

    我已经下载了Twitter工具包框架并添加了用Twitter登录的代码.但是,我不希望登录按钮看起来像那样.我想要一个用于登录的自定义按钮.我能这样做吗?我只想使用这个框架,因为这也适用于iOS系统帐户.解决方法根据document:在按下按钮中添加代码:Objective-C的迅速

  9. xamarin.ios – Facebook iOS SDK:应用程序在启动时找不到“找不到符号:_ACFacebookAppIdKey.”仅在iOS 5中崩溃

    解决方法这是一个已修复的knownbug.目前唯一已知的解决方法是使用较旧版本的FacebookSDK.

  10. ios – AVCaptureSession条形码扫描

    解决方法以下是我所拥有的项目代码示例,可以帮助您走上正确的轨道

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部