一种基于nginx服务器生成会话ID的方法与流程

文档序号:15980351发布日期:2018-11-17 00:15阅读:783来源:国知局
本发明涉及web开发
技术领域
,涉及一种基于nginx服务器生成会话id的方法。
背景技术
nginx是一个高性能的http服务器和反向代理服务器。被淘宝、网易、新浪等大量互联网公司使用。现在在开发中有需求,系统需要提供会话id,用于追踪用户,从而方便分析用户行为、做a/b测试。在通常的分布式解决方案中,生成和校验会话id由后端应用服务器负责。nginx通过接口调用后端应用服务器完成会话id生成、校验。该方案调用环节比较多,系统内部网络开销大,需要的硬件资源多。技术实现要素:为解决上述问题,本发明公开了基于nginx服务器生成会话id的方法,以nginx相应插件的形式,能够快速生成不容易被伪造的会话id。为了达到上述目的,本发明提供如下技术方案:一种基于nginx服务器生成会话id的方法,包括如下步骤:步骤一,集群内部生成非重复序列,序列包括:nginx实例id、时间戳、计数器,nginx实例id具有唯一性;步骤二,对步骤一生成的序列使用crc32算法进行运算,得到一个整数结果,该结果与redis的节点个数做模运算,得到的结果作为redis节点id;步骤三,将有效期写入会话id;步骤四,拼接序列、redis节点id、有效期,并使用base64算法进行运算即得到会话id的数值部分;步骤五,拼接会话id的数值部分、客户端的user-agent、客户端ip、服务器端密码,然后按照字符升序排序,最后使用md5算法进行运算,运算结果即为校验码;步骤六,拼接步骤四生成的会话id数值部分和步骤五生成的验证码,得到最终的会话id。作为改进,还包括会话id校验方法,包括如下过程:收到客户端的请求时,截取会话id末尾的128bit校验码,则其余部分为会话id的数值部分;对会话id的数值部分使用base64算法解码,对解码后的数据进行如下操作:校验会话id是否过期:取第1位至第40位,计算出生效时间;取出第69位至76位,计算出有效期;如果生效时间+有效期<当前时间,则会话过期;校验会话id是否被伪造篡改:将会话id的数值部分跟客户端ip、客户端user-agent拼接,计算md5码,并将结果与会话id中的校验码比对,判断是否相同;如果相同,表示会话id正确;如果不相同,则表示会话id是伪造的,或被篡改,抛出错误;校验会话id有效性:截取第65至68位,获得redis节点id,根据redis节点id,从对应的redis存储节点查询该会话id,如果查询到数据,说明会话id有效,否则说明该会话id无效。进一步的,计数器当前值保存在共享内存中,单台nginx服务器上所有worker进程共享该计数器。与现有技术相比,本发明具有如下优点和有益效果:本发明在nginx上实现了会话id的生成与校验功能,降低了系统内部网络开销,减少后端应用服务器的压力,减少了硬件消耗,提高了系统吞吐量,实现了资源的合理利用。附图说明图1为生成会话id的流程图。图2为服务器接收到客户端传过来的会话id后进行校验的流程图。具体实施方式以下将结合具体实施例对本发明提供的技术方案进行详细说明,应理解下述具体实施方式仅用于说明本发明而不用于限制本发明的范围。另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。本发明提供的基于nginx服务器生成会话id的生成方法,如图1、图2所示,具体包括如下步骤:步骤一,集群内部非重复序列生成方案:序列通过以下元素组成:nginx实例id、时间戳(毫秒级)、计数器。字段名长度时间戳40bitnginx实例id4bit计数器20bit其中时间戳的计算方式为:当前时间-2016年1月1日零点零分零秒。40bit存储的数据可以支持到2050年;nginx实例id长度为4bit,id范围:[0,15]。最多支持16台nginx;为集群中每一个nginx服务器分配一个唯一的id,用该id作为序列的一部分。序列中结合计数器,保证序列的唯一性。计数器长度为20bit,范围:[0,1048575],即,每毫秒最多生产104万个id。当计数器到达上限时,等待1毫秒。然后清零,重新计算。计数器当前值保存在共享内存中。单台nginx服务器上所有worker进程可以共享该计数器。步骤二,将会话id放到多redis集群上.将redis节点的id嵌入会话id,在大数据情况下,通过提取会话id嵌入的存储节点id,能够根据节点id直接查询相应的redis数据库,可以提高会话id的查询效率。通过对步骤一生成的序列使用crc32算法进行运算,即可得到一个整数结果,该结果与redis的节点个数做模运算,得到的结果即为redis节点id。redis节点id格式为:字段名长度redis节点id4bit步骤三,将有效期写入会话id,减少服务器内存开销。有效期格式为:字段名长度取值范围类型2bit0-分;1-小时;2-天;3-月值6bit0~64共8bit。可以表示的范围为:1至64分1至64小时1至64天1至64个月比如:有效期二进制整数1分钟0000000115分钟0000010151小时01000001658小时01001000721天100000011292天100000101307天100001111351月11000001193步骤四,生成会话id的数值部分。拼接序列、redis节点id、有效期,并使用base64算法进行运算即得到会话id的数值部分。本步骤将数据转成base64格式,能够减少会话id长度。步骤五,生成验证码。拼接会话id的数值部分、客户端的user-agent、客户端ip、服务器端密码,然后按照字符升序排序,最后使用md5算法进行运算,运算结果即为校验码。使用校验码能防止会话id被伪造。步骤六,生成成会话id。拼接步骤四生成的会话id数值部分和步骤五生成的验证码,即得到最终的会话id。会话id生成后,存储进mod_x对应的redis数据库中,存储成功后,返回给客户端。步骤七,验证客户端传过来的会话id。收到客户端的请求时,截取会话id末尾的128bit校验码,则其余部分为会话id的数值部分。nginx上可以直接对会话id做以下校验:1.会话id是否过期2.会话id是否被篡改、是否伪造。校验方法:首先将会话id的数值部分使用base64算法解码,以下的取位操作都是对解码后的数据进行操作。1.校验会话id是否过期取第1位至第40位,计算出生效时间;取出第69位至76位,计算出有效期。如果生效时间+有效期<当前时间,则会话过期。2.校验会话id是否被篡改、是否伪造将会话id的数值部分跟客户端ip、客户端user-agent拼接,计算md5码,并将结果与会话id中的校验码比对,判断是否相同。如果相同,正确;如果不相同,会话id是伪造的,或被篡改,抛出错误。3.校验会话id的有效性截取第65至68位,获得redis节点id,根据redis节点id,从对应的redis存储节点查询该会话id,如果查询到数据,说明会话id有效,否则该会话id无效。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。本发明方案所公开的技术手段不仅限于上述实施方式所公开的技术手段,还包括由以上技术特征任意组合所组成的技术方案。应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1