更新发布Linux平台上.NET Web项目注意事项
今天更新某项目的后台web时出现了一个问题,新代码发布后服务器依然运行的是旧代码,多次发布无效,重启Nginx也无效,经查阅相关资料,恍然大悟,原来是把 .NET服务这茬给忘了,应该就相当于windows的程序池。
更新发布Linux平台上.NET Web项目,要重启 .NET 应用服务,不然始终运行的是内存中的旧代码。
如果使用面板,安装了Supervisor来管理.NET,可通过Supervisor重启对应 .NET 应用。

以下是AI回答,可供参考:
核心原因
职责分离:
.NET 应用 (如 ASP.NET Core) 运行在独立的进程中(通常是
dotnet YourApp.dll或由 Kestrel/Web 服务器托管)。Nginx 在这里通常充当反向代理 (Reverse Proxy)。它的作用仅仅是接收外部请求,并将其转发给后端正在运行的 .NET 进程。
配置未变:
发布操作通常只是替换了 .NET 应用的二进制文件 (
dll)、静态资源 (wwwroot) 和配置文件 (appsettings.json)。只要你的发布操作没有修改 Nginx 的配置文件 (通常位于
/etc/nginx/nginx.conf或/etc/nginx/conf.d/your-app.conf),Nginx 就完全感知不到后端代码的变化,因此不需要重启或重载。
正确的操作流程
发布 .NET 应用后的标准步骤是重启 .NET 应用服务,而不是 Nginx。
1. 如果你使用 systemd 托管 (Linux 最常见)
你需要重启承载 .NET 应用的 service。
# 假设你的服务名称是 myapp.service sudo systemctl restart myapp.service # 查看状态确保启动成功 sudo systemctl status myapp.service
此时,Nginx 会继续运行。当 .NET 应用重启完成并重新监听端口后,Nginx 转发的新请求会自动由新版本的应用处理。
2. 如果你使用 IIS (Windows)
在 Windows 上通常不使用 Nginx,而是用 IIS。如果是这种情况,发布后通常需要:
应用程序池回收:IIS 通常在检测到
web.config变化时自动回收应用程序池。或者手动重启站点。
3. 如果你使用 Docker
如果你是将 .NET 应用打包在 Docker 容器中,而 Nginx 运行在宿主机或另一个容器中:
# 重建并重启 .NET 应用容器 docker-compose up -d --build your-dotnet-service # 或者 docker restart <container-id>
Nginx 容器不需要动,因为它只是通过内部网络名称访问 .NET 容器。
什么情况下需要重启/重载 Nginx?
只有在以下少数情况才需要操作 Nginx:
修改了 Nginx 配置:你更改了反向代理规则、SSL 证书路径、缓存策略或端口映射。
命令:
sudo nginx -t(测试配置) ->sudo systemctl reload nginx(平滑重载,不中断连接)。更新了 Nginx 本身:升级了 Nginx 软件版本。
静态文件缓存问题:
如果你发布了新的静态文件 (JS/CSS/图片),但浏览器仍然显示旧版本,这通常是浏览器缓存或 Nginx 静态文件缓存的问题,而不是需要重启 Nginx。
解决方法:在文件名中加入版本号哈希 (如
app.v1.2.js),或在 Nginx 配置中调整expires指令,然后执行reload(非 restart) 清除 Nginx 自身的缓存(如果配置了的话)。
总结
发布 .NET 代码 -> 重启 .NET 服务 (
systemctl restart myapp)。Nginx -> 保持运行,无需操作。
注意:在重启 .NET 服务的几秒钟内,用户可能会遇到短暂的 502 Bad Gateway 错误,因为 Nginx 还在尝试连接正在重启的后端端口。这是正常现象,服务启动完成后会自动恢复。

