尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

.NET API 从开发到生产:Ubuntu 服务器部署全流程详解

发布时间:2026/9/4 2:46:59

资讯中心
01
ARTICLE

.NET API 从开发到生产:Ubuntu 服务器部署全流程详解

.NET API 从开发到生产:Ubuntu 服务器部署全流程详解
在 .NET 开发中将一个 API 网站从本地开发环境发布并最终部署到 Ubuntu 服务器上是项目从开发走向生产的关键一步。这个过程涉及代码编译、依赖打包、服务器环境配置、服务托管和网络暴露等多个环节任何一个环节的疏漏都可能导致部署失败或服务不稳定。对于习惯了 Windows 和 IIS 环境的 .NET 开发者来说初次在 Linux 环境下部署可能会遇到诸如依赖缺失、权限不足、服务无法自启动等问题。本文将聚焦于 .NET 6/7/8 等现代 .NET 版本的 API 项目详细拆解从 Visual Studio 发布到 Ubuntu 服务器部署的完整流程涵盖环境准备、发布包生成、服务器配置、服务托管使用 systemd以及 Nginx 反向代理等核心步骤目标是让读者能够独立完成一次可复现、可排查的生产级部署。1. 理解 .NET 在 Linux 上的运行机制在开始动手之前理解 .NET 应用在 Linux 上的运行方式至关重要这能帮助你在遇到问题时快速定位。1.1 从框架依赖到自包含应用现代 .NET 应用在 Linux 上部署主要有两种模式框架依赖和自包含。框架依赖部署你的应用包只包含自己的代码和第三方库运行时依赖目标服务器上已安装的 .NET 运行时。这种方式发布包体积小但要求服务器环境必须安装对应版本的 .NET Runtime。自包含部署将 .NET 运行时和你应用的代码一起打包。发布包体积较大但可以在没有安装 .NET 运行时的机器上运行环境隔离性好。对于服务器环境相对固定且需要部署多个 .NET 应用的情况通常推荐使用框架依赖模式在服务器上统一安装一次运行时即可。本文也将采用此模式。1.2 服务托管从控制台到后台服务一个 .NET API 项目本质上是一个控制台应用程序。在 Linux 上直接通过dotnet YourApi.dll运行它会启动一个 Kestrel 服务器并监听配置的端口通常是 5000 或 7000。但这存在两个问题1) 终端关闭服务就停止2) 服务崩溃后不会自动重启。为了解决这些问题我们需要一个进程管理工具。在 Ubuntu 等使用 systemd 的系统中最佳实践是创建一个systemd 服务单元。systemd 可以管理服务的生命周期启动、停止、重启设置开机自启并捕获和记录服务输出的日志。1.3 网络暴露为什么需要 NginxKestrel 是一个高性能的 Web 服务器但它更适合作为应用服务器运行在内部网络。直接将其暴露在公网面临一些挑战缺乏成熟的 HTTP 基础设施如静态文件服务、负载均衡、SSL 终止、请求缓冲、安全头设置等。端口管理通常需要以非 root 用户运行 .NET 应用但监听 80/443 端口需要 root 权限。因此我们引入Nginx作为反向代理。Nginx 监听公网的 80/443 端口处理 SSL、静态文件等然后将请求转发给运行在内部端口如 5000的 Kestrel 应用。这种架构更安全、更高效。2. 环境准备与项目配置部署的成功始于充分的准备。我们需要在开发机和目标服务器上分别进行配置。2.1 开发环境准备确保你的开发机通常是 Windows上安装了以下工具Visual Studio 2022或更高版本并安装了“.NET 跨平台开发”工作负载。项目使用.NET 6, 7 或 8LTS 版本更佳。在项目文件.csproj中确认TargetFramework。安装OpenSSH 客户端Windows 10/11 通常自带用于连接 Ubuntu 服务器。2.2 项目配置检查与调整在发布前检查项目的配置文件appsettings.json和appsettings.Production.json如果存在。Kestrel 端点配置确保生产环境配置监听了正确的接口和端口。通常我们让 Kestrel 监听本地回环地址由 Nginx 代理。// appsettings.Production.json { Kestrel: { Endpoints: { Http: { Url: http://localhost:5000 } } }, Logging: { LogLevel: { Default: Information, Microsoft.AspNetCore: Warning } } }环境变量数据库连接字符串、API 密钥等敏感信息绝对不要硬编码在配置文件中。应使用环境变量或安全的配置服务。在代码中通过Configuration.GetValuestring(ConnectionStrings:Default)读取。CORS 策略如果 API 需要被浏览器前端访问需正确配置 CORS。在生产环境中应将WithOrigins限制为确切的前端域名而不是*。2.3 生成发布包在 Visual Studio 中右键点击项目 - “发布”。选择发布目标为“文件夹”。在配置文件中选择“发布”。部署模式选择“框架依赖”。目标运行时选择“linux-x64”。这是针对 Ubuntu 64 位系统的运行时标识符。点击“发布”。Visual Studio 会将编译后的 DLL、配置文件如appsettings.json和第三方依赖打包到一个文件夹中。发布完成后你会在输出目录如bin\Release\net8.0\linux-x64\publish\下看到一个包含所有必需文件的文件夹。这个文件夹就是我们需要上传到服务器的全部内容。3. 服务器环境搭建与部署现在我们将工作重心转移到 Ubuntu 服务器上。假设你已拥有一台安装了 Ubuntu 22.04 LTS 或 24.04 LTS 的服务器并可以通过 SSH 连接。3.1 服务器基础环境配置通过 SSH 连接到你的 Ubuntu 服务器。ssh your_usernameyour_server_ip首先更新系统包列表并升级现有软件包。sudo apt update sudo apt upgrade -y3.2 安装 .NET 运行时由于我们采用框架依赖部署需要在服务器上安装对应版本的 .NET 运行时。添加 Microsoft 包存储库和安装密钥# 下载 Microsoft 包签名密钥 wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb # 安装密钥 sudo dpkg -i packages-microsoft-prod.deb # 删除下载的 deb 文件 rm packages-microsoft-prod.deb安装 .NET 运行时以 .NET 8 为例sudo apt update sudo apt install -y aspnetcore-runtime-8.0注意aspnetcore-runtime包含了运行 ASP.NET Core 应用所需的一切。如果你部署的是控制台或类库项目可以安装dotnet-runtime-8.0。验证安装dotnet --list-runtimes你应该能看到类似Microsoft.AspNetCore.App 8.0.x [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]的输出。3.3 上传应用文件并配置目录在服务器上创建一个目录来存放你的应用例如/var/www/myapi。sudo mkdir -p /var/www/myapi将你在开发机上生成的publish文件夹内的所有内容上传到服务器上的这个目录。可以使用scp命令# 在本地开发机的命令行中执行 scp -r bin\Release\net8.0\linux-x64\publish\* your_usernameyour_server_ip:/var/www/myapi/在服务器上设置目录所有权和权限。最佳实践是创建一个专门的非 root 用户来运行应用。# 创建一个名为 myapi 的用户不创建家目录不允许登录 sudo useradd -r -s /bin/false -m -d /var/www/myapi myapi # 将应用目录的所有权赋予这个用户 sudo chown -R myapi:myapi /var/www/myapi # 设置目录权限确保用户有读取和执行权限 sudo chmod -R 755 /var/www/myapi3.4 创建 systemd 服务文件这是将应用作为后台服务运行的关键步骤。创建服务文件sudo nano /etc/systemd/system/myapi.service将以下内容粘贴到文件中并根据你的实际情况修改[Unit] DescriptionMy .NET API Application Afternetwork.target [Service] # 运行服务的用户和组 Usermyapi Groupmyapi # 工作目录即你的应用目录 WorkingDirectory/var/www/myapi # 启动命令 ExecStart/usr/bin/dotnet /var/www/myapi/YourApi.dll # 重启策略 Restartalways RestartSec10 # 环境变量可以在这里设置例如数据库连接字符串 EnvironmentASPNETCORE_ENVIRONMENTProduction EnvironmentDOTNET_PRINT_TELEMETRY_MESSAGEfalse # 日志配置将标准输出重定向到 systemd 日志 StandardOutputjournal StandardErrorjournal SyslogIdentifiermyapi-service [Install] WantedBymulti-user.target关键解释YourApi.dll应替换为你的项目主程序集名称。EnvironmentASPNETCORE_ENVIRONMENTProduction确保应用使用生产环境配置。Restartalways确保应用崩溃后自动重启。保存并退出编辑器在 nano 中按CtrlX然后按Y再按Enter。3.5 启用并启动服务重新加载 systemd 配置使其识别新的服务文件sudo systemctl daemon-reload启用服务使其在系统启动时自动运行sudo systemctl enable myapi.service启动服务sudo systemctl start myapi.service检查服务状态确认其正在运行且没有报错sudo systemctl status myapi.service你应该看到绿色的active (running)状态。按q键退出状态查看。3.6 验证 Kestrel 服务此时你的 .NET API 应该已经在后台运行并监听localhost:5000。在服务器上使用curl命令测试 API 是否响应curl http://localhost:5000/weatherforecast假设你的 API 有一个/weatherforecast端点。你应该能看到返回的 JSON 数据。查看服务的详细日志有助于调试sudo journalctl -u myapi.service -f按CtrlC退出日志跟踪。4. 配置 Nginx 反向代理现在 Kestrel 服务已在内部运行我们需要配置 Nginx 作为反向代理将外部请求转发给它并处理 SSL。4.1 安装 Nginxsudo apt install -y nginx4.2 配置 Nginx 站点删除默认站点配置可选sudo rm /etc/nginx/sites-enabled/default为你的 API 创建新的站点配置文件sudo nano /etc/nginx/sites-available/myapi粘贴以下配置。这是一个基本的 HTTP 代理配置假设你的 API 域名是api.yourdomain.com。server { listen 80; server_name api.yourdomain.com; # 替换为你的域名或服务器IP location / { # 将请求代理到 Kestrel 应用 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-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_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } }保存并退出。4.3 启用站点并测试配置创建符号链接以启用该站点sudo ln -s /etc/nginx/sites-available/myapi /etc/nginx/sites-enabled/测试 Nginx 配置语法是否正确sudo nginx -t如果输出syntax is ok和test is successful则配置正确。重新加载 Nginx 以使配置生效sudo systemctl reload nginx4.4 配置 SSL使用 Let‘s Encrypt对于生产环境必须启用 HTTPS。Certbot 可以自动化这个过程。安装 Certbot 和 Nginx 插件sudo apt install -y certbot python3-certbot-nginx获取并自动配置 SSL 证书确保域名api.yourdomain.com的 DNS 已解析到该服务器sudo certbot --nginx -d api.yourdomain.com按照交互提示操作输入邮箱、同意协议等。Certbot 会自动修改你的 Nginx 配置将 HTTP 重定向到 HTTPS并配置好证书路径。证书会自动续期。你可以手动测试续期sudo certbot renew --dry-run至此你的 .NET API 已经通过https://api.yourdomain.com对外提供服务。5. 部署后验证与常见问题排查部署完成后需要进行全面验证并了解如何排查常见问题。5.1 部署验证清单按照以下清单检查部署是否成功检查项操作命令/方法预期结果1. systemd 服务状态sudo systemctl status myapi.service状态为active (running)2. 服务日志无错误sudo journalctl -u myapi.service --no-pager -n 50最后若干行日志显示应用正常启动无fail、error、unhandled exception等关键词3. Kestrel 本地端口sudo netstat -tlnp | grep :5000显示dotnet进程正在监听127.0.0.1:50004. Nginx 配置语法sudo nginx -t输出syntax is ok和test is successful5. Nginx 服务状态sudo systemctl status nginx状态为active (running)6. 外部 HTTP 访问浏览器访问http://your_server_ip应被重定向到 HTTPS 或显示 Nginx/API 页面取决于配置7. 外部 HTTPS 访问浏览器访问https://api.yourdomain.com/your-endpoint显示正确的 API 响应浏览器地址栏显示安全锁图标8. API 功能测试使用curl或 Postman 测试关键业务端点返回预期的状态码和数据5.2 常见问题与解决方案部署过程中可能会遇到以下问题可按此思路排查问题现象可能原因排查步骤解决方案systemctl status显示failed1. 应用启动参数错误。2. 依赖缺失如未安装运行时。3. 权限问题。4. 端口被占用。1.sudo journalctl -u myapi.service -xe查看详细错误。2. 检查ExecStart命令路径和 DLL 名称。3. 检查目录权限 (ls -la /var/www/myapi)。4.sudo lsof -i:5000查看端口占用。1. 修正服务文件中的命令。2. 安装正确的 .NET 运行时。3. 用chown和chmod修正权限。4. 停止占用端口的进程或修改应用监听端口。服务状态active但 API 无响应1. 应用内部崩溃如数据库连接失败。2. 防火墙阻止了端口。3. Nginx 配置错误未正确代理。1. 查看应用日志journalctl -u myapi.service -f。2.sudo ufw status检查防火墙规则。3.curl http://localhost:5000测试 Kestrel 是否正常。1. 根据日志修复应用代码或配置如连接字符串。2. 开放防火墙端口sudo ufw allow 80/tcp和sudo ufw allow 443/tcp。3. 检查 Nginx 配置中的proxy_pass地址。Nginx 报 502 Bad Gateway1. Kestrel 服务未运行。2. Nginx 无法连接到localhost:5000。3. Kestrel 监听地址不是localhost。1. 检查myapi.service状态。2. 检查 Nginx 错误日志sudo tail -f /var/log/nginx/error.log。3. 确认应用appsettings.Production.json中 Kestrel 的监听 URL。1. 重启 Kestrel 服务。2. 确保服务文件和应用配置中 Kestrel 监听http://localhost:5000。3. 确保 Nginx 的proxy_pass与之匹配。HTTPS 访问不安全或证书错误1. Certbot 证书获取/续期失败。2. Nginx SSL 配置未生效。3. 服务器时间不同步。1.sudo certbot certificates查看证书状态。2. 检查 Nginx 站点配置确认包含ssl_certificate指令。3.date命令检查服务器时间。1. 重新运行sudo certbot --nginx -d yourdomain.com。2. 重新加载 Nginx。3. 安装并同步 NTPsudo apt install ntp; sudo systemctl restart ntp。静态文件如 swagger无法访问应用未正确配置静态文件中间件或 Nginx 未直接提供静态文件。1. 确认Program.cs中调用了app.UseStaticFiles()。2. 检查静态文件目录权限。1. 确保开发环境已配置静态文件。2. 考虑在 Nginx 层面直接代理静态文件目录性能更优。5.3 日志管理与监控建议集中查看日志使用sudo journalctl -u myapi.service --since 1 hour ago查看最近一小时的日志。日志轮转systemd 会自动管理日志大小。你也可以配置应用自身的日志框架如 Serilog将日志写入文件并配合logrotate进行管理。基础监控可以使用systemctl状态监控服务存活或编写简单的 shell 脚本定期curl健康检查端点。生产级监控考虑集成如Prometheus用于指标收集和Grafana用于可视化或使用Application Insights、Datadog等云服务。6. 生产环境最佳实践与扩展方向将应用运行起来只是第一步要保证其稳定、安全、可维护还需要遵循一些最佳实践。6.1 安全加固防火墙使用ufw只开放必要的端口SSH 22, HTTP 80, HTTPS 443。sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable非特权用户务必使用像myapi这样的非 root、无登录权限的用户运行应用。保持更新定期运行sudo apt update sudo apt upgrade更新系统和 .NET 运行时安全补丁。密钥管理连接字符串、API 密钥等使用环境变量或安全的密钥管理服务如 Azure Key Vault, HashiCorp Vault切勿提交到代码库。禁用服务器信息头在Program.cs中可以禁用或减少 Kestrel 和中间件暴露的服务器信息。6.2 性能与可靠性配置进程数对于多核服务器可以在服务文件中使用Environment指令配置工作进程数但更常见的做法是在应用前使用负载均衡器。EnvironmentASPNETCORE_THREAD_POOL_MAX_THREADS100使用 Nginx 缓存对于响应变化不频繁的 GET 请求可以在 Nginx 配置中启用代理缓存减轻后端压力。配置健康检查在 API 中实现一个/health端点供负载均衡器或监控系统检查应用状态。资源限制在 systemd 服务文件中可以使用MemoryLimit,CPUQuota等指令限制服务资源使用防止单个应用耗尽服务器资源。6.3 部署自动化与扩展使用 CI/CD 管道将上述手动步骤编译、测试、上传、重启服务自动化。可以使用 GitHub Actions, GitLab CI/CD, Jenkins 等工具。管道脚本通常包括代码拉取与构建 (dotnet publish)单元测试 (dotnet test)通过 SCP 或 Rsync 将发布包传输到服务器。在服务器上执行脚本完成服务重启。容器化部署将应用打包为 Docker 镜像。这能提供更好的环境一致性和隔离性。你需要编写Dockerfile在服务器上安装 Docker然后使用docker run或 Docker Compose 来管理容器。结合容器编排工具如 Kubernetes可以轻松实现扩缩容和高可用。多服务器与负载均衡当单台服务器无法承受流量时可以在多台服务器上重复此部署流程并在它们前面部署一个负载均衡器如 Nginx, HAProxy 或云服务商的 LB将流量分发到各个后端实例。从 Visual Studio 发布一个文件夹到在 Ubuntu 服务器上成为一个稳定运行、可通过 HTTPS 访问的生产服务这个过程涉及了开发、运维和网络多个领域的知识。核心在于理解每个组件.NET 运行时、Kestrel、systemd、Nginx的角色并正确配置它们之间的协作。初次部署时严格按照步骤操作并善用systemctl status和journalctl查看日志能解决大部分问题。对于生产环境在确保基本流程跑通后应尽快转向自动化部署和更完善的监控告警体系这才是可持续的工程实践。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。