使用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绑定域名导致应用程序重启的问题,布布扣,bubuko.com

时间: 2024-10-13 03:20:34

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

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

原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改了配置文件web.config后,会导致应用程序重启,所有 会话(session)丢失.然而,应用程序的配置信息放在配置文件里是最佳选择,在后台修改了配置后导致所有会话丢失是非常不爽的事情,这个时候可将配 置文件中经常需要改变的参数配置节 放到外面来,例如appSetting节. 一.原来的web.

在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启

参考: http://www.cnblogs.com/sxw_cug/archive/2013/02/28/1785477.html http://www.cnblogs.com/jiaxa/p/3326631.html?utm_source=tuicool http://www.cnblogs.com/Gyoung/p/3590778.html 我们都知道,在asp.net中修改了配置文件web.config后,会导致应用程序重启,所有会话(session)丢失.然而,应用程序的配置信息放在配

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

最近在写一个海康的门禁的自动监控刷卡事件的程序. 因为用c#写的,大家都知道c#是垃圾自动回收的.海康提供的api是用c++写的,要将处理的回调代码委托给api .刚开始的时候很顺利,但当运行一段时间就会报以下错误: 对“xxx”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们. 大致的原因是:c#把回调函数资源回收了,导致api收到事件的时候执行回调出错. 网上的解决方案是将回调方

解决IIS配置问题

解决网站运行一段时间会变慢的问题 http://blog.csdn.net/rryqsh/article/details/8156558 1. IIS 7 应用程序池自动回收关闭的解决方案 如果你正在做ASP.NET,那肯定会用到IIS 如果你想在ASP.Net Application中加入某个定时任务,那想必一定是用一个线程在不停地做定时计算 那假设我们在自己的ASP.NET应用程序中加入了Quartz.NET框架,并且配置等等都OK了. 这个站点访问量很少,现在只有几个人上班的时候才会使用,

IIS设置导致错误”http error 500.21 ——internal server error“

原因:安装framework 4.0之后再启用设置iis,导致framework没有安装. 解决:开始—所有程序—附件—命令提示符,”右键“—”以管理员身份运行“ %windir%\microsoft.net\framework\v4.0.30319\aspnet_regiis.exe  -i ok!!!

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

参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)>中提到有好多有趣的地方,接下来就为大家一块儿讲讲在深入研究过程中遇到那些有趣的事情. ·实战之行--发现问题 ·探索之旅--寻出问题原因 ·解决之道--解决问题 [实战之行] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)>中做了小Demo,当时做

[转]解决IIS下UTF-8文件报错乱码的问题

找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后面的回车去掉(这个地方微软写错了) 将这一句后面的<br>注释掉即可! Response.Write Server.HTMLEncode(objASPError.ASPDescription)' & "<br>" 转自:http://blog.csdn.ne

(转)关于android中bitmap过大导致的程序crash问题

第一种方法--及时回收bitmap内存: 一般而言,回收bitmap内存可以用到以下代码 if(bitmap != null && !bitmap.isRecycled()){ bitmap.recycle(); bitmap = null; } System.gc(); bitmap.recycle()方法用于回收该bitmap所占用的内存,接着将bitmap置空,最后,别忘了用System.gc()调用一下系统的垃圾回收器. 在这里要声明一下,bitmap可以有多个(以为着可以有多个i

IIS安装与MVC程序部署

最近在做访客系统,虽然说不是什么多大的项目,但麻雀虽小五脏俱全,使用EF Code First+Mysql+Frozenui响应式布局,感觉通过这个项目学到好多东西,Mysql的使用.EF映射Mysql.相遇式布局,今天上午发了一个版本,没想到有些地方需要改动,改动还不小,于是下午打起十二分的精神改,终于在下午快下班的时候改完了.改完之后要部署,说实话虽然做.Net也做这么久了,可我还没部署过,第一个版本上线的时候还是找同桌解决的,可是这个部署自己始终要学要会的,于是就自己百度试在自己电脑上试了