博客 / 詳情

返回

.NET Web 應用 Linux 部署全指南:從環境搭建到生產上線

簡介

背景和優勢

ASP.NET Core.NET Core 1.0(2016 年)起支持跨平台,Linux 部署具有以下優勢:

  • 高性能:Linux 服務器(如 Ubuntu)資源佔用低,適合高併發。
  • 成本效益:開源操作系統,降低服務器成本。
  • 生態支持:支持 MySQL、Docker、Nginx 等,適配微服務和雲原生。
  • 社區活躍:Linux 是雲部署(如 AWS、Azure)的首選。

部署方式

ASP.NET Core Web 項目在 Linux 上有以下主要部署方式:

  • 獨立部署(Self-contained):

    • 打包應用和 .NET 運行時,獨立運行。
    • 適合無 .NET 運行時的 Linux 服務器。
  • 框架依賴部署(Framework-dependent):

    • 僅打包應用,依賴服務器安裝的 .NET SDK/運行時。
    • 適合已配置 .NET 環境的服務器。
  • Docker 容器部署:

    • 使用 Docker 容器封裝應用和依賴。
    • 適合微服務、雲原生和 CI/CD
  • 雲平台部署:

    • 使用雲服務(如 Azure App Service、AWS Elastic Beanstalk)。
    • 適合快速部署和擴展。

前提條件

目標機器

  • 發行版(Ubuntu、CentOS、Debian、Alpine 等)
  • 已安裝 .NET 運行時或 SDK(建議至少 .NET 6 LTS 及以上)

.NET 安裝

# 以 Ubuntu 為例,安裝 .NET 6 運行時
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 update
sudo apt install -y aspnetcore-runtime-6.0

防火牆與端口

確保託管應用使用的端口(如 500080/443)在防火牆/安全組中開放。

發佈與運行(Self-Contained vs Framework-Dependent)

Framework-Dependent 部署

依賴目標主機已安裝 .NET 運行時,發佈包更小。

dotnet publish -c Release -o ./publish

Self-Contained 部署

包含運行時,無需預裝 .NET,但體積更大。

dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish
  • -c Release:發佈優化版本。
  • -o ./publish:輸出到 publish 目錄。
  • --self-contained true:包含 .NET 運行時。
  • -r linux-x64:目標運行時(Linux 64 位)。

運行:./publish/YourApp

部署應用

傳輸文件

  • 使用 scprsyncpublish 目錄上傳到 Linux 服務器:
scp -r ./publish user@server:/var/www/yourapp

設置權限

sudo chown -R www-data:www-data /var/www/yourapp
sudo chmod -R 755 /var/www/yourapp

直接運行(Kestrel 自託管)

啓動應用

cd yourapp
dotnet YourApp.dll        # Framework-Dependent
# 或 ./YourApp             # Self-Contained

監聽所有接口

appsettings.json 或環境變量中配置:

"Kestrel": {
  "Endpoints": {
    "Http": { "Url": "http://0.0.0.0:5000" }
  }
}

或:

export ASPNETCORE_URLS="http://0.0.0.0:5000"
dotnet YourApp.dll
  • 優點:部署簡單;
  • 缺點:缺少負載均衡、TLS 終端、日誌管理等企業特性。

使用 systemd 守護進程

將應用作為服務後台運行並隨系統啓動。

創建 systemd Unit 文件 /etc/systemd/system/kestrel-yourapp.service

[Unit]
Description=YourApp ASP.NET Core Service
After=network.target

[Service]
WorkingDirectory=/var/www/yourapp
ExecStart=/usr/bin/dotnet /var/www/yourapp/YourApp.dll
Restart=always
RestartSec=10
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://0.0.0.0:5000

[Install]
WantedBy=multi-user.target

啓動與啓用

sudo systemctl daemon-reload
sudo systemctl start kestrel-yourapp
sudo systemctl enable kestrel-yourapp
sudo journalctl -fu kestrel-yourapp

反向代理(Nginx/Apache)+ Kestrel

推薦生產環境中使用反向代理,實現靜態文件緩存、TLS 終端、路徑重寫等。

安裝 Nginx

sudo apt install -y nginx

配置 Nginx

/etc/nginx/sites-available/yourapp 中:

