簡介
背景和優勢
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
防火牆與端口
確保託管應用使用的端口(如 5000 或 80/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
部署應用
傳輸文件
- 使用
scp或rsync將publish目錄上傳到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 輸出到文件、Syslog、ELK/EFK 或 Prometheus。
- 健康檢查
在 Startup 配置健康檢查端點 app.MapHealthChecks("/health"),並讓負載均衡器探活。
- 自動重啓
systemd 的 Restart=always 或 Kubernetes 的 livenessProbe。
- 性能分析
利用 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...