.NET 8 Blazor Server App 升级到 .NET 10 时,Linux 服务器需要重新配置吗?
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1311
最近在考虑一个问题:
如果只是把 .NET 8 的 Blazor Server App 升级到 .NET 10,那么 Linux 服务器是不是只要安装 .NET 10 Runtime 就基本可以了?
Nginx、systemd、防火墙、SSL 这些 Linux 侧配置需要重新做一遍吗?
整理之后,结论其实比较简单:
大多数情况下,不需要重新配置 Linux。
只需要在服务器上安装 .NET 10 的 ASP.NET Core Runtime,然后把项目发布成 .NET 10 版本并重新部署。
也就是说,这件事不是“重装服务器”,而是“替换应用运行时”。
一、应用升级和服务器重建是两件事
假设现在的服务器结构是:
Ubuntu 24.04
↓
Nginx
↓
Kestrel
↓
.NET 8 Blazor Server App
升级之后,目标结构通常只是变成:
Ubuntu 24.04
↓
Nginx
↓
Kestrel
↓
.NET 10 Blazor Server App
可以看到,中间的大部分东西其实没有变。
通常不需要重配:
Nginx 配置
systemd service 配置
防火墙规则
域名解析
SSL 证书
MySQL / PostgreSQL
网站目录结构
真正需要变化的是:
服务器安装 .NET 10 ASP.NET Core Runtime
项目 TargetFramework 改成 net10.0
重新 publish
替换服务器上的发布文件
重启应用服务
所以它不是 Linux 层面的迁移,而是应用运行时层面的升级。
二、Web 项目应该安装 ASP.NET Core Runtime
对于 Blazor Server App / ASP.NET Core 网站来说,服务器上建议安装的是:
sudo apt update
sudo apt install aspnetcore-runtime-10.0
而不是只安装:
dotnet-runtime-10.0
原因是 Blazor Server / ASP.NET Core Web 应用需要的不只是普通 .NET Runtime,还需要 ASP.NET Core Runtime。
安装完成后,可以用下面命令确认:
dotnet --list-runtimes
理想情况下应该能看到类似内容:
Microsoft.NETCore.App 10.0.x
Microsoft.AspNetCore.App 10.0.x
其中 Microsoft.AspNetCore.App 对 Web 应用很重要。
三、项目本身需要重新发布
服务器装好 Runtime 之后,本地项目也要改成 .NET 10。
例如 .csproj 中:
<TargetFramework>net8.0</TargetFramework>
改成:
<TargetFramework>net10.0</TargetFramework>
然后重新构建和发布:
dotnet restore
dotnet build
dotnet publish -c Release
最后把新的发布文件上传到服务器原来的网站目录,例如:
/var/www/myapp
再重启服务:
sudo systemctl restart myapp
sudo systemctl status myapp
如果服务能正常启动,并且网站能访问,说明服务器层面基本就没什么大问题。
四、systemd 通常不用改
常见的 systemd 服务文件大概是这样:
[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll
Restart=always
RestartSec=10
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000
这种写法通常不需要改。
因为它执行的是:
dotnet MyApp.dll
只要服务器上同时安装了 .NET 10 Runtime,.NET 10 发布出来的 DLL 就会使用对应的运行时启动。
需要注意的是,如果服务文件里写死了某个旧版本路径,比如写到了 .NET 8 的具体目录,那就需要修改。
不过正常部署方式一般不会这么写。
五、Nginx 通常也不用改
如果原来是 Nginx 反向代理到 Kestrel,例如:
https://example.com
↓
Nginx
↓
http://localhost:5000
↓
ASP.NET Core App
那么升级 .NET Runtime 后,这个结构仍然一样。
Nginx 不关心你的应用是 .NET 8 还是 .NET 10。
它只关心后面的 Kestrel 是否还在同一个端口提供服务。
所以只要端口没有变,例如仍然是:
http://localhost:5000
那么 Nginx 配置一般不用改。
不过 Blazor Server 依赖 SignalR/WebSocket,所以原来如果有这些配置,最好不要乱动:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
如果网站本来运行正常,升级 Runtime 时不建议顺手重写 Nginx 配置。
六、旧的 .NET 8 Runtime 要不要删除?
不建议马上删除。
.NET Runtime 可以多版本并存。
服务器上同时存在:
Microsoft.NETCore.App 8.0.x
Microsoft.AspNetCore.App 8.0.x
Microsoft.NETCore.App 10.0.x
Microsoft.AspNetCore.App 10.0.x
这是正常的,不冲突。
刚升级时,最好让 .NET 8 和 .NET 10 并存一段时间。
原因很简单:
如果 .NET 10 版本上线后发现问题,还可以临时回滚到 .NET 8 发布物。
如果立刻删除 .NET 8 Runtime,回滚时就可能直接启动失败。
比较稳的做法是:
先安装 .NET 10 Runtime
部署 .NET 10 版本
观察几天或几周
确认没有其他服务依赖 .NET 8
最后再考虑删除 .NET 8 Runtime
服务器维护里,留退路比追求干净更重要。
七、什么时候才需要动 Linux 配置?
虽然大多数情况下不需要重配 Linux,但下面几种情况要注意。
1. systemd 写死了旧版本路径
如果服务文件里写的是通用命令:
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll
通常不用改。
但如果写死了某个 .NET 8 的具体目录,就需要调整。
2. 发布方式是 self-contained
如果项目是 self-contained 发布:
dotnet publish -c Release -r linux-x64 --self-contained true
那么发布物本身会包含 Runtime。
这种情况下,服务器甚至不一定需要安装系统级 .NET Runtime。
但缺点是发布包更大,而且 Runtime 安全补丁需要通过重新发布应用来更新。
对于普通服务器部署,我个人更偏向 framework-dependent 发布,也就是服务器安装 Runtime,应用发布物不自带 Runtime。
3. 项目依赖 native 组件
如果项目用到了这些东西,就需要额外测试:
图片处理库
PDF 生成组件
SkiaSharp
Playwright
wkhtmltopdf
libgdiplus
系统字体
本地命令行工具
这类依赖有时不是 .NET 本身的问题,而是 Linux native 依赖和运行环境的问题。
4. 端口或部署目录改变了
如果升级时顺便改了端口,例如从:
localhost:5000
改成:
localhost:5001
那 Nginx 当然也要跟着改。
如果部署目录变了,systemd 的 WorkingDirectory 和 ExecStart 也要改。
但如果只是原地替换发布文件,这些通常都不用动。
八、推荐升级流程
比较稳的流程可以是:
1. 服务器安装 .NET 10 ASP.NET Core Runtime
sudo apt update
sudo apt install aspnetcore-runtime-10.0
dotnet --list-runtimes
2. 本地项目升级到 .NET 10
<TargetFramework>net10.0</TargetFramework>
然后:
dotnet restore
dotnet build
dotnet publish -c Release
3. 上传发布物到服务器
替换原来的应用目录,例如:
/var/www/myapp
4. 重启应用服务
sudo systemctl restart myapp
sudo systemctl status myapp
5. 查看日志
journalctl -u myapp -n 100 --no-pager
重点确认有没有:
Runtime 缺失
端口占用
配置文件读取失败
数据库连接失败
权限问题
如果这些都没有,基本就说明 Linux 侧不需要额外重配。
九、和 Ubuntu 24.04 生命周期的关系
这里还需要区分两个生命周期:
.NET Runtime 的支持周期
Ubuntu 系统的支持周期
根据微软官方生命周期信息,.NET 8 LTS 支持到 2026-11-10,.NET 10 LTS 支持到 2028-11-14。
Ubuntu LTS 通常有 5 年标准安全维护,Ubuntu 24.04 作为 LTS,可以继续使用到 2029 年左右。
这意味着:
2026 年前后:重点处理 .NET 8 → .NET 10
2028 年前后:开始准备 .NET 10 → 下一代 LTS
2029 年前后:考虑 Ubuntu 24.04 → 新 Ubuntu LTS 或新服务器
所以当前这次升级不等于必须更换服务器。
更合理的路线是:
现在:Ubuntu 24.04 + .NET 8
2026 年内:Ubuntu 24.04 不动,.NET 8 升到 .NET 10
2026~2028:Ubuntu 24.04 + .NET 10 稳定运行
2028 年中后:准备下一轮 Runtime / Server 迁移
2029 年前:处理 Ubuntu 24.04 的后续升级或迁移
十、结论
如果只是把 .NET 8 的 Blazor Server App 升级到 .NET 10,一般不需要重新配置 Linux。
大多数情况下,只需要:
安装 aspnetcore-runtime-10.0
项目改成 net10.0
重新 publish
覆盖部署文件
重启 systemd 服务
确认日志和网站运行正常
不用重新做:
Nginx
防火墙
SSL
域名
数据库
Ubuntu 系统
一句话总结:
.NET 8 → .NET 10,通常是应用运行时升级,不是 Linux 服务器重建。
旧的 .NET 8 Runtime 也不建议马上删除。
先让 .NET 8 和 .NET 10 并存一段时间,确认 .NET 10 版本稳定之后,再考虑清理旧 Runtime。
服务器维护不是洁癖比赛。
能稳定、能回滚、能少动系统配置,才是最舒服的路线。
This article was last edited at