服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - Nginx - nginx 负载均衡 多站点共享Session

nginx 负载均衡 多站点共享Session

2019-10-12 12:24nginx教程网 Nginx

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

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

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

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

nginx 负载均衡 多站点共享Session

Default.aspx 

nginx 负载均衡 多站点共享Session

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

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

具体代码如下:

nginx 负载均衡 多站点共享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 保存在数据库中。 
具体配置如下: 

复制代码代码如下:


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

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

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

将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。 
我的设置是:aspnet_regsql.exe -S . - E -d AWBUISession -ssadd -sstype c 

好了。基本的 我们就已经搞定了。。 
现在 我们分别把我们刚建的一个网站 部署 到 IIS 中。不过我们既然要负载。至少也的部署两份。 

nginx 负载均衡 多站点共享Session

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

具体如下:

 nginx 负载均衡 多站点共享Session

两个网站的 URL分别是:

 server 1:127.0.0.1:8081;

server 2:127.0.0.1:8080;   

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

 

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

nginx 负载均衡 多站点共享Session

做如上的 设置:

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

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

nginx 负载均衡 多站点共享Session

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

 

nginx 负载均衡 多站点共享Session

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

nginx 负载均衡 多站点共享Session

 

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

nginx 负载均衡 多站点共享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. 

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

nginx 负载均衡 多站点共享Session

点 “SetSession”, 

nginx 负载均衡 多站点共享Session

 

再点:“GetSession” 

nginx 负载均衡 多站点共享Session

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

 

我们 再点:“GetSession”, 

nginx 负载均衡 多站点共享Session

 

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

 

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

nginx 负载均衡 多站点共享Session

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

延伸 · 阅读

精彩推荐
  • Nginx利用nginx和腾讯云免费证书制作https的方法

    利用nginx和腾讯云免费证书制作https的方法

    这篇文章主要介绍了利用nginx和腾讯云免费证书制作https的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    dalaoyang5992019-12-30
  • Nginxnginx rewrite 伪静态配置参数和使用例子

    nginx rewrite 伪静态配置参数和使用例子

    nginx下伪静态配置参数详细说明,使用nginx的朋友,nginx rewrite 伪静态配置参数和使用例子 附正则使用说明 ...

    服务器之家3102019-10-08
  • Nginx如何优化Nginx的处理性能

    如何优化Nginx的处理性能

    Nginx是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性,在连接高并发的情况下,Nginx是Apache服务不错的替代品。其特点是占有内存少,...

    Dockone.io5142020-12-11
  • NginxNginx Rewrite使用场景及代码案例详解

    Nginx Rewrite使用场景及代码案例详解

    这篇文章主要介绍了Nginx Rewrite使用场景及代码案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    盗哥泡茶去了11862020-09-27
  • NginxNginx动静分离实现案例代码解析

    Nginx动静分离实现案例代码解析

    这篇文章主要介绍了Nginx动静分离实现案例代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    盗哥泡茶去了3382020-09-27
  • Nginxnginx ssl免密码重启教程详解

    nginx ssl免密码重启教程详解

    这篇文章给大家介绍了nginx 如何启动以及nginx ssl 免密码重启 的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧 ...

    mrr4272019-11-19
  • Nginx通过Nginx规则重写URL去掉index.php不显示index.php

    通过Nginx规则重写URL去掉index.php不显示index.php

    Nginx不仅占用内存少,并发能力强,而且拓展功能丰富,可以通过安装模板来强化功能,也能通过规则优化,优化服务器并发处理能力,是建站的不二之选...

    Genius日记5872020-10-16
  • NginxNginx location 和 proxy_pass路径配置问题小结

    Nginx location 和 proxy_pass路径配置问题小结

    本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程,本文给大家介绍Nginx location 基本配置及相关配...

    自由早晚乱余生18742021-09-24