.NET Core 项目部署到 Linux 服务器
一、环境准备
1. 安装 .NET Runtime / SDK
在 Ubuntu 22.04 上安装 .NET 8:
# 安装 Microsoft 包仓库
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
rm packages-microsoft-prod.deb
# 安装 .NET SDK 8.0
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-8.0
# 或仅安装 Runtime(生产环境)
sudo apt-get install -y aspnetcore-runtime-8.0
# 验证
dotnet --version
dotnet --info
2. 安装 Nginx(反向代理)
sudo apt-get install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
二、发布项目
1. 本地发布
# 发布 Release 版本
dotnet publish -c Release -o ./publish
# 指定运行时(独立部署)
dotnet publish -c Release -r linux-x64 --self-contained -o ./publish
# 框架依赖部署(FDD)
dotnet publish -c Release -o ./publish --no-self-contained
两种部署方式对比:
| 特性 | 框架依赖 (FDD) | 独立部署 (SCD) |
|---|---|---|
| 需要安装 Runtime | 是 | 否 |
| 发布包大小 | 小(~20MB) | 大(~80MB+) |
| 版本管理 | 集中管理 | 每个应用独立 |
| 推荐场景 | 服务器多应用 | 容器/独立环境 |
2. 上传到服务器
# 使用 scp
scp -r ./publish/ user@server:/var/www/myapp/
# 或使用 rsync
rsync -avz --delete ./publish/ user@server:/var/www/myapp/
三、配置 Systemd 服务
1. 创建服务文件
sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=My .NET Core Application
After=network.target
[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000
Environment=ConnectionStrings__Default=Server=localhost;Database=mydb;User=root;Password=secret;
[Install]
WantedBy=multi-user.target
2. 启动服务
# 重新加载 systemd
sudo systemctl daemon-reload
# 启动并设置开机自启
sudo systemctl start myapp
sudo systemctl enable myapp
# 查看状态
sudo systemctl status myapp
# 查看日志
sudo journalctl -u myapp -f --no-pager
四、配置 Nginx 反向代理
1. 创建 Nginx 配置
sudo vim /etc/nginx/sites-available/myapp
server {
listen 80;
server_name example.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;
}
}
2. 启用配置
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置
sudo systemctl reload nginx
3. 配置 HTTPS
# 安装 Certbot
sudo apt-get install -y certbot python3-certbot-nginx
# 自动配置 SSL
sudo certbot --nginx -d example.com
五、Docker 部署方式
1. Dockerfile
# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "./"]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish --no-restore
# 运行阶段
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
ENV ASPNETCORE_URLS=http://+:8080
ENV ASPNETCORE_ENVIRONMENT=Production
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]
2. 构建并运行
docker build -t myapp:latest .
docker run -d --name myapp -p 8080:8080 --restart unless-stopped myapp:latest
六、部署检查清单
- 防火墙仅开放必要端口(80、443)
- 日志目录有写权限
- appsettings.Production.json 配置正确
- 数据库连接字符串使用环境变量注入
- 配置了 HTTPS 证书
- systemd 服务设置了
Restart=always - 日志轮转配置(避免磁盘撑满)
- 健康检查接口可访问
提示:生产环境务必将敏感信息(数据库密码、API 密钥)通过环境变量或密钥管理工具注入,不要硬编码在 appsettings.json 中。