.Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(三)

.Net 站点使用Redis存储Session信息,借助Redis实现多个站点公用Session信息

1.新建一个web项目,我新建的是一个空的MVC的项目。

新建好之后添加Home控制器,新建Index Action方法和View视图文件。

2.使用NuGet添加RedisSessionStateProvider这个引用。

安装完成之后会自动添加三个引用:

Microsoft.Web.RedisSessionStateProvider

StackExchange.Redis.StrongName

StackExchange.Redis

Web.config 会自动添加如下的配置文件

<sessionState mode="Custom" customProvider="MySessionStateStore">
      <providers>
        <!-- For more details check https://github.com/Azure/aspnet-redis-providers/wiki -->
        <!-- Either use ‘connectionString‘ OR ‘settingsClassName‘ and ‘settingsMethodName‘ OR use ‘host‘,‘port‘,‘accessKey‘,‘ssl‘,‘connectionTimeoutInMilliseconds‘ and ‘operationTimeoutInMilliseconds‘. -->
        <!-- ‘throwOnError‘,‘retryTimeoutInMilliseconds‘,‘databaseId‘ and ‘applicationName‘ can be used with both options. -->
        <!--
          <add name="MySessionStateStore"
            host = "127.0.0.1" [String]
            port = "" [number]
            accessKey = "" [String]
            ssl = "false" [true|false]
            throwOnError = "true" [true|false]
            retryTimeoutInMilliseconds = "5000" [number]
            databaseId = "0" [number]
            applicationName = "" [String]
            connectionTimeoutInMilliseconds = "5000" [number]
            operationTimeoutInMilliseconds = "1000" [number]
            connectionString = "<Valid StackExchange.Redis connection string>" [String]
            settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return ‘connectionString‘ value>" [String]
            settingsMethodName = "<Settings method should be defined in settingsClass. It should be public, static, does not take any parameters and should have a return type of ‘String‘, which is basically ‘connectionString‘ value.>" [String]
            loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]
            loggingMethodName = "<Logging method should be defined in loggingClass. It should be public, static, does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]
          />
        -->
        <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="" accessKey="" ssl="true" />
      </providers>
    </sessionState>

host改为你的redis服务所在的ip地址,我的是127.0.0.1,ssl给为false,端口号如果不是默认的端口,就自行修改port="XXXX"。

3.在Index方法中添加Session的测试代码测试Redis保存数据是否成功。如果保存的是复杂类型,要加上可序列化标签[Serializable],如下是我的测试代码

public class HomeController : Controller
    {
        private static string _webSiteStr;

        public static string WebSite
        {
            get
            {
                if (string.IsNullOrWhiteSpace(_webSiteStr))
                {
                    _webSiteStr = System.Configuration.ConfigurationManager.AppSettings["WebSite"];
                }
                return _webSiteStr;
            }
        }
        // GET: Home
        public ActionResult Index()
        {
            System.Web.HttpContext.Current.Session["firstTest"] = "1231";
            Student p = new Student()
            {
                 Age=26,Name="liuyu7177"
            };
            System.Web.HttpContext.Current.Session["Student"] = p;
            return View();
        }
        // GET: Home
        public ContentResult Two()
        {
            var str = (string)System.Web.HttpContext.Current.Session["firstTest"] + WebSite;
            var p = (Student)System.Web.HttpContext.Current.Session["Student"];
            return Content(str);
        }
    }

    [Serializable]
    public class Student
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }

其中WebSite这个静态属性是在发布多个站点时用来区分访问到的是那个站点。

在Web.config 中添加一个节点  <add key="WebSite" value="WebSite1" />

启动调试,如果/Home/Two 页面成功返回Session里面的内容,说明借助Redis存储Session数据成功。

4.发布两个或两个以上的站点

用刚刚新建的项目在IIS上挂两个站点。新建两个发布目录,更改Web.config文件,一个value设置WebSite1,一个value设置WebSite2.

