Rocky Linux 9 上部署一个 ASP.NET Core 应用程序(如 Web API 或 Web App),需要完成以下关键步骤:

✅ 假设你已有一个发布好的 ASP.NET Core 程序(.dll 文件)
✅ 目标:以 systemd 服务 方式运行,配合 Nginx 反向代理,支持开机自启、日志管理、HTTPS(可选)


🧰 一、前提条件

  1. Rocky Linux 9 已安装并联网
  2. 已安装 .NET 8 Runtime(或 SDK)
  3. 你的 ASP.NET Core 应用已发布(可通过 dotnet publish -c Release 生成)

🔧 第一步:安装 .NET 8 运行时(如未安装)

# 添加 Microsoft 仓库
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/9/packages-microsoft-prod.rpm

# 安装 ASP.NET Core 8 运行时
sudo dnf install -y aspnetcore-runtime-8.0

# 验证
dotnet --list-runtimes

📂 第二步:部署应用程序文件

1. 创建应用目录

sudo mkdir -p /var/www/myapp

2. 将发布文件复制到服务器(通过 scp、rsync 或 Git)

# 示例:从本地复制(在你开发机上执行)
scp -r ./bin/Release/net8.0/publish/* user@your-server:/var/www/myapp/

💡 发布命令(在开发机):

dotnet publish -c Release -o ./publish

3. 设置权限(安全最佳实践)

# 创建专用用户(不要用 root 运行!)
sudo useradd -r -s /sbin/nologin myappuser

# 授权
sudo chown -R myappuser:myappuser /var/www/myapp
sudo chmod -R 755 /var/www/myapp

⚙️ 第三步:创建 systemd 服务(实现后台运行 + 开机自启)

创建服务文件:

sudo tee /etc/systemd/system/myapp.service <<EOF
[Unit]
Description=My ASP.NET Core App
After=network.target

[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/YourAppName.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myapp
User=myappuser
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

# 可选:设置环境变量(如数据库连接字符串)
# Environment=ConnectionStrings__DefaultConnection=Server=...

[Install]
WantedBy=multi-user.target
EOF

🔁 替换 YourAppName.dll 为你的实际 DLL 名称(如 MyWebApi.dll

启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service

查看状态和日志

# 检查状态
sudo systemctl status myapp

# 实时日志
sudo journalctl -u myapp -f

✅ 此时你的应用已在 http://localhost:5000(默认端口)运行


🌐 第四步:配置 Nginx 反向代理(推荐)

1. 安装 Nginx

sudo dnf install -y nginx
sudo systemctl enable --now nginx

2. 创建站点配置

sudo tee /etc/nginx/conf.d/myapp.conf <<EOF
server {
    listen 80;
    server_name your-domain.com;  # 或服务器公网 IP

    location / {
        proxy_pass http://localhost:5000;  # 转发到 Kestrel
        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-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_cache_bypass \$http_upgrade;
        proxy_buffering off;
    }
}
EOF

🔁 替换 your-domain.com 为你的域名或 IP

3. 测试并重载 Nginx

sudo nginx -t && sudo systemctl reload nginx

现在可通过 http://your-server-ip/ 访问你的应用!


🔒 第五步:(可选)启用 HTTPS(Let's Encrypt)

# 安装 certbot
sudo dnf install -y certbot python3-certbot-nginx

# 获取证书并自动配置 HTTPS
sudo certbot --nginx -d your-domain.com

# 自动续期(已自动配置 cron)
sudo certbot renew --dry-run

✅ 完成后,Nginx 会自动重定向 HTTP → HTTPS


🛡️ 安全加固建议

  1. 防火墙放行 80/443

    sudo firewall-cmd --permanent --add-service={http,https}
    sudo firewall-cmd --reload
    
  2. 禁止直接访问 Kestrel 端口(5000)

    sudo firewall-cmd --permanent --remove-port=5000/tcp
    
  3. 定期更新系统和 .NET

    sudo dnf update -y
    

🧪 验证部署是否成功

curl http://localhost          # 应返回网页内容
curl -I http://your-domain.com # 检查 HTTP 状态码

🗑️ 卸载(如需)

# 停止并删除服务
sudo systemctl disable --now myapp
sudo rm /etc/systemd/system/myapp.service

# 删除应用文件
sudo rm -rf /var/www/myapp

# 删除 Nginx 配置
sudo rm /etc/nginx/conf.d/myapp.conf
sudo systemctl reload nginx

✅ 总结架构

Internet
   ↓
[Firewall: 80/443]
   ↓
Nginx (反向代理 + SSL)
   ↓
Kestrel (.NET Core App on localhost:5000)
   ↓
Your ASP.NET Core Application