nginx负载均衡,多站点共享Session

运维 系统运维
多站点共享Session有很多方法,本文将演练一下以数据库的形式存储Session,来实现多站点共享Session。

  多站点共享Session常见的做法有:

  • 使用.net自动的状态服务(Asp.net State Service);
  • 使用.net的Session数据库;
  • 使用Memcached。
  • 使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下);

  这里我们就演练一下以数据库的形式存储Session,来实现多站点共享Session。

  首先我们建好一下站点,如下图:

 

Default.aspx

  其中,有二个Button,SetSession 主要是用于给一个 Session 赋值(如:Session["ShareValue"] = “abcd”) ,

  GetSession 主要就是获得 一个 Session 值。

  具体代码如下:

 

  代码部分就这么多就行了…

  下面就是要配置一下 Web.config了 , 其实主要就是在 <system.web>

  这个节点中 增加 machineKey 及 sessionState 这两个节点,

  1.增加machineKey 主要作用是:

  “按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”也就是说Asp.Net的很多加密,都是依赖于machineKey里面的值,例如Forms 身份验证 Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。“ ,具体可以查一下其它资料。

  2.增加 sessionState 主要是让 Session 保存在数据库中。

  具体配置如下:

  1. <machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54" 
  2.                 decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046" 
  3.  
  4.    validation="SHA1" decryption="AES"/>   
  5.  
  6.  <sessionState mode="SQLServer" sqlConnectionString="Data Source=PC-07195;Initial Catalog=AWBUISession;Persist Security Info=True;User ID=jins;Password=js@#$1234" allowCustomSqlDatabase="true" cookieless="false" timeout="100"/> 

  网站部分 这样就好了。。。 下面就是要配置据库了…..

  数据库配置:

  使用aspnet_regsql.exe工具

  ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的"系统根目录\Microsoft.NET\Framework\版本号"文件夹中.

  使用举例:

  aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p

  -S参数:

  表示数据库实例名称. 可以用"."表示本机.

  -U和-P参数:

  表示用户名和密码.

  -E参数:

  可以再-U –P 与 -E中选择一组. –E表示以当前系统用户通过windows身份验证登录数据库, -U -P则是使用SqlServer用户登录数据库.

  -ssadd / –ssremove 参数:

  -ssadd表示是添加Session数据库, -ssremove表示移除Session数据库.

  sstype 参数说明:

  我的设置是:aspnet_regsql.exe -S . - E -d AWBUISession -ssadd -sstype c

  好了。基本的 我们就已经搞定了。。

  现在 我们分别把我们刚建的一个网站 部署 到 IIS 中。不过我们既然要负载。至少也的部署两份。

  我们把 其中一个 服务器中的 defaut.aspx 中 “服务器 1” 改成 “服务器 2” ,这样做的主要目地是 做一下 区别!

  具体如下:

  两个网站的 URL分别是:

  server 1:127.0.0.1:8081;

  server 2:127.0.0.1:8080;

  OK。下面我们就是 配置 Nignx了。

  首先 在 nginx\conf 配置  文件中找到 nginx.conf 这个文件 ,就记事本打开,

  做如上的 设置:

  OK。  nginx  这样配置 就算OK 了。 我们启动一下 nginx ..

  在浏览器中 输入我们 在 nginx 中配置的 URL 如:127.0.0.1:8090

  我们会看到 服务器 1 已经开始为我们服务了,我们再点一下 “SetSession”来设置一下一个 会话值,

  我们会看到 服务器 2 开始 工作。这时我们再点一下 “GetSesion”看一下 刚才在 服务器 1 设置 的会话值,结果如下 :

  出现这种情况 ,主要就是在数据库中存储 一个会话时 没有做到 服务器1 和服务2的Session 共享,主要是在:

  ASPStateTempSessions 这个表中的 一个SessionID ,

  其中的SessionId包括两个部分:网站生成的24位SessionID及8位AppName对于不同的站点,其AppName不同,在能够在不同站点下使24位SessionID相同的情况下,要保证经过组合加上AppName后的SessionID相同,可以通过修改存储过程TempGetAppID,使其得到的SessionID与AppName无关,修改TempGetAppID如下:

  1. ALTER PROCEDURE [dbo].[TempGetAppID]  
  2.  
  3.     @appName    tAppName,  
  4.  
  5.     @appId      int OUTPUT  
  6.  
  7.     AS  
  8.  
  9.     SET @appName = 'Test' --LOWER(@appName) 修改这里,使多个站点的APPname ,为一个固定值。  
  10.  
  11.     SET @appId = NULL 
  12.  
  13.    
  14.  
  15.     SELECT @appId = AppId 
  16.  
  17.     FROM [AWBUISession].dbo.ASPStateTempApplications  
  18.  
  19.     WHERE AppName = @appName   
  20.  
  21.     IF @appId IS NULL BEGIN  
  22.  
  23.         BEGIN TRAN    
  24.  
  25.         SELECT @appId = AppId 
  26.  
  27.         FROM [AWBUISession].dbo.ASPStateTempApplications WITH (TABLOCKX)  
  28.  
  29.         WHERE AppName = @appName         
  30.  
  31.         IF @appId IS NULL  
  32.  
  33.         BEGIN  
  34.  
  35.             EXEC GetHashCode @appName, @appId OUTPUT             
  36.  
  37.             INSERT [AWBUISession].dbo.ASPStateTempApplications  
  38.  
  39.             VALUES  
  40.  
  41.             (@appId, @appName)             
  42.  
  43.             IF @@ERROR = 2627 
  44.  
  45.             BEGIN  
  46.  
  47.                 DECLARE @dupApp tAppName             
  48.  
  49.                 SELECT @dupApp = RTRIM(AppName)  
  50.  
  51.                 FROM [AWBUISession].dbo.ASPStateTempApplications  
  52.  
  53.                 WHERE AppId = @appId  
  54.  
  55.                 RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.',  
  56.  
  57.                             18, 1, @appName, @dupApp)  
  58.  
  59.             END  
  60.  
  61.         END  
  62.  
  63.         COMMIT  
  64.  
  65.     END  
  66.  
  67.     RETURN 0                         

  经过以上修改之后,下面要实现多个站点共用同一个SessionID.

  重启一下各站点。再在浏览一下网站:

  点 “SetSession”,

  再点:“GetSession” ,

  可以看到  服务器1 和服务器 2 返回的是相同的结果,达到了 “多站点共享Session”

  附加一点: Session 过期删除,主要是 在 SQL server 代理中的作业完成。

  具体的可以,查一下其它相关资料。

