隐藏

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

发布:2019/4/18 23:18:18作者:管理员 来源:本站 浏览次数:1156

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

说明

1.首先说明一下实现负载均衡的过程。

第一步:新建两个或多个站点(建站过程略)。

第二步:两个或多个站点之间实现Session的共享。

第三步:多个站点通过负载均衡器实现负载均衡。

2.博客内容主线

1.Redis的安装。

2..Net通过Redis实现多个站点Session共享的过程。

3.Nginx的安装和配置实现负载均衡。

4.使用Fiddler模仿域名,测试负载均衡是否成功实现。

前言

1.站点之间的Session共享使用Redis来实现

2.负载均衡使用Nginx来实现

以下是关于NginxRedis的百科说明。反正通过这个我是没有看懂,都是用过了,试过了,才明白。

1.NginxRedis是什么?

   Nginx->百度百科链接:http://baike.baidu.com/link?url=iTGR15tb1ZUodFPYXpTChrg-zb9qmc3jOTVgLnimwgBS002GQI_hz0PZj0P-EKHxlHgE_1NArHqkEJuQ5w-gQq

  Redis->百度百科链接:http://baike.baidu.com/link?url=gSTs903XtcrCps12yCJgEccyNj9iBma5dOoJGR4TY0jUUuk8p2rA-zyEPfYBNAucx-ssi3NSmddVWWRrG7ff7K

  反正看了百科之后也不懂它们是什么。

3.总结

Nginx是用来实现负载均衡的软件,配置简单、使用方便。

RedisKey/ValueNoSql数据库,但是又远远不止以此,同样配置简单、使用方便。

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

Redis的安装和使用

1.Redis的下载链接:https://github.com/ServiceStack/redis-windows

下载的压缩包redis-windows-master.zip

解压之后找到->downloads文件夹,选择最新的安装包解压。我这里最新的安装包是redis64-3.0.501.zip

安装包在解压就可以看到下面图片中的文件

 

Redis的使用和安装已经有巨人给我们铺好了路,下面直接给出博文的地址,感谢这两个博主,从这两个系列里面学到了很多。

        1. http://www.cnblogs.com/knowledgesea/category/722602.htm

        2. http://blog.csdn.net/qiujialongjjj/article/category/1800171

 

2.Redis安装成windows服务,第一步就完成了。

安装过程如下:

1):把上图的文件拷贝到,要按转的目录,我是把它拷贝到C:\Program Files\Redis

2):用管理员权限打开CMD命令窗口,切换到我们刚才拷贝文件的目录

          cd C:\Program Files\Redis

          然后执行这一条语句  
          redis-server.exe --service-install redis.windows.conf

          在打开控制面板->管理工具->服务,在服务列表里面查看有没有Redis 这个服务。如果没有启动把它启动。

3):打开redis的客户端操作窗口,双击redis-cli.exe

          输入 

         set redisdemo first 

         返回 ok

         输入 get redisdemo

        返回 "first"

        说明Redis安装成windows服务已经成功

最后,不熟悉Redis的同学可以看看下面推荐的的两个博文

        1. http://www.cnblogs.com/knowledgesea/category/722602.htm

        2. http://blog.csdn.net/qiujialongjjj/article/category/1800171

返回导航栏

    

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

.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.1ssl给为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,绑定的ip127.0.0.1 端口是88

  第二个站点命名为RedisSessionTestTwo,绑定的ip127.0.0.1 端口是89

  打开浏览器分别访问:http://127.0.0.1:88/Home/Indexhttp://127.0.0.1:89/Home/Twohttp://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 这个错误

返回导航栏

 

 

 

.Net 站点在Windows环境借助NginxRedis实现负载均衡系列(四) 

安装配置Nginx,实现负载均衡

1.下载Nginx

   下载链接:http://nginx.org/en/download.html

   我下载的是nginx/Windows-1.9.15 这个版本

2.安装Nginx

  1):把下载好的文件,解压之后,拷贝到你要安装的目录。如:C:\Program Files\Nginx

  2):修改conf/nginx.conf 文件

            1. "server {"之前添加

            upstream liuyu7177.com { 

            server 127.0.0.1:89;

            server 127.0.0.1:88;
            }

 

          2.

          server {
          listen 80;
          server_name localhost;

          修改为

          server {
          listen 92;
          server_name 127.0.0.1;

 

         3.

          location / {
          root html;
          index index.html index.htm;
          }

        修改为      

        location / { 
        proxy_pass http://liuyu7177.com/;
        proxy_redirect default;
        }

3)用管理员权限打开CMD窗口,切换到安装目录,

        cd C:\Program Files\Nginx

        执行  start nginx 命令 ,执行完之后有一个黑窗一闪而过

        打开任务管理器,看看nginx进程有没有跑起来。如果没有跑起来,可能是这两个原因:1. 端口被占用;2.配置文件错误

4)下载安装Filddler

        打开Fiddler->Tools->HOSTS

        在编辑窗口里面添加 127.0.0.1:92  liuyu7177.com记录

5)最后也是最重要的一步

       打开浏览器,输入http://liuyu7177.com/

      切换到http://liuyu7177.com/Home/Two这个页面

      不停的刷新,可以发现页面的返回值一直在1231WebSite11231WebSite2变换。

      说明Nginx负载均衡成功,Redis共享Session成功。

 

 

   注意:
         1.不用Fiddler,输入127.0.0.1:92127.0.0.1:92/Home/Two 也有一样的效果

         2.Nginx安装成windows服务要自己搜索了