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

代码如下:

<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 参数说明:
t
将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。

将会话数据存储到 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了。

首先 在 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如下:

代码如下:

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 代理中的  作业完成。

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

(0)

相关推荐

  • Nginx 的多站点配置方案

    当我们有了一个 VPS 主机以后,为了不浪费 VPS 的强大资源(相比共享主机1000多个站点挤在一台机器上),往往有想让 VPS 做点什么的想法,银子不能白花啊:).放置多个网站或者博客是个不错的想法,可是如何配置 web 服务器才能在一个 VPS 上放置多个网站/博客呢?如何通过一个 IP 访问多个站点/域名呢?这就是大多数 web 服务器支持的 virtual hosting 功能.这里将描述如何一步一步如何用 nginx 配置 virtual hosting. nginx 是一个小巧高效

  • 详解阿里云nginx服务器多站点的配置

    阿里云nginx服务器多站点的配置 今天配置了一下多站点,记录一下配置的过程... 1.首先要找到nginx 配置文件之所在,阿里云上的nginx.conf 文件上 /alidata/server/nginx-1.4.4/conf 中. 2.然后在conf目录下创建一个vhosts 目录,  这个目录是用来存放不同站点的配置文件的. 3.然后呢, 在nginx.conf 最后 加入一行 include /alidata/server/nginx/conf/vhosts/*.conf; user

  • 详解Nginx配置多站点需要踩的坑

    从Windows下的Apache转移到Linux下的Nginx,发现有很多坑需要踩. 以下就做个简单的记录,方便后来者爬坑. 配置Nginx,一般会遇到以下几个坑: 配置nginx支持pathinfo模式 - 优化URL,隐藏index.php - 同一服务器配置多站点 配置pathinfo模式 在server(也就是你的站点,一个server对应一个站点)中输入以下内容: location ~ ^(.+\.php)(.*)$ { root html/[站点目录]; #配置站点目录路径 fast

  • nginx 多站点配置方法集合

    那么我们开始吧: 1.为我们的站点创建配置文件 我是这么做的,在nginx的配置文件conf目录下创建一个专门存放VirtualHost的目录,命名为vhosts_conf,可以把虚拟目录的配置全部放在这里.在里面创建名为vhosts_modoupi_websuitA.conf的配置文件并打开,我们在这里做配置,往里面写: 复制代码 代码如下: server { listen 80; #监听的端口号 server_name websuitA.com; #域名 #access_log logs/h

  • Nginx一个IP如何配置多个站点的方法教程

    前言 对于Nginx,一个IP上配置多个站点还是很常见的.尤其是在开发环境上,更是如此. 下面在我的阿里云上简单的实现这样一个需求: 在一个IP上通过对端口区分来配置多个站点. 环境初始化目录一览配置站点准备添加配置文件疑难杂项fastcgi_passNginxphp-fpm的进程间通信有两种方式总结 环境 手头上正好有一台阿里云学生机,趁着没过期,就拿来用吧. 操作系统:centOS7 php-fpm Nginx 初始化 在centos上搭建php-fpm+nginx环境不是很难,网上有很多的

  • Nginx 多站点配置实例详解

    Nginx 多站点配置实例详解 在一台 VPS 上,我们有时候需要同时跑几个 virtualenv.比如 virtualenv app1 跑的是 Django 的一个应用,而 virtualenv app2 跑的是 Tornado.那么如何配置 Nginx,让它同时支持这两个 virtualenv 的运行呢? 首先是 Nginx 的主配置,位于 etc/nginx/ngnix.conf,让它保持默认就行: user nginx; worker_processes 1; error_log /va

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

    多站点共享Session常见的作法有: •使用.net自动的状态服务(Asp.net State Service); •使用.net的Session数据库: •使用Memcached. •使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下): 这里我们就 演练一下 以数据库的形来存储Session,来实现多站点共享Session. 首先我们 建好一下站点,如下图: Default.aspx 其中 有二个Button  ,SetSession 主要是用于给一个 S

  • nginx+tomcat实现负载均衡,使用redis session共享

    环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum -y install openssl openssl-devel #注意 : 安装nginx必须使用 root 用户安装 #创建一个nginx目录 mkdir /usr/local/src/nginx #进入到

  • Nginx负载均衡详细介绍

    如果只有一台服务器时,这个服务器挂了,那么对于网站来说是个灾难.因此,这时候的负载均衡就会大显身手了,它会自动剔除挂掉的服务器. 下面简单的介绍下我使用Nginx做负载的体会 下载---安装Nginx这些不介绍了,前篇有介绍. windows和Linux下配置Nginx负载的写法一样,故不分开介绍. Nginx负载均衡一些基础知识: nginx 的 upstream目前支持 4 种方式的分配 1).轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.

  • Nginx 负载均衡算法及故障转移解析

    概述 Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡.故障转移.失败重试.容错.健康检查等. 当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器). 配置 upstream backServer{ server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name www.itmayiedu.com; location / { #

  • Nginx负载均衡以及动静分离的原理与配置

    目录 一.Nginx实现负载均衡原理 二.Nginx动静分离原理 Nginx 静态处理优势 三.Nginx + Tomcat 动静分离.负载均衡配置步骤 环境准备: 动静分离配置 Nginx 负载均衡模式 总结 一.Nginx实现负载均衡原理 Nginx实现负载均衡是通过反向代理实现 Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发. 但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat

  • nginx 负载均衡轮询方式配置详解

    一.概述 Nginx的upstream目前支持的分配算法:1.round-robin 轮询1:1轮流处理请求(默认)每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继续轮询.2.weight 权重(加权轮询)通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况.3.ip_hash 哈希算法每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题.应用服务器如果故障需要手工down掉

  • Nginx负载均衡之upstream模块简介与使用详解

    目录 一.upstream模块简介 二.负载均衡算法简介 1.轮询 2.权重轮询 3.IP哈希 4.最小连接数 5.最短响应时间 6.url_hash算法 三.配置示例 四.负载均衡效果展示 1.部署2个web服务器 2.配置nginx服务 3.配置域名解析 4.访问域名验证 5.停止s142的web服务后再次访问 6.修改调度算法为轮询 总结 一.upstream模块简介 Nginx的负载均衡功能依赖于ngx_http_upsteam_module模块,所支持的代理方式包括proxy_pass

  • 浅析Nginx 负载均衡4种模式

    4 种负载均衡算法 upstream 支持4种负载均衡调度算法: A)轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器; B)ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器.可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题. C)url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器.后台服务器为缓存的时候效率. D)fair:这是比上面两个更加智能的负载均衡算法.此种算法可以依据

  • 基于Docker部署Tomcat集群、 Nginx负载均衡的问题小结

    写在前面 看完Dokcer相关的书籍,正好有个项目要这样搞,所以自己练习一下. 当作一百世一样.这里的道理很明白:我思故我在,既然我存在,就不能装作不存在.无论如何,我要为自己负起责任.--王小波<三十而立> 结构图: 这里仅作为一种学习,一般这种负载的话,Nginx是放到主机侧的, JavaWeb(Tomcat)应用放到容器里. 效果 新建文件夹. D=uag;mkdir $D;cd $D;mkdir uag_nginx uag_tomcat8; ls uag_nginx uag_tomca

  • 超级详细的nginx负载均衡配置

    目录 前言 实验准备 实验步骤 其他负载均衡配置策略 总结 前言 nginx作为一款企业级的代理服务器,不管是大中小各类生产项目中,均有广泛的使用,尤其是在前后端分离的项目中,nginx作为路由转发的功能是非常常用的: 在一些流量比较大的项目中,为了应对高并发的场景,后端服务往往采用集群部署,这时候,就需要使用到nginx的负载均衡功能: 实验准备 nginx服务器: 两个后端服务: 实验步骤 1.启动两个后端服务 这里准备了两个springboot工程,编写了2个测试使用的接口,以端口号区分

随机推荐