在将多个站点迁移到一个站点(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. 烂泥:U盘安装Centos6.5

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 使用U盘安装Centos6.5,需要以下几个步骤: 1. 制作U盘linux系统 2. 设置服务器BIOS 3. 安装Centos,注意引导分区的安装 ...

  2. 虚拟机centos6.5 --VirtualBox设置全屏

    一.安装以下模块 yum install kernel-devel kernel-headers gcc,然后重启. 二.安装增强功能 安装失败,查看日志文件,cat /var/log/vboxadd ...

  3. 虚拟机Linux----Ubuntu1204----退格键方向键无法使用

    修改 /etc/vim/vimrc.tiny,如下: set compatible #修改为 set nocompatible #控制方向键set backspace=2 #控制退格键

  4. html跳转倒计时

    <html> <head> <title>出错啦~~~</title> <link href="css/login1.css" ...

  5. 在Windows2012下配置Mercurial

    所需的安装文件: xampp-win32-1.8.3-4-VC11-installer.exe python-2.7.7.amd64.msi tortoisehg-3.0.1-x64.msi merc ...

  6. 20150912华为机考1之"输入一个字符串,将其中出现次数最多的字符输出"

    不吐槽华为的服务器了,直接上正文 输入:字符串(英文字母),长度不超过128 输出:出现频率最高的字母 思路写在注释文档 /* Input a string * Output the most fre ...

  7. 保存带有emoji的文本报错解决方案

    今天偶然遇到一个错误,就是保存文本的时候带有了emoji表情,报错了 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8A\ ...

  8. 测试 Mono 安装

    测试 Mono 安装 为了测试核心编译器(mcs)和运行时(mono),应该创建一个简单的程序并编译它.可以在喜欢的任何文本编辑器中创建程序.这里采用一种快速而简陋的方法创建该文件(虽然没有任何格式化 ...

  9. android源码在线查看

    http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

  10. ajax载入数据是小细节

    今天看了一个点子: 在 ajax 导入数据的 div中添加一些样式,比如:我们正紧急抢救 增加趣味性,有解决数据卡壳问题