Linux 上托管 ASP.NET Core 的完整指南
使用 Kestrel 和 Nginx 在 Linux 上安全高效地部署 ASP.NET Core 应用程序的步骤和重要提示

Linux 上托管 ASP.NET Core 的完整指南

本文将教你如何在Linux上托管ASP.NET Core应用程序。学习如何安装.NET运行时环境、配置Kestrel和Nginx,并考虑安全性、优化和可扩展性。.
0 股票
0
0
0
0

 

在 Linux 上托管 ASP.NET Core — 为什么以及何时使用?

ASP.NET Core 在 Linux 系统上使用 *Kestrel* 运行良好,选择此平台进行托管可以带来诸多重要优势,包括: 降低成本、与开源工具兼容以及易于容器化 此选项适用于网站、API、后台服务以及对延迟敏感的应用程序,例如游戏和交易。.

 

前提条件和服务器选择

 

Linux 发行版和 .NET 版本

建议的分布方式包括: Ubuntu LTS (20.04/22.04)Debian(11/12), 和 CentOS Stream 或 Rocky/Alma 它们用于生产环境,适用于安全要求严格的环境。 RHEL 请使用官方的 Microsoft 运行时和 SDK(例如 .NET 6/7/8)。.

 

硬件资源和服务类型

对于网站和轻量级 API 而言,通常 1-2 个虚拟 CPU、1-4GB 内存和 NVMe 固态硬盘 够了。商业和大型应用程序 4 个以上虚拟 CPU 和 8 GB 以上内存 他们需要高速网络。.

适合低延迟的交易和游戏 最好选择靠近交易所或区域数据中心的本地化VPS。我们公司在全球拥有85多个数据中心,方便您选择最近的数据中心。.

使用图形服务器(GPU)进行人工智能/推理或渲染;我公司提供GPU云服务和高速网络计算服务器。.

为了防范攻击,可以考虑使用反 DDoS 服务器以及具有 BGP 和 CDN 的网络。.

 

基本安装和设置(.NET 运行时)——Ubuntu 示例

要安装官方 Microsoft 运行时,请添加存储库,然后安装运行时:

sudo apt update
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 dotnet-runtime-7.0

然后创建安全服务用户和应用程序目录:

sudo useradd -r -s /usr/sbin/nologin aspnetuser
sudo mkdir -p /var/www/myapp
sudo chown aspnetuser:aspnetuser /var/www/myapp

 

无容器部署 — Kestrel + systemd + Nginx

 

发布应用程序并配置 systemd

构建应用程序并将其发布到应用程序目录路径:

dotnet publish -c Release -o /var/www/myapp

systemd 的示例单元文件 /etc/systemd/system/myapp.service 地方:

[Unit]
Description=My ASP.NET Core App
After=network.target

[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll
Restart=always
# Safe User/Group
User=aspnetuser
Group=aspnetuser
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

激活并运行服务:

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo journalctl -u myapp -f

 

配置 Nginx 作为反向代理(SSL 终止)

安装 Nginx 和 Certbot:

sudo apt install -y nginx certbot python3-certbot-nginx

Nginx 配置示例 /etc/nginx/sites-available/myapp 地方:

server {
    listen 80;
    server_name example.com www.example.com;

    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;
    }
}

获取免费 SSL 证书:

sudo certbot --nginx -d example.com -d www.example.com

 

使用 Docker 和 Docker Compose 进行部署

用于生成小型优化镜像的多步骤 Dockerfile 示例:

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MyApp.dll"]

示例 docker-compose.yml 文件(您也可以使用 nginx-proxy 或 Traefik):

version: '3.8'
services:
  web:
    build: .
    ports:
      - "5000"
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
  nginx:
    image: nginx:stable
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./certs:/etc/letsencrypt

对于持续集成/持续交付 (CI/CD),可以使用 GitLab CI 或 GitHub Actions 来构建、测试镜像并将其部署到镜像仓库,然后再拉取到服务器。我们公司为私有团队提供 GitLab 托管服务。.

 

安全和最佳实践

 

网络和防火墙

