对于IIS部署NetCore 程序的教程,网上有很多,在这里就不赘述了。有需要的同学可以自行百度。。
今天要说的是部署之后的故事。
我们的开发环境集成了 Jenkins,部署在我们公司的一台实体服务器上,数据库,redis,工作流服务,等一系列服务都放在一个服务器上(没办法,小项目)。
一直以来,在我们自己的服务器上,整个测试环境都还是挺稳定的,没出现服务卡死,无法重启等现象。
直到有那么一天,程序需要部署在客户的测试机上了。经过一天的折腾,终于是把程序部署好了,网站也都顺利的运行起来了。
然而噩梦才刚刚开始:
第一天程序运行还算平稳,除了个别配置问题造成的错误以外,并未发现其他问题。
故事(事故)是从第二天的下午开始的,一条来自客户的微信,打破了我沉浸在Codeing For Bug 中的思绪。客户反应网站无法登录,报500错误。具体什么情况不太清楚。
截图如下:
懵逼的我,本以为这是已经小事,重启一下服务吧,但是!重启服务居然还是不行,经过初步推断是项目中有异步调用强制同步的地方,像下面这种,或者.result() 这种,
于是,一手改代码,一手重启客户服务器。
改完代码后,重新发包,部署。就当我以为这一切都会过去的时候,第二天,问题依然出现!
于是继续,百度,Bing,360,Github。。。。(对,不翻墙)
经过一番搜索,发现了一个跟我的描述很像的问题 https://github.com/dotnet/aspnetcore/issues/19555,于是乎。继续修改,就像他描述的一样:
remove BuildServiceProvider form startup
这是一个对文件监控,修改Redis 的监听。最后改成这样:
另外还优化了整个项目中的日志引用:统一通过 ILogger 进行日志的操作。
于是乎,也不知能不能起到效果,就又部署了一版到现场。
结果你们也许想到了,是的,第二天问题又出现了。
一筹莫展啊。查看系统日志,发现服务依然是被shut Down
并且很怪异的是,w3wp.exe 这个进程无法杀死。并且无法重启。
继续检查代码。发现有一个异常未经处理,于是乎怀疑是他的问题,同时申请了客户的正式机,同步部署。
这期间,怀疑过客户测试机配置的问题,怀疑过虚拟机的问题。于是,把程序同步部署到了客户正式机上。
终于,第二天,测试机照常服务卡死,但正式机并没有。对比了两个 站点发现:
测试机的站点部署在Default Web Site 上,并且,该站点前面还有一个问好,,
百度说,这是一个多协议:IIS信息服务管理器的网站有个小问号显示多个协议
最后,在不更换服务器的情况下,重新安装了 dotnet-hosting-3.1.0-win,重新安装了 IIS,并且删除了 默认站点,新建站点进行部署。
可喜的是,程序终于可以正常运行了!
至此,仅以此博客做一下记录!