ASP.NET 8 在 Linux 下的部署完全指南

全面详解 ASP.NET 8 在 Linux 环境下的部署流程,涵盖 SDK 安装、项目发布、Nginx 反向代理、systemd 服务配置、性能优化及常见问题解决

ASP.NET 8 在 Linux 下的部署完全指南

ASP.NET 8 Linux Deploy

ASP.NET 8 是微软推出的最新主要版本,带来了显著的性能提升和新特性。随着 .NET Core 的跨平台特性,现在可以无缝地在 Linux 系统上部署和运行 ASP.NET 8 应用。本文将详细介绍如何在 Linux 环境下部署 ASP.NET 8 Web 应用。

目录

准备工作

系统要求

  • Linux 发行版:Ubuntu 20.04+, Debian 11+, CentOS 8+, Rocky Linux 8+
  • 内存:至少 512MB(推荐 1GB+)
  • 磁盘空间:至少 500MB 用于 .NET runtime

以 Ubuntu 22.04 为例

本文将以 Ubuntu 22.04 作为主要演示系统,其他发行版的安装步骤大同小异。

安装 .NET 8 SDK

Ubuntu/Debian 系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 导入微软 GPG 密钥
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

# 更新包索引
sudo apt-get update

# 安装 .NET 8 SDK
sudo apt-get install -y dotnet-sdk-8.0

# 验证安装
dotnet --version

CentOS/Rocky Linux 系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 安装 wget 和 gnupg(如果尚未安装)
sudo dnf install -y wget gnupg

# 注册 Microsoft 仓库
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-prod]\nname=Microsoft Packages\nbaseurl=https://packages.microsoft.com/yumrepos/\n[gpgkey=https://packages.microsoft.com/keys/microsoft.asc]\nenabled=1" > /etc/yum.repos.d/packages-microsoft-prod.repo'

# 安装 .NET 8 SDK
sudo dnf install -y dotnet-sdk-8.0

# 验证安装
dotnet --version

创建并测试项目

创建示例项目

1
2
3
4
5
6
# 创建 .NET 8 项目
dotnet new webapp -n MyFirstApp -o ./MyFirstApp
cd MyFirstApp

# 在本地测试运行
dotnet run

应用将在 http://localhost:5000http://localhost:5001 启动。

发布应用

1
2
3
4
5
# 发布为自包含或依赖框架的应用
dotnet publish -c Release -o ./publish --self-contained false

# 查看发布内容
ls -la ./publish

部署到 Linux 服务器

方法一:通过 SCP 传输

1
2
3
4
5
6
# 在本地机器上执行
# 复制发布内容到服务器
scp -r ./publish user@your-server:/var/www/myapp

# 或使用 rsync
rsync -avz -e ssh ./publish/ user@your-server:/var/www/myapp/

方法二:使用 Git 部署

1
2
3
4
5
6
7
# 在服务器上克隆仓库
git clone https://github.com/yourusername/your-repo.git /var/www/myapp
cd /var/www/myapp

# 安装依赖并发布
dotnet restore
dotnet publish -c Release -o ./publish

方法三:使用 Docker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 创建 Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyFirstApp.csproj", "."]
RUN dotnet restore "MyFirstApp.csproj"
COPY . .
RUN dotnet publish "MyFirstApp.csproj" -c Release -o /app/publish /p:UseAppHost=false

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

配置 Nginx 反向代理

Nginx 是常用的反向代理服务器,可以提供以下功能:

  • 负载均衡
  • SSL/TLS 终止
  • 缓存静态内容
  • 请求过滤

安装 Nginx

1
2
3
4
5
# Ubuntu/Debian
sudo apt-get install -y nginx

# CentOS/Rocky
sudo dnf install -y nginx

配置 Nginx

创建配置文件 /etc/nginx/sites-available/myapp:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen 80;
    server_name 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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 60s;
    }

    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

启用站点

1
2
3
4
5
6
7
8
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重新加载 Nginx
sudo systemctl reload nginx

使用 systemd 管理服务

systemd 是 Linux 的标准初始化系统,可以用来管理 .NET 应用。

创建服务文件

创建 /etc/systemd/system/myapp.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Unit]
Description=My ASP.NET 8 Application
After=network.target

[Service]
Type=notify
User=www-data
Group=www-data
WorkingDirectory=/var/www/myapp
Environment ASPNETCORE_ENVIRONMENT=Production
Environment DOTNET_PRINT_TELEMETRY_MESSAGE=false
ExecStart=/usr/bin/dotnet /var/www/myapp/publish/MyFirstApp.dll
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
WatchdogSec=30s
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

[Install]
WantedBy=multi-user.target

