部署Linux版ASP.NET Core至Azure Web App遇服务不可用问题求助
我来帮你分析下这个问题——你遇到的"Service Unavailable"本质是Azure启动你的Linux容器失败了,从你提供的Kudu日志就能看出:容器每次启动后立刻就退出了,导致站点无法正常启动。
先看一下你拿到的日志内容:
2018-01-04 12:20:05.716 ERROR - Container dotnetlinuxapp_1 for site dotnetlinuxapp has exited, failing site start 2018-01-04 12:20:18.304 INFO - Starting container for site 2018-01-04 12:20:18.305 INFO - docker run -d -p 24936:8080 --name dotnetlinuxapp_1 -e WEBSITE_SITE_NAME=DotNetLinuxApp -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=fdcd5b5339be6bb353a84764edb2155ae6bb8d934d2d889b883ef65bcb729a44 -e HTTP_LOGGING_ENABLED=1 appsvc/dotnetcore:1.1.2_1709181723 /home/site/wwwroot/Meetup.Web.dll 2018-01-04 12:20:19.646 ERROR - Container dotnetlinuxapp_1 for site dotnetlinuxapp has exited, failing site start
结合日志里的Docker启动命令,我给你列几个最可能的排查方向,按优先级来:
确认应用程序集的路径和文件名是否正确
日志里指定启动的是/home/site/wwwroot/Meetup.Web.dll,Linux系统严格区分大小写,你可以通过Kudu的Debug Console(选Bash)导航到/home/site/wwwroot目录,用ls命令查看文件列表,确认这个dll确实存在,且文件名的大小写完全匹配。检查.NET Core版本兼容性
日志里用的Azure官方镜像是appsvc/dotnetcore:1.1.2_1709181723,这是.NET Core 1.1的版本。如果你的应用是用更高版本(比如2.0、3.1甚至更高)开发的,这个旧镜像根本跑不动你的应用,自然会启动失败。你需要去Azure门户的Web App设置里,找到Stack settings,把.NET Core版本改成和你应用匹配的版本。手动运行启动命令,查看具体报错
容器退出的核心原因是应用启动失败,但Kudu日志没给出具体错误。你可以在Kudu的Bash控制台里手动执行启动命令:dotnet /home/site/wwwroot/Meetup.Web.dll执行后会直接显示应用启动时的异常信息,比如缺少依赖包、配置文件错误、数据库连接失败之类的,这是最直接定位问题的方法。
确认应用监听的端口是否正确
日志里容器把主机的24936端口映射到了容器的8080端口,但ASP.NET Core应用默认监听的是5000端口。如果你的应用没配置监听8080,容器启动后就没有服务在8080端口响应,Azure会认为容器启动失败。解决方法有两种:- 在Program.cs里修改WebHostBuilder,添加
.UseUrls("http://*:8080") - 在Azure门户的Web App配置里添加环境变量
ASPNETCORE_URLS=http://*:8080
- 在Program.cs里修改WebHostBuilder,添加
检查应用的配置和依赖文件
确认wwwroot目录下的appsettings.json、web.config(如果是发布包的话)等配置文件是否存在,内容是否正确——比如数据库连接字符串有没有填错,或者某些依赖的配置项缺失,都会导致应用启动时崩溃。
内容的提问来源于stack exchange,提问作者Jatin Parmar

