ASP.NET Core 应用在 Linux 上无法运行,主因是未安装匹配的 dotnet-runtime;需用 apt/dnf 安装对应版本,通过 systemd 管理服务,配置 Environment 传敏感配置,Nginx 反代需调优超时与哈希桶大小,并严格校验文件权限。

ASP.NET Core 应用在 Linux 上跑不起来,十有八九是没装 dotnet-runtime
Linux 服务器默认没有 .NET 运行时,dotnet publish 出来的文件不能直接双击运行——它不是“绿色版”。你得先确认系统里装的是匹配的 dotnet-runtime,而不是 SDK(开发用的)或旧版本。
常见错误现象:bash: dotnet: command not found 或 Failed to load /libhostfxr.so;这说明 dotnet 命令根本不存在,或版本不兼容。
- 用
dotnet --list-runtimes查已装运行时;若报错,就先去 .NET 官网下载对应版本的 runtime(非 SDK) - 推荐装
dotnet-runtime-8.0(或你项目实际用的版本),别装aspnetcore-runtime-8.0单独包——它依赖dotnet-runtime,漏装会启动失败 - Ubuntu/Debian 用
apt install dotnet-runtime-8.0;CentOS/RHEL 用dnf install dotnet-runtime-8.0;别用 snap 或第三方源,容易版本错乱
用 systemd 管服务,别用 nohup dotnet xxx.dll &
手动起进程看着简单,但一断 SSH、一重启机器、一出异常,应用就没了。Linux 生产环境必须交由 systemd 管理生命周期。
使用场景:需要开机自启、崩溃自动重启、日志统一收集、限制内存/CPU、按用户权限运行。
- 写一个
/etc/systemd/system/myapp.service,关键项不能少:WorkingDirectory(必须设,否则读不到appsettings.json)、User(别用 root)、Restart=always -
ExecStart要写全路径:/usr/bin/dotnet /var/www/myapp/MyApp.dll;别省略/usr/bin/dotnet,否则systemd找不到命令 - 改完记得
sudo systemctl daemon-reload,再sudo systemctl enable myapp(开机自启)和sudo systemctl start myapp
appsettings.Production.json 里的连接字符串、密钥,在 Linux 上别硬编码
Windows 开发时可能把数据库密码写死在 appsettings.Production.json 里,传到 Linux 服务器就等于把密码明文暴露在文件系统中——运维、审计、备份都可能看到。
性能/兼容性影响:硬编码不光是安全问题,还会导致多环境无法复用同一份发布包。
- 用环境变量替代:在
systemdservice 文件里加Environment=ConnectionStrings__DefaultConnection=...,然后代码里靠IConfiguration自动绑定 - 或者用
dotnet run --environment Production --urls http://0.0.0.0:5000启动时传参,但生产环境更推荐 systemd + Environment - 千万别用
dotnet user-jwts或dotnet dev-certs在服务器上生成证书——它们是开发工具,Linux 生产应配 Nginx 反向代理 + Let's Encrypt
Nginx 反向代理 502 错误,大概率是 server_names_hash_bucket_size 或 upstream 超时
ASP.NET Core 默认监听 http://localhost:5000,Nginx 做反代后出现 502,不是应用挂了,就是 Nginx 没连上或等不及。
常见错误现象:connect() failed (111: Connection refused)(端口没开/应用没启)、upstream timed out (110: Connection timed out)(超时太短)。
- 检查
upstream地址是否拼错,比如写成127.0.0.1:5001但应用实际监听:5000 - 在
http{}块里加server_names_hash_bucket_size 64;,否则域名稍长(如带下划线或长子域)就会报could not build the server_names_hash - 加超时配置:
proxy_read_timeout 300;、proxy_send_timeout 300;,避免大文件上传或长轮询被中断
最常被忽略的是权限:systemd 服务指定的 User 必须对 WorkingDirectory 和 .dll 文件有读+执行权,对日志目录有写权。chown 错一个目录,journalctl -u myapp 就只显示 “Started MyApp” 然后静音。











