在服务器上部署 .NET 网站(通常指 ASP.NET Core 应用)是一个标准且高效的过程,由于 .NET Core/.NET 5+ 是跨平台的,你可以选择 Windows Server 或 Linux (Ubuntu/CentOS) 作为部署环境。
以下是完整的部署指南,分为 准备阶段、Linux 部署(推荐)、Windows 部署 和 生产环境最佳实践。
第一步:准备工作
-
发布应用 (Publish)
在本地开发机器或 CI/CD 流水线中,将项目发布为独立部署包。# 在终端执行 dotnet publish -c Release -o ./publish
-c Release:发布发布版本。-o ./publish:输出到publish文件夹。- 如果希望包含运行时(无需在服务器安装 .NET SDK/Runtime),可以添加
-r linux-x64等运行时标识符。
-
准备服务器环境
- 确保服务器已安装 .NET Runtime(注意:生产环境只需 Runtime,不需要 SDK)。
- 确保服务器防火墙开放了相应的端口(如 80, 443, 5000 等)。
第二步:Linux 服务器部署 (Ubuntu/CentOS)
这是目前最主流、性能最好的部署方式。
上传文件
使用 scp 或 rsync 将发布文件夹上传到服务器:
scp -r ./publish user@your-server-ip:/var/www/yourapp
安装 .NET Runtime (如果未安装)
以 Ubuntu 22.04 为例(.NET 8):
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update sudo apt-get install -y apt-transport-https sudo apt-get update sudo apt-get install -y aspnetcore-runtime-8.0
创建 Systemd 服务 (推荐)
使用 systemd 管理应用进程,确保应用开机自启、崩溃后自动重启。
创建服务文件:
sudo nano /etc/systemd/system/yourapp.service
根据实际路径修改):
[Unit] Description=My .NET Web App After=network.target [Service] WorkingDirectory=/var/www/yourapp ExecStart=/usr/bin/dotnet /var/www/yourapp/YourApp.dll Restart=always # 如果应用崩溃,5秒后重启 RestartSec=5 # 指定用户运行(可选,建议创建专用用户) User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start yourapp sudo systemctl enable yourapp # 查看日志 sudo journalctl -u yourapp -f
第三步:Windows Server 部署
安装 .NET Runtime
从微软官网下载并安装 .NET Runtime(非 SDK)。
上传文件
将 publish 文件夹复制到服务器,C:inetpubwwwrootYourApp。
使用 IIS 托管 (最常见)
- 打开 IIS 管理器。
- 创建一个新的 网站,指向你的物理路径。
- 确保安装了 ASP.NET Core Hosting Bundle(它包含 .NET Runtime 和 IIS 模块)。
- 在 IIS 中,确保网站绑定正确的端口(如 80 或 443)。
- 应用程序池设置:
- 将“.NET 无托管代码”改为 “无托管代码” (No Managed Code)。
- 确保应用池身份有权限读取该文件夹。
使用 Kestrel + 进程守护 (替代 IIS)
如果你不想用 IIS,可以在 Windows 上使用 nssm (Non-Sucking Service Manager) 将 dotnet.exe 注册为 Windows 服务。
第四步:反向代理与 HTTPS (生产环境必备)
无论使用 Linux 还是 Windows,不建议直接暴露 Kestrel/IIS 到公网,应使用 Nginx 或 Apache 作为反向代理,处理 SSL 证书、静态文件缓存和负载均衡。
示例:Nginx 配置 (Linux)
安装 Nginx 后,编辑配置文件:
sudo nano /etc/nginx/sites-available/yourapp
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:5000; # 你的 .NET 应用监听端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用配置并重启 Nginx:
sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx
HTTPS 配置
使用 Certbot 免费获取 Let’s Encrypt 证书:
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d yourdomain.com
第五步:最佳实践与注意事项
-
环境变量
- 生产环境务必设置
ASPNETCORE_ENVIRONMENT=Production。 - 这会禁用详细的错误页面,提升安全性。
- 敏感信息(如数据库连接字符串)应通过 环境变量 或 Azure Key Vault / AWS Secrets Manager 管理,不要硬编码在
中。appsettings.json
- 生产环境务必设置
日志记录
- 使用 Serilog、NLog 或内置的
ILogger将日志输出到文件、Seq、ELK 或 Application Insights。 - 不要依赖控制台输出进行生产调试。
- 使用 Serilog、NLog 或内置的
-
静态文件
- 确保
app.UseStaticFiles()在Program.cs中正确配置。 - 如果前端是 Vue/React,确保构建后的
wwwroot文件夹已包含在前端构建产物中。
- 确保
-
健康检查 (Health Checks)
- 在
Program.cs中添加健康检查端点,供负载均衡器或监控系统探测应用是否存活。builder.Services.AddHealthChecks(); app.MapHealthChecks("/health");
- 在
-
数据库迁移
- 确保在应用启动时执行数据库迁移(EF Core Migrations),或在部署脚本中手动运行
dotnet ef database update。
- 确保在应用启动时执行数据库迁移(EF Core Migrations),或在部署脚本中手动运行
-
监控
- 集成 Application Insights (Azure) 或 Prometheus + Grafana 进行性能监控和异常追踪。
常见问题排查
- 502 Bad Gateway:通常是 Kestrel 未启动、端口被占用或防火墙阻止,检查
systemctl status yourapp和netstat -tulpn。 - 权限问题:确保运行 .NET 应用的用户有权限读取发布文件夹和写入日志/临时文件。
- 时区问题:Linux 服务器默认 UTC,如需本地时间,需设置
TZ环境变量或修改系统时区。
如果你能提供具体的服务器类型(Windows/Linux)和 .NET 版本,我可以给出更精确的命令和配置。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/476943.html