管理服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启用服务(开机自启动)
sudo systemctl enable myapp

# 启动服务
sudo systemctl start myapp

# 查看服务状态
sudo systemctl status myapp

# 停止服务
sudo systemctl stop myapp

# 查看日志
sudo journalctl -u myapp -f

性能优化建议

1. 启用服务器端压缩

Program.cs 中启用压缩:

1
2
3
4
5
builder.Services.AddResponseCompression(opts =>
{
    opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "application/octet-stream" });
});

2. 配置内存缓存

1
2
builder.Services.AddMemoryCache();
builder.Services.AddDistributedMemoryCache();

3. 启用 Kestrel 性能优化

1
2
3
4
5
6
7
builder.WebHost.UseKestrel(options =>
{
    options.Limits.MaxConcurrentConnections = 100;
    options.Limits.MaxConcurrentUpgradedConnections = 100;
    options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
    options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});

4. 使用连接池

1
2
// 配置 HttpClient 连接池
services.AddSingleton<IHttpClientFactory, HttpClientFactory>();

5. 启用运行时优化

设置环境变量:

1
2
3
export DOTNET_gcServer=1
export DOTNET_TieredPG=1
export DOTNET_ReadyToRun=1

常见问题解决

问题 1: 找不到 dotnet 命令

症状: 安装后运行 dotnet --version 提示命令不存在

解决方案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 检查 PATH 环境变量
echo $PATH

# 添加 dotnet 到 PATH
export DOTNET_ROOT=/usr/share/dotnet
export PATH=$PATH:$DOTNET_ROOT

# 永久生效
echo 'export DOTNET_ROOT=/usr/share/dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$DOTNET_ROOT' >> ~/.bashrc
source ~/.bashrc

问题 2: 权限错误

症状: 服务启动时提示权限错误

解决方案:

1
2
3
4
5
# 确保目录所有权正确
sudo chown -R www-data:www-data /var/www/myapp

# 设置适当的权限
sudo chmod -R 755 /var/www/myapp

问题 3: Nginx 反向代理问题

症状: 502 Bad Gateway 错误

解决方案:

1
2
3
4
5
6
7
8
# 检查 .NET 应用是否运行
sudo systemctl status myapp

# 查看 Nginx 错误日志
sudo tail -f /var/log/nginx/error.log

# 确保端口正确
netstat -tulpn | grep 5000

问题 4: 内存泄漏

症状: 服务运行一段时间后内存占用持续增长

解决方案:

  1. 启用 Application Insights 监控
  2. 定期重启服务
  3. 使用 dotnet-counters 工具监控
1
2
3
4
5
# 安装监控工具
dotnet tool install -g dotnet-counters

# 监控进程
dotnet counters monitor <process-id>

安全建议

1. 启用 HTTPS

1
2
3
# 使用 Let's Encrypt
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com

2. 配置防火墙

1
2
3
4
5
# Ubuntu 使用 ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

3. 环境变量管理

1
2
3
4
5
6
7
8
9
# 创建环境变量文件
sudo nano /etc/myapp.env

# 添加敏感信息
ASPNETCORE_Kestrel__Certificates__Default__Password=yourpassword
ASPNETCORE_Kestrel__Certificates__Default__Path=/etc/myapp/cert.pfx

# 在 systemd 服务文件中引用
EnvironmentFile=/etc/myapp.env

监控和日志

使用 Application Insights

1
builder.Services.AddApplicationInsightsTelemetry();

配置日志

1
2
3
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
builder.Logging.AddDebug();

使用 Serilog

1
2
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File
1
2
3
4
// Program.cs
UseSerilog((context, services, cfg) => cfg
    .WriteTo.Console()
    .WriteTo.File("logs/myapp-.txt", rollingInterval: RollingInterval.Day));

总结

本文详细介绍了在 Linux 系统上部署 ASP.NET 8 应用的完整流程:

  1. ✅ 安装 .NET 8 SDK
  2. ✅ 创建和测试项目
  3. ✅ 发布应用
  4. ✅ 传输到服务器
  5. ✅ 配置 Nginx 反向代理
  6. ✅ 使用 systemd 管理服务
  7. ✅ 性能优化和安全配置

ASP.NET 8 在 Linux 上的部署现在已经非常成熟和稳定,适合生产环境使用。通过本文的步骤,你可以快速搭建一个可靠的 ASP.NET 8 应用部署环境。

参考资料


发布日期: 2024 年 标签: ASP.NET, .NET 8, Linux, 部署,Web 开发 类别: 技术教程

comments powered by Disqus
使用 Hugo 构建😊 主题 StackJimmy 设计