仅开放必要的端口(80/443),并将 SSH 访问限制在所需的地址。.

sudo ufw allow 80,443/tcp
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp  # مثال
sudo ufw enable

 

TLS和加固

 

攻击与防御

使用 fail2ban 保护 SSH 连接并在 Nginx 中设置速率限制。对于敏感应用,请使用防 DDoS 服务器;我们公司提供基于 BGP 的防 DDoS 和 CDN 套餐。.

 

SELinux / AppArmor

在启用了 SELinux 的发行版(例如 RHEL/CentOS)上,请确保文件和端口的上下文设置正确。在其他发行版上,请使用 AppArmor 进行性能分析——不建议永久关机。.

 

性能优化和监控

 

Kestrel 调谐和连接设置

在反向代理层使用 HTTP/2 和 Keep-Alive 协议。同时考虑 Kestrel 的局限性。 appsettings.json 设置(例如 Limits.MaxConcurrentConnections、MaxRequestBodySize)。.

使用响应压缩(Brotli/Gzip)来压缩响应:

services.AddResponseCompression(options => { options.EnableForHttps = true; });

 

缓存和会议

使用 Redis 进行分布式缓存和会话状态管理,以实现横向扩展。使用 CDN 分发静态内容,以降低服务器负载。.

 

监控和日志记录

将结构化日志记录与 Serilog 或 Microsoft.Extensions.Logging 结合使用,并发送到 ELK/Graylog。对于指标,可以使用 dotnet-counters、Prometheus exporter (dotnet_exporter) 和 Grafana。Application Insights 等 APM 工具可用于跟踪。.

 

根据申请情况比较不同地点并选择合适的地点。

对于交易而言,低延迟和稳定性至关重要——选择靠近交易所或私有网络的服务器位置。对于游戏而言,建议使用区域服务器和配备高速网络的VPS游戏服务器。.

对于人工智能和渲染,建议使用配备 NVMe 和高带宽的 GPU 云和计算服务器。对于网站和应用程序,建议将服务器部署在靠近主要用户的位置,并结合 CDN 和多区域部署以提高可用性。我们公司在全球拥有 85 多个数据中心以及 CDN 和 BGP 网络。.

 

高可扩展性和可用性

使用七层负载均衡器(Nginx/HAProxy/云负载均衡器)或数据中心负载均衡器。将会话存储在 Redis 或共享数据库中。水平部署容器和虚拟机以实现自动扩展;在 Kubernetes 中使用 HPA。使用 BGP 任播和 CDN 进行全球流量分发。.

 

常见错误修复

常见病例及检查方法:

  • 502 Bad Gateway:请检查 systemd journalctl -u myapp本地端口 ss -tlnp 以及文件权限。.
  • SSL 问题:检查 certbot 续订访问证书文件夹并在 Nginx 中正确引用它。.
  • 文件/权限错误:请检查服务用户的所有者/组是否正确。.
  • 意外的运行缓慢:使用 dotnet-counters 和 profiler 查找 CPU 或 GC 瓶颈。.

 

生产(DevOps)实用技巧

  • 使用多阶段 Docker 构建来缩小镜像尺寸。.
  • 将密钥存储在密钥管理器(Vault、GitLab CI 密钥)中。.
  • 编写健康端点并配置编排器的存活/就绪状态。.
  • 使用 GitLab CI 或 GitHub Actions 执行构建/测试/部署自动化。.

 

摘要和服务内容

在 Linux 上托管 ASP.NET Core 是 Web 和 API 应用**可扩展、安全且易于扩展**的选择。为了获得高性能和高可用性,建议使用 Kestrel + Nginx 部署应用,或将其部署在带有编排器的容器中;重视 TLS 加密和安全加固;使用 Redis/数据库存储状态;并使用 CDN 分发静态内容。.

我们公司在全球拥有超过 85 个地点,提供 GPU 云、计算和专用服务器、交易和游戏 VPS、反 DDoS 基础设施、GitLab 托管、CDN 和 BGP 网络,并为 ASP.NET Core 应用程序提供不同套餐的托管和支持解决方案。.

您可能也喜欢