IIS绑定域名导致应用程序重启的解决方案
这个问【zhè gè wèn】题比较📕小众【xiǎo zhòng】,却是不🌜好解决,在将多【zài jiāng duō】🏏个站点⛓迁移到一个站【yī gè zhàn】点⛓(Tenant Feature)的时候【de shí hòu】碰到了一个棘🕎手的问题🥣,用户需🍽要绑定【yào bǎng dìng】自定义🦀域名,但【dàn】IIS绑定域名的时候【de shí hòu】会导致这个⛷站点重启,那么只要一个用户绑【yòng hù bǎng】😈定了一【dìng le yī】个域名则会导🐑致这个⛷应用上的其它租户都【zū hù dōu】🌸会受到【huì shòu dào】影响,下面写出我们的解决😚方案,但不一【dàn bú yī】定是最【dìng shì zuì】⌛优的【yōu de】。
问题在IIS上绑定域名导致应用程序重启
一个简单的测试
1.新建一【xīn jiàn yī】🏿个空【gè kōng】MVC项目,在✋MvcApplication类中定义一个🏞全局的【quán jú de】静态变量
2.创建一个控制器和视图
3.在视图【zài shì tú】🍠页对MvcApplication中的Count进行🆖++并输出【bìng shū chū】
4.访问几次页面
5.绑定一个域名
6.刷新页面
至此验证完成,可以看到应用被重启了。
为什么绑定域名会导致应用程序重启
其实原理和更【lǐ hé gèng】改【gǎi】Web.config文件会🏻导致应😗用重启【yòng chóng qǐ】启动是🕉一样的【yī yàng de】,因为绑【yīn wéi bǎng】定域名【dìng yù míng】时实际🚟在C:\Windows\System32\inetsrv\config\applicationHost.config文件中增加一📒了一段配置,如下😷:
使用Nginx解决问题
为了解决这个问题【gè wèn tí】可😶谓是找【wèi shì zhǎo】🏛了很多资料🏋,最终无【zuì zhōng wú】奈使用✈一个代【yī gè dài】😆理服务🔧器来解【qì lái jiě】决这个问题【gè wèn tí】,虽然我觉得在这里【zhè lǐ】Nginx受了委屈🚩,因为它【yīn wéi tā】更大的【gèng dà de】作用是负载均衡🌤,但能解【dàn néng jiě】决问题【wèn tí】就行【jiù háng】,以后在🍣大访问量的时候也可🕋以派上用场🗯,下面就【xià miàn jiù】简述下使用👔Nginx解决这个问题【gè wèn tí】的过程。
原理其实非常【shí fēi cháng】简单,在用户✅访问一📭个【gè】👿Url时由Nginx去分配,这样域✔名就可以不用【yǐ bú yòng】➗直接绑定在IIS上【shàng】,而由【ér yóu】🍃Nginx来分配域名指【yù míng zhǐ】向哪里。
提前在IIS上绑定无数个泛解析域名
比如:site1.cs.xxx.com~site9999999.cs.xxx.com,这样就【zhè yàng jiù】免去了【miǎn qù le】在新增🅰Tenant时需要绑定域【bǎng dìng yù】💩名的尴📦尬。
将绑定自定义域名的动作交给Nginx
Nginx没有提供什么🗿API,只有一个【yī gè】配置👟文件和几个命令【lìng】,所以我【suǒ yǐ wǒ】🐓们要做【men yào zuò】的就是🏌将在🌝Nginx上配置【shàng pèi zhì】域名的动作【zuò】💳自动化,我们为🗾此写了【cǐ xiě le】一个【yī gè】Daemon Service来完成这个动作【zuò】💳,下面会介绍并放出这个守护⬅程序的使用说明及源码【mǎ】⏲。
这样【zhè yàng】IIS绑定域名的问🥋题就解🚴决了🈹,但其实💂在这个方案之【fāng àn zhī】前我们还有过【hái yǒu guò】其他的【qí tā de】方案。
被Pass掉的方案
1.一台服🦃务器只挂一个【guà yī gè】站点【zhàn diǎn】👈,而这个🎴站点【zhàn diǎn】👈不绑定任📗何域名,所有指📃向这个【xiàng zhè gè】服务器IP的80端口的【duān kǒu de】请求全部由这㊗个站来响应【xiǎng yīng】。
Pass原因【yuán yīn】🔌:浪费【làng fèi】资源,80端口被极大的😃浪费【làng fèi】。
2.每天定点绑定域名
Pass原因🅰:用户绑完域名后生效时间不【shí jiān bú】👩确定【què dìng】⬇,可能需【kě néng xū】要等到【yào děng dào】晚上12点之后才能生👓效。
Nginx自动化配置
Server
守护服🥙务的主要原理是这样【shì zhè yàng】🧝的,守护服🥙务提供👌一个【yī gè】WCF服务【fú wù】,这个【zhè gè】WCF服务【fú wù】中有两个🚀操作【cāo zuò】,绑定域名和删除域名,服务约【fú wù yuē】束如下💸:
具体实现代码就不演示了。
使用说明
1.配置守🈵护服务【hù fú wù】(App.config)
主要有两个配置:
NginxPath:Nginx的存放路径⬆,因为我【yīn wéi wǒ】要找到🏡配置文【pèi zhì wén】🌭件和【jiàn hé】nginx.exe,你懂的。
RunModel:因为Nginx只提供【zhī tí gòng】了命令行的模【háng de mó】😲式去执行,所以我需要借助【zhù】😞PowerShell或CMD,注意如果使用【guǒ shǐ yòng】🗯PowerShell,则🕗PowerShell的版本必须为3.0及以上【jí yǐ shàng】🎧。
2.配置Nginx
因为【yīn wéi】🚆Nginx默认的【mò rèn de】🚾配置文【pèi zhì wén】件中有🖱很多配置,所以我们单独把域名的配置独立出【dú lì chū】来【lái】,这就需要对Nginx原有的🌚配置进【pèi zhì jìn】🙈行一些🍀修改。
打开nginx-1.7.2\conf\nginx.conf文件🎬,在【zài】http节点下添加配【tiān jiā pèi】置🖐 include custom.conf;
到这里我们的【wǒ men de】💈配置就【pèi zhì jiù】完成了,接下来启动服【qǐ dòng fú】🚅务♑。
Client
1.添加服务引用
2.添加如下测试代码
运行之【yùn háng zhī】后会发现nginx-1.7.2\conf\下多出♍了一个custom.conf文件【wén jiàn】🍻。
内容为:
到这里我们就🚣测试通【cè shì tōng】过啦,如果想🛒看效果请自行hosts映射【yìng shè】test1.com和⌚test2.com到本地【dào běn dì】IP。
为了防止绑定失败我们同时在服务【zài fú wù】🚪的根目录下保🎺存了domains.xml文件【wén jiàn】,域名的【yù míng de】绑定信【bǎng dìng xìn】🤪息也会在此保留【liú】🎁,这样大🏰家就可【jiā jiù kě】以自己💠还原啦。
Daemon Service Source Code
http://files.cnblogs.com/ants/ChunSun.NginxServer.DaemonService.zip
说明:该源码🕎是我精【shì wǒ jīng】简过后的【de】,原来的【de】🙍源码是【yuán mǎ shì】📩基于Rabbit Kernel的【de】,所以精【suǒ yǐ jīng】简后的【de】✉源码没有提供🗃日志等🦐功能的【gōng néng de】支持【zhī chí】,大家可以自行添加。
关键词:IIS,解决方案
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0