90%部署失败源于运行时未正确安装、端口未开放或程序未监听外网地址;须注册microsoft仓库后yum install aspnetcore-runtime-6.0,修改program.cs绑定http://*:5000,宝塔应用管理器需填绝对路径、核对大小写、验证dotnet路径,并确保nginx proxy_pass与监听端口一致且防火墙放行。

宝塔面板上部署 .NET 6.0 应用失败,90% 是因为环境没装对、端口没放开、或程序没监听外网地址——不是代码问题,是运行时和网络配置漏了关键几步。
安装 .NET 6 运行时前必须注册 Microsoft 仓库
直接 yum install aspnetcore-runtime-6.0 会报错 No package aspnetcore-runtime-6.0 available,因为 CentOS/RHEL 默认不包含 Microsoft 官方源。
必须先执行仓库注册命令,且版本号要严格匹配系统:
- CentOS 7 / Alibaba Cloud Linux 2:用
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm - CentOS 8 / Alibaba Cloud Linux 3:用
sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm - 如果提示
package packages-microsoft-prod-1.0-1.noarch is already installed,加参数重装:--force --nodeps
注册完再运行 yum update && yum install aspnetcore-runtime-6.0 才能成功。装完验证:dotnet --info 能输出 SDK/Runtime 版本即表示环境就位。
ASP.NET Core 启动后无法通过 IP 访问
本地 curl http://localhost:5000 成功,但用服务器 IP(如 http://192.168.1.100:5000)打不开,常见于未修改监听地址。
.NET 6 默认只监听 http://localhost:5000,外部请求被拒绝。需在项目中显式绑定到所有接口:
- 修改
Program.cs,确保有builder.WebHost.UseUrls("http://*:5000")或builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.ListenAnyIP(5000); }) - 若使用
launchSettings.json(仅开发时生效),也要把"applicationUrl": "https://localhost:5001;http://localhost:5000"改成"http://*:5000" - 改完必须重新发布(Publish),上传新生成的 DLL 和依赖文件,否则配置不生效
注意:* 表示监听所有 IPv4 接口;0.0.0.0 效果相同,但 * 更兼容 Kestrel。
用宝塔「应用管理器」启动 .NET 程序总失败
宝塔应用管理器里选了 dotnet 环境、填了 MyApp.dll,却提示 Failed to load dll 或 Permission denied,通常有三个原因:
- 路径写错:
WorkingDirectory必须填完整绝对路径(如/www/wwwroot/myapp),不能是相对路径或带中文名的路径 - DLL 名字大小写不一致:Linux 区分大小写,
myapp.dll≠MyApp.dll,务必和实际文件名完全一致 - 缺少执行权限:上传后进终端执行
chmod +x /www/wwwroot/myapp/MyApp.dll(虽然 DLL 不需要可执行权,但某些旧版宝塔会校验);更稳妥的是检查dotnet命令路径:which dotnet返回/usr/bin/dotnet,确保应用管理器里选的环境指向该路径
如果仍失败,先手动测试:进目录运行 dotnet MyApp.dll --urls=http://*:5000,看是否报错——这是最直接的排障方式。
Nginx 反向代理配置后 502 Bad Gateway
程序已跑起来(curl http://localhost:5000 返回正常),但域名访问显示 502,说明 Nginx 没连上后端服务。
检查点集中在三处:
- Nginx 配置里的
proxy_pass地址必须和 .NET 实际监听地址一致,例如程序监听http://*:5000,则写proxy_pass http://127.0.0.1:5000;(不要写localhost,某些 DNS 解析可能卡住) - 防火墙必须放行程序端口(如 5000):
firewall-cmd --add-port=5000/tcp --permanent && firewall-cmd --reload - 确认程序进程确实在运行:
ps aux | grep MyApp.dll或systemctl status myweb.service(如果用了 systemd)
别忽略宝塔自带的「网站」→「反向代理」功能,它生成的配置比手写更可靠;但启用后记得点「重载配置」,否则不生效。
真正卡住人的地方,往往不是“怎么装”,而是“装了但没生效”——比如仓库注册失败却没报错、监听地址改了但没重新发布、Nginx 配置写了却忘了重载。每一步都建议用命令行快速验证,而不是等浏览器刷新失败才回头排查。











