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:5000 或 http://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: 内存泄漏
症状: 服务运行一段时间后内存占用持续增长
解决方案:
- 启用 Application Insights 监控
- 定期重启服务
- 使用
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 应用的完整流程:
- ✅ 安装 .NET 8 SDK
- ✅ 创建和测试项目
- ✅ 发布应用
- ✅ 传输到服务器
- ✅ 配置 Nginx 反向代理
- ✅ 使用 systemd 管理服务
- ✅ 性能优化和安全配置
ASP.NET 8 在 Linux 上的部署现在已经非常成熟和稳定,适合生产环境使用。通过本文的步骤,你可以快速搭建一个可靠的 ASP.NET 8 应用部署环境。
参考资料
发布日期: 2024 年
标签: ASP.NET, .NET 8, Linux, 部署,Web 开发
类别: 技术教程