Nginx在windows下配合IIS搭建负载均衡多站点共享Session|后台服务器|码途山海.智隐长卷 -

程序人生|重庆纽新

找回密码
立即注册

QQ登录

只需一步,快速开始

欢迎访问【程序人生-重庆纽新】,本网站为软件开发人员视觉的IT资讯、软件开发中各种问题的解决办法!!
搜索
发新帖


2308

积分

0

好友

259

主题
楼主
发表于 2015-4-13 09:25:30 | 查看: 880| 回复: 0
多站点共享Session常见的作法有:
  • 使用.net自动的状态服务(Asp.net State Service);
  • 使用.net的Session数据库;
  • 使用Memcached。
  • 使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下);
这里我们就 演练一下 以数据库的形来存储Session,来实现多站点共享Session。
首先我们 建好一下站点,如下图:

Default.aspx

其中 有二个Button  ,SetSession 主要是用于给一个 Session 赋值(如:Session["ShareValue"] = “abcd”
) ,
GetSession 主要就是获得 一个 Session 值。
具体代码如下:
  
代码部分就这么多就行了…

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



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

数据库配置:
使用aspnet_regsql.exe工具
ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的"系统根目录Microsoft.NETFramework版本号"文件夹中.
使用举例:
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 参数说明:
t
将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。
p
将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。
c
将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。
我的设置是: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了。

首先 在 nginxconf 配置  文件中找到 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如下:
ALTER PROCEDURE [dbo].[TempGetAppID]
    @appName    tAppName,
    @appId      int OUTPUT
    AS
    SET @appName = 'Test' --LOWER(@appName) 修改这里,使多个站点的APPname ,为一个固定值。
    SET @appId = NULL

    SELECT @appId = AppId
    FROM [AWBUISession].dbo.ASPStateTempApplications
    WHERE AppName = @appName
    IF @appId IS NULL BEGIN
        BEGIN TRAN  
        SELECT @appId = AppId
        FROM [AWBUISession].dbo.ASPStateTempApplications WITH (TABLOCKX)
        WHERE AppName = @appName      
        IF @appId IS NULL
        BEGIN
            EXEC GetHashCode @appName, @appId OUTPUT           
            INSERT [AWBUISession].dbo.ASPStateTempApplications
            VALUES
            (@appId, @appName)           
            IF @@ERROR = 2627
            BEGIN
                DECLARE @dupApp tAppName           
                SELECT @dupApp = RTRIM(AppName)
                FROM [AWBUISession].dbo.ASPStateTempApplications
                WHERE AppId = @appId
                RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.',
                            18, 1, @appName, @dupApp)
            END
        END
        COMMIT
    END
    RETURN 0                        
经过以上修改之后,下面要实现多个站点共用同一个SessionID.

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

点 “SetSession”,


再点:“GetSession”

这样 我们就看到 服务器2 给出了我们 刚才在 服务器 1 中设置 的会话值了。

我们 再点:“GetSession”,


可以看到  服务器1 和服务器 2 返回的是相同的结果,达到了 “多站点共享Session”
附加一点: Session 过期删除,主要是 在 SQL server 代理中的  作业完成。

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


收藏回复 只看该作者 道具 举报

高级模式
B Color Image Link Quote Code Smilies



QQ|小黑屋| 码途山海.智隐长卷 渝ICP备15002301号-2   渝公网安备50011202504426

GMT+8, 2025-5-18 02:57 , Processed in 0.047628 second(s), 27 queries .

©Copyright 程序人生!

©2012-2015重庆纽新

快速回复 返回顶部 返回列表