在将多个站点迁移到一个站点(Tenant Feature)的时候碰到了一个棘手的问题,用户需要绑定自定义域名,但IIS绑定域名的时候会导致这个站点重启,那么只要一个用户绑定了一个域名则会导致这个应用上的其它租户都会受到影响,下面写出我们的解决方案,但不一定是最优的。

问题在IIS上绑定域名导致应用程序重启

一个简单的测试

1.新建一个空MVC项目,在MvcApplication类中定义一个全局的静态变量

2.创建一个控制器和视图

3.在视图页对MvcApplication中的Count进行++并输出

4.访问几次页面

5.绑定一个域名

6.刷新页面

至此验证完成,可以看到应用被重启了。

为什么绑定域名会导致应用程序重启

其实原理和更改Web.config文件会导致应用重启启动是一样的,因为绑定域名时实际在C:\Windows\System32\inetsrv\config\applicationHost.config文件中增加一了一段配置,如下:

只有IIS会重启?

答案是否定的,在早期我接触Java的时候Tomcat等也是需要重启的,不过是需要手动重启服务,现在我就不清楚老。

使用Nginx解决问题

为了解决这个问题可谓是找了很多资料,最终无奈使用一个代理服务器来解决这个问题,虽然我觉得在这里Nginx受了委屈,因为它更大的作用是负载均衡,但能解决问题就行,以后在大访问量的时候也可以派上用场,下面就简述下使用Nginx解决这个问题的过程。

原理其实非常简单,在用户访问一个Url时由Nginx去分配,这样域名就可以不用直接绑定在IIS上,而由Nginx来分配域名指向哪里。

提前在IIS上绑定无数个泛解析域名

比如:site1.cs.xxx.com~site9999999.cs.xxx.com,这样就免去了在新增Tenant时需要绑定域名的尴尬。

将绑定自定义域名的动作交给Nginx

Nginx没有提供什么API,只有一个配置文件和几个命令,所以我们要做的就是将在Nginx上配置域名的动作自动化,我们为此写了一个Daemon Service来完成这个动作,下面会介绍并放出这个守护程序的使用说明及源码。

这样IIS绑定域名的问题就解决了,但其实在这个方案之前我们还有过其他的方案。

被Pass掉的方案

1.一台服务器只挂一个站点,而这个站点不绑定任何域名,所有指向这个服务器IP的80端口的请求全部由这个站来响应。

Pass原因:浪费资源,80端口被极大的浪费。

2.每天定点绑定域名

Pass原因:用户绑完域名后生效时间不确定,可能需要等到晚上12点之后才能生效。

Nginx自动化配置

Server

守护服务的主要原理是这样的,守护服务提供一个WCF服务,这个WCF服务中有两个操作,绑定域名和删除域名,服务约束如下:

具体实现代码就不演示了。

使用说明

1.配置守护服务(App.config)

主要有两个配置:

NginxPath:Nginx的存放路径,因为我要找到配置文件和nginx.exe,你懂的。

RunModel:因为Nginx只提供了命令行的模式去执行,所以我需要借助PowerShell或CMD,注意如果使用PowerShell,则PowerShell的版本必须为3.0及以上。

2.配置Nginx

因为Nginx默认的配置文件中有很多配置,所以我们单独把域名的配置独立出来,这就需要对Nginx原有的配置进行一些修改。

打开nginx-1.7.2\conf\nginx.conf文件,在http节点下添加配置 include custom.conf;

到这里我们的配置就完成了,接下来启动服务。

Client

1.添加服务引用

2.添加如下测试代码

运行之后会发现nginx-1.7.2\conf\下多出了一个custom.conf文件。

内容为:

到这里我们就测试通过啦,如果想看效果请自行hosts映射test1.com和test2.com到本地IP

为了防止绑定失败我们同时在服务的根目录下保存了domains.xml文件,域名的绑定信息也会在此保留,这样大家就可以自己还原啦。

Daemon Service Source Code

http://files.cnblogs.com/ants/ChunSun.NginxServer.DaemonService.zip

说明:该源码是我精简过后的,原来的源码是基于Rabbit Kernel的,所以精简后的源码没有提供日志等功能的支持,大家可以自行添加。

使用Nginx解决IIS绑定域名导致应用程序重启的问题的更多相关文章

  1. 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)

    原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...

  2. 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法

    <对“XXX::Invoke”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们& ...

  3. 解决WebBrowser控件会导致应用程序占用内存居高不下问题

    WebBrowser 是一个 .NET 控件类,在 .NET Framework 2.0 版中新增.WebBrowser 类使用户可以在窗体中导航网页,下面我们来看在开发中碰到WebBrowser控件 ...

  4. Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡   分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑 ...

  5. 解决IIS配置问题

    解决网站运行一段时间会变慢的问题 http://blog.csdn.net/rryqsh/article/details/8156558 1. IIS 7 应用程序池自动回收关闭的解决方案 如果你正在 ...

  6. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)

    参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭 ...

  7. 解决iis内存占用过大的问题--ZT

    解决iis内存占用过大的问题 在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢. 今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即 ...

  8. 简单的制作ssl证书,并在nginx和IIS中使用

    2020年最后一篇博文收官,提前祝各位园友新年快乐 现在的后端开发,动不动就是需要https,或者说是需要ssl证书,既然没有正版的证书,那么我们只能自己制作ssl的证书了. 说明:证书的制作采用的是 ...

  9. 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

    近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...

随机推荐

  1. JavaScript中typeof的坑

    typeof是一个运算符,它对操作数返回的结果是一个字符串,有6种(只针对ES,不包含HOST环境对象) 'undefined' 'boolean' 'string' 'number' 'object ...

  2. php的amqp扩展set导致内存溢出

    最近做的一个项目中需要用到rabbitmq,按照自己的之前的一篇文章http://www.cnblogs.com/mingaixin/archive/2012/10/28/2743807.html进行 ...

  3. 记一次Web应用CPU偏高

    LZ开发的一个公司内部应用供查询HIVE数据使用.部署上线后总是会出现CPU偏高的情况,而且本地测试很难重现.之前出现几次都是通过直接重启后继续使用,因为是内部使用,重启一下也没有很大影响(当然,每次 ...

  4. Linux awk

    一.简介 二.教程 1)过滤字符(对大小写很敏感) dir -l | awk '$3=="root" {print $1,$3,$4, $9;} ' cat tecmint_dea ...

  5. c#发送http请求

    直接代码,自己备用 /** * @method:生成验证码 */ [JSONMethod] [Description ( "生成验证码" )] [DomTemplate ( )] ...

  6. Android资源下载

    各个版本,在线源码: http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ ...

  7. log4j日志优先级导致的不输出日志

    在sae部署微信代码的时候,发现它的默认日志很不友好,看起来很费劲,详细看了一下说明发现它可以根据log4j的输出级别而分类输出,就拖了一个log4j的xml文件扔进项目代码,然后部署运行,发现没有日 ...

  8. char,vchar,nchar,nvchar的区别

    char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据.所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在 ...

  9. Sample MultipleFileWordcount CombineFileInputFormat

    在旧版本的samples中,使用的是旧的api,mapred下面的MultiFileInputFormat,现在已经过时. 现在推荐使用mapreduce下面的CombineInputFormat来处 ...

  10. selenium如何跳转到iframe

    处理iframe,selenium提供了3中方法: 1.html的frame有id,传入id 2.html的frame有name,传入name 3.先找到iframe的元素,再传入该元素对象 跳出if ...