.NET Core 应用主流部署方式有 Windows IIS 、Linux 直接部署 、Docker 容器化,以下是从发布到上线的全流程实战教程,覆盖生产环境常用配置与避坑要点。
一、发布应用(所有部署方式通用)
1. 发布命令(推荐)
在项目根目录执行,生成可部署的 publish 文件夹:
bash
# 框架依赖发布(轻量,服务器需安装对应.NET Runtime)
dotnet publish -c Release -r [运行时] --self-contained false -o ./publish
# 自包含发布(无需服务器装Runtime,体积大)
dotnet publish -c Release -r [运行时] --self-contained true -o ./publish
- 运行时:Windows 用
win-x64,Linux 用linux-x64 - 示例(Windows 框架依赖):
dotnet publish -c Release -r win-x64 --self-contained false -o ./publish
2. Visual Studio 可视化发布
- 右键项目 → 选择 发布
- 目标选 文件夹 → 配置发布路径(如
bin/Release/net8.0/publish) - 点击 发布,生成部署文件包
二、部署到 Windows IIS(最常用)
1. 服务器环境准备
(1)安装 IIS
- 控制面板 → 程序 → 启用或关闭 Windows 功能
- 勾选 Internet Information Services ,展开并勾选:
- Web 管理工具 → IIS 管理控制台
- 万维网服务 → 应用程序开发功能 → ASP.NET Core 模块(后续安装托管包自动补全)
(2)安装 .NET Core 托管捆绑包(必装)
- 下载对应版本:.NET 托管捆绑包(选 Hosting Bundle)
- 安装后重启 IIS:命令行执行
iisreset或net stop was /y && net start w3svc
2. IIS 配置(核心)
(1)创建应用程序池
- 打开 IIS 管理器 → 应用程序池 → 右键 添加应用程序池
- 名称自定义(如
NetCorePool) - .NET CLR 版本 选 无托管代码(关键!Core 应用不依赖 CLR)
- 托管管道模式 选 集成
- 高级设置:启动模式 → 始终运行,闲置超时 → 0(避免冷启动)
(2)创建网站
- 右键 站点 → 添加网站
- 网站名称:自定义(如
NetCoreWeb) - 物理路径:指向发布的
publish文件夹 - 绑定:IP/端口/主机名(如
http:*:80) - 应用程序池:选择刚创建的
NetCorePool - 确定后,右键网站 → 管理网站 → 启动
3. 常见问题排查
- 500 错误:检查应用池权限(给
publish文件夹添加IIS_IUSRS读写权限) - 404 错误:确认物理路径指向
publish而非项目根目录,检查端口占用 - 模块缺失:重新安装托管捆绑包并重启 IIS
三、部署到 Linux(Ubuntu/CentOS)
1. 服务器环境准备
(1)安装 .NET Runtime
bash
# Ubuntu
sudo apt-get update && sudo apt-get install -y aspnetcore-runtime-8.0
# CentOS
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install -y aspnetcore-runtime-8.0
(2)上传发布文件
bash
# 本地执行,将 publish 文件夹上传到服务器
scp -r ./publish root@服务器IP:/var/www/NetCoreApp
2. 启动与守护(生产必备)
(1)直接启动(测试)
bash
cd /var/www/NetCoreApp
dotnet 你的项目名.dll --urls http://0.0.0.0:5000
# 访问:http://服务器IP:5000
(2)配置 systemd 服务(后台守护,推荐)
- 创建服务文件:
sudo vim /etc/systemd/system/netcoreapp.service - 写入配置:
ini
[Unit]
Description=.NET Core Web App
After=network.target
[Service]
WorkingDirectory=/var/www/NetCoreApp
ExecStart=/usr/bin/dotnet /var/www/NetCoreApp/你的项目名.dll
Restart=always
RestartSec=5
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
- 启动服务并设置开机自启:
bash
sudo systemctl daemon-reload
sudo systemctl start netcoreapp
sudo systemctl enable netcoreapp
# 查看状态:sudo systemctl status netcoreapp
(3)Nginx 反向代理(生产标配)
- 安装 Nginx:
sudo apt-get install nginx - 配置站点:
sudo vim /etc/nginx/sites-available/netcoreapp
nginx
server {
listen 80;
server_name 你的域名;
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_cache_bypass $http_upgrade;
}
}
- 启用配置并重启 Nginx:
bash
sudo ln -s /etc/nginx/sites-available/netcoreapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx
四、Docker 容器化部署(跨平台,环境一致)
1. 编写 Dockerfile(项目根目录)
dockerfile
# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o /app/publish
# 运行阶段(轻量镜像)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 80
ENTRYPOINT ["dotnet", "你的项目名.dll"]
2. 构建与运行
bash
# 构建镜像(末尾. 表示当前目录)
docker build -t netcoreapp:1.0 .
# 运行容器(端口映射:主机8080→容器80)
docker run -d -p 8080:80 --name netcore-container netcoreapp:1.0
# 访问:http://服务器IP:8080
3. Docker Compose 部署(多服务推荐)
创建 docker-compose.yml:
yaml
version: '3.8'
services:
netcoreapp:
build: .
ports:
- "8080:80"
restart: always
启动:docker-compose up -d
五、生产环境关键配置
- 环境变量 :设置
ASPNETCORE_ENVIRONMENT=Production,关闭开发模式敏感信息 - 日志:配置 Serilog/NLog,输出到文件/ELK,便于排查问题
- HTTPS:IIS 绑定 SSL 证书,Linux 用 Let's Encrypt 配置 Nginx HTTPS
- 防火墙:开放对应端口(80/443/5000),禁止未授权访问
- 监控:集成 Prometheus+Grafana 监控应用性能与健康状态
六、部署方式对比
| 部署方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Windows IIS | 配置简单、Windows 生态兼容 | 仅 Windows、扩展性一般 | 传统 Windows 服务器、企业内网应用 |
| Linux 直接部署 | 性能高、资源占用低 | 环境配置繁琐、依赖管理复杂 | 高性能 Web API、微服务 |
| Docker | 环境一致、跨平台、易迁移 | 学习成本略高、镜像管理 | 云原生、CI/CD 自动化、多环境部署 |