server {
    listen 80;
    server_name your.domain.com;

    # 將 HTTP 重定向到 HTTPS(可選)
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name your.domain.com;

    ssl_certificate     /etc/ssl/certs/your.crt;
    ssl_certificate_key /etc/ssl/private/your.key;

    location / {
        proxy_pass         http://127.0.0.1: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 /static/ {
        root /var/www/yourapp/wwwroot;
        expires 30d;
    }
}

啓用配置並重啓 Nginx

sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

容器化部署(Docker)

使用 Docker 將環境一致性和可移植性做到極致。

Dockerfile 示例

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "./"]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "YourApp.dll"]

構建與運行

docker build -t yourapp:1.0 .
docker run -d -p 80:80 --name yourapp -e ASPNETCORE_ENVIRONMENT=Production yourapp:1.0

使用 Docker Compose

version: '3.8'
services:
  web:
    image: yourapp:latest
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80"
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
    depends_on:
      - mysql
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=password
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - app-network
  nginx:
    image: nginx:latest
    ports:
        - "80:80"
    volumes:
        - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
        - web
    networks:
        - app-network  

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:

Nginx 配置(nginx.conf):

events {}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://web:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

PaaS 平台部署

若不想自管服務器,可選用雲廠商 PaaS

  • Azure App Service for Linux
  • AWS Elastic Beanstalk (Docker/.NET Core 平台)
  • Google Cloud Run (容器化)
  • Heroku (使用 Docker buildpacks)

這些平台通常只需推送代碼或鏡像,自動完成構建、運行、負載均衡與 TLS

運維與監控

  • 日誌集中

使用 Microsoft.Extensions.Logging 輸出到文件、SyslogELK/EFKPrometheus

  • 健康檢查

Startup 配置健康檢查端點 app.MapHealthChecks("/health"),並讓負載均衡器探活。

  • 自動重啓

systemdRestart=alwaysKuberneteslivenessProbe

  • 性能分析

利用 dotnet-counters、dotnet-trace、Application Insights、Prometheus + Grafana 等。

# 安裝 dotnet-counters
dotnet tool install -g dotnet-counters

# 監控應用性能
dotnet-counters monitor -n your-app --counters System.Runtime,Microsoft.AspNetCore.Http

# 安裝 dotnet-trace
dotnet tool install -g dotnet-trace

# 收集性能跟蹤
dotnet-trace collect -n your-app --format Speedscope

關鍵診斷命令

# 檢查端口監聽
sudo ss -tulpn | grep ':5000\|:5001'

# 查看應用日誌
journalctl -u your-app --since "10 minutes ago" -f

# 測試數據庫連接
psql -h localhost -U your_app_user -d your_app_db -c "SELECT 1"

# 網絡連通性測試
curl -v http://localhost:5000/health

# 分析內存使用
top -p $(pgrep -f YourApp)

最佳實踐清單

環境標準化:

  • 使用相同版本的 OS.NET 運行時
  • 配置統一的環境變量管理

安全優先:

  • 最小權限原則(非 root 用户運行)
  • 定期更新安全補丁
  • 強制 HTTPS 連接

可靠部署:

  • 使用 CI/CD 流水線自動化部署
  • 實現藍綠部署或金絲雀發佈
  • 保留上一個版本的回滾能力

性能優化:

  • 啓用 ReadyToRun 編譯
  • 配置響應壓縮
  • 使用負載均衡和水平擴展

監控告警:

  • 實現全面的健康檢查
  • 集成 APM 工具(如 Application Insights
  • 設置關鍵指標告警(CPU、內存、錯誤率)

災難恢復:

  • 定期備份數據庫和應用配置
  • 制定並測試恢復計劃
  • 多區域部署關鍵應用

小結

方式 優點 缺點
直接運行(Kestrel) 最簡單、零依賴 缺少 TLS、負載均衡
systemd 管理 穩定重啓、開機自啓 無反向代理、證書管理需額外
Nginx/Apache 反向代理 + systemd TLS 終端、路徑重寫、靜態緩存 配置略複雜
Docker 容器化 環境隔離、可移植、高度一致 學習成本、鏡像管理
雲 PaaS 最少運維、自動伸縮 平台依賴、成本相對較高

資源和文檔

官方文檔:

  • ASP.NET Core on Linux:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy...
  • Docker with ASP.NET Core:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy...
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.