第一个站点命名为RedisSessionTest,绑定的ip为127.0.0.1 端口是88

第二个站点命名为RedisSessionTestTwo,绑定的ip为127.0.0.1 端口是89

打开浏览器分别访问:http://127.0.0.1:88/Home/Index,http://127.0.0.1:89/Home/Two,http://127.0.0.1:88/Home/Two

第一个站点返回1231WebSite1,第二个站点返回1231WebSite2,说明Session共享成功。

有两个问题要注意:

1.这个两个站点是在同样的顶级域名之下。

2.第二个站点不要打开Home/Index页面,不然就不能确定第二个站点是否和第一个站点共享Session了。

最后:Redis要安装比较新的版本,ssl要设置为false,不然可能会报 No connection is available to service this operation: EVAL 这个错误

返回导航栏

时间: 2024-10-12 10:45:23

.Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(三)的相关文章

.Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列导航栏

.Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(一) .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(二) .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(三) .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(四)

.Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(一)

说明 1.首先说明一下实现负载均衡的过程. 第一步:新建两个或多个站点(建站过程略). 第二步:两个或多个站点之间实现Session的共享. 第三步:多个站点通过负载均衡器实现负载均衡. 2.博客内容主线 1.Redis的安装. 2..Net通过Redis实现多个站点Session共享的过程. 3.Nginx的安装和配置实现负载均衡. 4.使用Fiddler模仿域名,测试负载均衡是否成功实现. 前言 1.站点之间的Session共享使用Redis来实现 2.负载均衡使用Nginx来实现 以下是关

.Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(二)

Redis的安装和使用 1.Redis的下载链接:https://github.com/ServiceStack/redis-windows 下载的压缩包redis-windows-master.zip 解压之后找到->downloads文件夹,选择最新的安装包解压.我这里最新的安装包是redis64-3.0.501.zip. 安装包在解压就可以看到下面图片中的文件 Redis的使用和安装已经有巨人给我们铺好了路,下面直接给出博文的地址,感谢这两个博主,从这两个系列里面学到了很多. 1. htt

Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

CentOS安装Nginx?:http://centoscn.com/CentosServer/www/2013/0910/1593.html CentOS安装Tomcat?:http://blog.csdn.net/zhuying_linux/article/details/6583096 CentOS安装Redis?:http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3117997.html 多个Tomcat负载均衡实例:可在服务器上复

Nginx+Tomca+Redis实现负载均衡、资源分离、session共享

目标实现:Nginx作为负载均衡后端多Tomcat实例,通过Redis实现Session共享. 操作系统环境:CentOS 6.8 下载相关软件百度云 密码:29ic 安装rz/sz命令:便于文件传输 安装Maven 安装Redis 安装JDK sudo rpm -ivh jdk-7u80-linux-x64.rpm //解压安装 安装Nginx 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 下载

nginx+apache+redis实现负载均衡、动静分离、session共享

环境centos6.5 nginx:192.168.1.202 tomcat1:192.168.1.240 tomcat2:192.168.1.201 redis:192.168.1.116 nginx安装: yum install -y nginx 如提示包不存在,安装epel源即可 rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 修改nginx配置文件 vim /etc/nginx

Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

Nginx反向代理实现负载均衡配置图解

[导读] 负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. 首先简单的介绍下nginx作为反向代理实现负载均衡.反向负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. 首先简单的介绍下nginx作为反向代理实现负载均衡. 反向代理方式是指以反向代理服务器来接受互联网上的连接请求,然后将请求转发给内

基于Nginx反向代理及负载均衡

基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是开启的,因为proxy属于nginx内置标准模块,通常实现代理的时候,最核心模块是proxy_pass,用于将用户请求的rui递交至上游服务器的某个URI但这个模块大部分用于location当中,因此要实现将某一URI的访问代理某个上游服务器大致的格式为: location /name/ { pro