设为首页 收藏本站
查看: 1496|回复: 0

[经验分享] Nginx在windows下配合IIS搭建负载均衡多站点共享Session

[复制链接]

尚未签到

发表于 2017-12-27 23:51:24 | 显示全部楼层 |阅读模式
多站点共享Session常见的作法有:


  • 使用.net自动的状态服务(Asp.net State Service);
  • 使用.net的Session数据库;
  • 使用Memcached。
  • 使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下);
  这里我们就 演练一下 以数据库的形来存储Session,来实现多站点共享Session。
  首先我们 建好一下站点,如下图:
DSC0000.png

  Default.aspx
DSC0001.png

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

  ) ,
  GetSession 主要就是获得 一个 Session 值。
  具体代码如下:
DSC0002.png

  代码部分就这么多就行了…
下面就是要配置一下 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 保存在数据库中。

具体配置如下:

<machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54"

                decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046"

   validation="SHA1" decryption="AES"/>


<sessionState mode="SQLServer" sqlConnectionString="Data Source=PC-07195;Initial Catalog=AWBUISession;Persist Security Info=True;User>

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


数据库配置:

使用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 参数说明:

t

将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。

p

将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。

c

将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。

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


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

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


DSC0003.png

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

具体如下:

DSC0004.png

两个网站的 URL分别是:

server 1:127.0.0.1:8081;

server 2:127.0.0.1:8080;

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


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

DSC0005.png

做如上的 设置:

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

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

DSC0006.png

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


DSC0007.png

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

DSC0008.png


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

DSC0009.png

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.


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

DSC00010.png

点 “SetSession”,

DSC00011.png


再点:“GetSession”

DSC00012.png

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


我们 再点:“GetSession”,

DSC00013.png


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

  具体的可以,查一下其它相关资料.
  原文链接:http://www.cnblogs.com/red-fox/archive/2012/11/05/2755271.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428790-1-1.html 上篇帖子: .net IIS网站部署Host文件简单应用 下篇帖子: 【先定一个小目标】Asp.net Core 在IIS上的托管运行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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