.NET 8 Blazor Server App 升级到 .NET 10 时,Linux 服务器需要重新配置吗?

| .NET | 1 Reads

最近在考虑一个问题:

如果只是把 .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 的 WorkingDirectoryExecStart 也要改。

但如果只是原地替换发布文件,这些通常都不用动。


八、推荐升级流程

比较稳的流程可以是:

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