使用Nginx解决IIS绑定域名导致应用程序重启的问题
在将多个站点迁移到一个站点(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绑定域名导致应用程序重启的问题的更多相关文章
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法
<对“XXX::Invoke”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们& ...
- 解决WebBrowser控件会导致应用程序占用内存居高不下问题
WebBrowser 是一个 .NET 控件类,在 .NET Framework 2.0 版中新增.WebBrowser 类使用户可以在窗体中导航网页,下面我们来看在开发中碰到WebBrowser控件 ...
- Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑 ...
- 解决IIS配置问题
解决网站运行一段时间会变慢的问题 http://blog.csdn.net/rryqsh/article/details/8156558 1. IIS 7 应用程序池自动回收关闭的解决方案 如果你正在 ...
- 架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)
参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭 ...
- 解决iis内存占用过大的问题--ZT
解决iis内存占用过大的问题 在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢. 今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即 ...
- 简单的制作ssl证书,并在nginx和IIS中使用
2020年最后一篇博文收官,提前祝各位园友新年快乐 现在的后端开发,动不动就是需要https,或者说是需要ssl证书,既然没有正版的证书,那么我们只能自己制作ssl的证书了. 说明:证书的制作采用的是 ...
- 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离
近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...
随机推荐
- IdentityHashMap的使用场景
IdentityHashMap的使用场景 JDK1.4就加入了这个map类型,它是使用 == 判断相等,而不是hashmap的equals方法判断相等. 那么,它有什么应用场合呢? 当然是需要我们必须 ...
- cocos2d-x之action初试
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...
- poj 3667 Hotel(线段树,区间合并)
Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...
- cmd获取系统时间
查看时间格式: echo %date% echo %time% 通过%date:~5,2%来组合得出当前日期,组合的效果为yyyymmdd,date命令得到的日期格式默认为yyyy-mm-dd,通过% ...
- Linux的交叉编译 及configure配置
这两天需要把一个CDVS的工程代码从Linux 平台上移植到ARM平台上,花了两天才搞定,之前很早申请的博客,到现在还没有技术文章会,以后决定凡是花两三天才搞定的东西都会把解决过程发到这里,很多东西靠 ...
- poj 1463 Strategic game DP
题目地址:http://poj.org/problem?id=1463 题目: Strategic game Time Limit: 2000MS Memory Limit: 10000K Tot ...
- HDU 2899 Strange fuction 【三分】
三分可以用来求单峰函数的极值. 首先对一个函数要使用三分时,必须确保该函数在范围内是单峰的. 又因为凸函数必定是单峰的. 证明一个函数是凸函数的方法: 所以就变成证明该函数的一阶导数是否单调递增,或者 ...
- JS中的基本运动逻辑思想总结
总结一下自己今天学习运动的基本思想:‘ [1]对于移动的div,使其在某一个位置停止将其封装成一个函数,仅仅改变speed的正负即可 涉及到问题包括: var time=null; function ...
- Android系列之Fragment(二)----Fragment的生命周期和返回栈
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android优化—— Google 发布 Android 性能优化典范
阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...