LeiTao
LeiTao
发布于 2026-10-10 / 17 阅读
0
0

.NET Core 项目部署到 Linux 服务器完整指南

.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 中。


评论