在VPS上高级部署C# (.NET) 应用程序:分步指南
在VPS上部署C#应用程序不仅仅是把文件复制到服务器上。对于生产环境,需要进行全面的配置:从反向代理配置到部署自动化。在本文中,我们将介绍经验丰富的开发人员使用的高级部署技术。您将学习如何配置Nginx、连接HTTPS、实施CI/CD和监控。
1. 服务器准备和安装 .NET Runtime
在开始部署之前,请确保您的VPS运行的是Ubuntu 22.04或更高版本。通过SSH连接并执行基本配置。
# 更新系统sudo apt update && sudo apt upgrade -y
# 安装 .NET SDK(用于构建)和 Runtime(用于运行)wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.shchmod +x dotnet-install.shsudo ./dotnet-install.sh --channel 8.0 --install-dir /usr/share/dotnetsudo ln -s /usr/share/dotnet/dotnet /usr/local/bin/dotnet
# 检查安装dotnet --list-runtimes对于生产环境,建议仅使用Runtime,以减小镜像大小。SDK仅在构建机器上需要(例如,在CI/CD中)。
2. 针对生产环境优化应用程序
在部署之前,配置应用程序以在生产环境中运行。这包括Kestrel配置、日志记录和错误处理。
2.1. 配置 Program.cs
在 Program.cs 文件中,指定显式端口并启用HTTPS重定向(如果使用反向代理)。
var builder = WebApplication.CreateBuilder(args);
// 配置Kestrel以通过反向代理工作builder.WebHost.ConfigureKestrel(options =>{ options.Listen(IPAddress.Any, 5000); // Nginx的HTTP端口});
// 添加服务builder.Services.AddControllersWithViews();builder.Services.AddHealthChecks();
var app = builder.Build();
// 生产环境的中间件if (!app.Environment.IsDevelopment()){ app.UseExceptionHandler("/Home/Error"); app.UseHsts();}
app.UseStaticFiles();app.UseRouting();app.UseAuthorization();
app.MapHealthChecks("/health");app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();2.2. 构建和发布
将应用程序构建为自包含(self-contained),以不依赖于服务器上安装的Runtime。
dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish此命令将创建一个包含所有必要文件的 publish 文件夹。使用 scp 或 rsync 将其传输到服务器。
3. 配置Nginx作为反向代理
Nginx将接收传入请求并将其转发到您的C#应用程序。这提高了性能和安全性。
3.1. 安装和基本配置
sudo apt install nginx -ysudo systemctl start nginxsudo systemctl enable nginx为您的应用程序创建配置文件:
sudo nano /etc/nginx/sites-available/myapp粘贴以下代码:
server { listen 80; server_name your-domain.com www.your-domain.com;
location / { proxy_pass http://localhost:5000; 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; }
location /health { access_log off; return 200 "Healthy"; add_header Content-Type text/plain; }}激活站点并重启Nginx:
<