责任编辑:黄丹 来源: cnblogs.com
相关推荐

2010-03-24 10:35:02

Nginx负载均衡器

2013-04-22 11:29:14

Nginx

2012-07-31 09:25:42

nginx负载均衡反向代理

2017-12-13 15:33:02

LinuxNginxTomcat

2010-05-06 15:24:35

Tomcat负载均衡

2011-12-02 22:51:46

Nginx负载均衡

2010-05-07 12:23:23

nginx负载均衡

2011-01-07 11:14:17

Nginx负载均衡负载均衡

2014-07-28 11:37:49

NginxTomcat

2010-05-05 22:51:24

2010-05-06 10:01:26

nginx负载均衡

2011-09-01 10:23:47

Nginx负载均衡器负载均衡

2017-12-18 12:04:02

Nginx代理均衡

2010-05-07 12:27:53

nginx负载均衡

2010-03-25 18:52:15

Nginx负载均衡

2019-06-24 15:58:53

TCPUDPNginx

2019-11-04 15:35:53

Nginx反向代理负载均衡

2017-11-09 10:42:11

Nginx负载均衡策略

2019-09-18 10:39:08

负载均衡反向代理TCP

2020-07-28 15:10:34

Nginx反向代理负载均衡
点赞
收藏

51CTO技术栈公众号