Linux(Debian)下部署.NET Core网站终极指南:从零到生产级服务的深度实战!

** Debian部署.NET Core的“全栈实战”**


第一阶段:环境准备与依赖安装

1.1 系统环境要求
# 更新系统并安装基础工具  
sudo apt update && sudo apt upgrade -y  
sudo apt install -y curl nano unzip git  
1.2 安装.NET Core运行时

代码示例(Debian 11/12)

# 下载并安装Microsoft GPG密钥  
wget https://packages.microsoft.com/config/debian/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb  
sudo dpkg -i packages-microsoft-prod.deb  
rm packages-microsoft-prod.deb  

# 安装.NET 8.0 SDK(生产环境可替换为runtime)  
sudo apt update  
sudo apt install -y dotnet-sdk-8.0  

# 验证安装  
dotnet --info  # 输出应包含.NET 8.0版本  

注释解析

  • $(lsb_release -rs)动态获取Debian版本,适配不同发行版。
  • packages-microsoft-prod.deb确保包源可信,避免依赖冲突。

第二阶段:部署.NET Core应用

2.1 项目发布与传输
# 在本地开发环境执行(以WebAPI为例)  
dotnet publish -c Release -o ./publish  

# 传输到Debian服务器(假设IP为192.168.1.100)  
scp -r ./publish/* [email protected]:/var/www/myapp/  
2.2 配置运行权限
# 进入部署目录  
cd /var/www/myapp  

# 赋予执行权限(关键步骤!)  
sudo chmod +x ./myapp.dll  

# 验证运行(调试模式)  
dotnet ./myapp.dll  

注释解析

  • chmod +x确保DLL可执行,避免“command not found”错误。
  • 直接运行可快速验证端口占用及配置问题。

第三阶段:Systemd服务配置

3.1 创建服务文件
# 创建systemd服务文件  
sudo nano /etc/systemd/system/myapp.service  

服务配置代码

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

[Service]  
User=www-data  
WorkingDirectory=/var/www/myapp  
ExecStart=/usr/bin/dotnet /var/www/myapp/myapp.dll  
Restart=always  
RestartSec=10  
SyslogIdentifier=myapp  
Environment=ASPNETCORE_ENVIRONMENT=Production  

[Install]  
WantedBy=multi-user.target  

注释解析

  • User=www-data使用专用用户运行,提升安全性。
  • Restart=always确保崩溃后自动重启。
  • Environment设置生产环境变量。

3.2 启动与监控服务
# 重载systemd配置  
sudo systemctl daemon-reload  

# 启动服务并设置开机自启  
sudo systemctl enable myapp  
sudo systemctl start myapp  

# 查看日志(关键调试步骤)  
sudo journalctl -u myapp -f  

第四阶段:Nginx反向代理与SSL配置

4.1 安装并配置Nginx
sudo apt install -y nginx  

# 创建Nginx配置文件  
sudo nano /etc/nginx/sites-available/myapp.conf  

Nginx配置代码

server {  
    listen 80;  
    server_name yourdomain.com;  

    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_cache_bypass $http_upgrade;  
    }  
}  

注释解析

  • proxy_pass指向本地Kestrel端口。
  • proxy_set_header确保WebSockets等协议正常工作。
4.2 配置SSL(Let’s Encrypt)
# 安装Certbot  
sudo apt install -y certbot python3-certbot-nginx  

# 申请并配置SSL证书  
sudo certbot --nginx -d yourdomain.com  

# 自动续期配置  
sudo systemctl enable certbot.timer  

注释解析

  • certbot --nginx自动更新Nginx配置为HTTPS。
  • certbot.timer确保证书自动续期。

第五阶段:安全加固与性能优化

5.1 防火墙配置(UFW)
# 开放HTTP/HTTPS及SSH端口  
sudo ufw allow 22/tcp  
sudo ufw allow 80/tcp  
sudo ufw allow 443/tcp  

# 启用防火墙  
sudo ufw enable  
sudo ufw status  
5.2 性能优化:Kestrel配置
// 在appsettings.Production.json中配置  
{  
  "Kestrel": {  
    "Endpoints": {  
      "Http": {  
        "Url": "http://0.0.0.0:5000"  
      },  
      "Https": {  
        "Url": "https://0.0.0.0:5001",  
        "Certificate": {  
          "Path": "/etc/letsencrypt/live/yourdomain.com/fullchain.pem",  
          "KeyPath": "/etc/letsencrypt/live/yourdomain.com/privkey.pem"  
        }  
      }  
    }  
  }  
}  

注释解析

  • 直接使用Let’s Encrypt证书路径,避免手动复制。
  • 0.0.0.0监听所有IP,确保Nginx反向代理可达。

第六阶段:故障排查与常见问题

6.1 依赖项缺失问题
# 安装缺失的系统库(如libicu)  
sudo apt install -y libc6 libgcc1 libgssapi-krb5-2 libicu72 libssl3 libstdc++6 zlib1g  

# 若使用System.Drawing.Common需额外安装  
sudo apt install -y libgdiplus  
6.2 端口冲突排查
# 检查端口占用  
sudo netstat -tulnp | grep 5000  

# 杀死占用进程(如PID=1234)  
sudo kill -9 1234  

第七阶段:国产化环境适配(如麒麟系统)

7.1 银河麒麟系统部署
# 手动安装ARM64版本.NET SDK  
wget https://dotnetcli.blob.core.windows.net/dotnet/Sdk/8.0.100/dotnet-sdk-8.0.100-linux-arm64.tar.gz  
tar zxf dotnet-sdk-8.0.100-linux-arm64.tar.gz -C ~/dotnet  

# 设置环境变量  
echo 'export DOTNET_ROOT=$HOME/dotnet' >> ~/.bashrc  
echo 'export PATH=$PATH:$HOME/dotnet' >> ~/.bashrc  
source ~/.bashrc  

注释解析

  • ARM架构需下载专用SDK包,避免x64依赖错误。
  • 环境变量需手动配置,确保全局可用。

第八阶段:自动化部署脚本

8.1 一键部署脚本(Golang编写)
package main  

import (  
    "os/exec"  
    "fmt"  
)  

func main() {  
    commands := []string{  
        "apt update && apt upgrade -y",  
        "wget https://packages.microsoft.com/config/debian/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb",  
        "dpkg -i packages-microsoft-prod.deb && rm packages-microsoft-prod.deb",  
        "apt install -y dotnet-sdk-8.0 nginx certbot ufw",  
        // ...(其他步骤)  
    }  

    for _, cmd := range commands {  
        _, err := exec.Command("bash", "-c", cmd).Output()  
        if err != nil {  
            fmt.Printf("Error: %v\n", err)  
            return  
        }  
    }  
    fmt.Println("部署完成!")  
}  

注释解析

  • 使用Go语言编写脚本,跨平台且高效。
  • 可通过go run deploy.go一键执行全流程。

你可能感兴趣的:(C#学习资料,linux,debian,.netcore)