服务器部署.NET应用:从环境准备到访问验证的完整操作步骤

在Linux服务器上部署.NET应用,核心流程是安装对应版本的.NET运行时或SDK,发布项目文件,再用Systemd托管进程并开放端口。
下面按零基础可照做的顺序展开,环境以常见的Ubuntu 22.04和.NET 8为例,其他发行版命令略有差异。

先确认服务器环境与项目版本

开始前需要确认三件事:服务器操作系统、项目目标框架版本、以及是否已有Web服务器占用端口。

  • 查看系统版本:cat /etc/os-release
  • 查看项目目标框架:打开.csproj文件,找到节点,例如net8.0
  • 查看端口占用:ss -tlnp | grep 5000

如果服务器上已装过其他版本的.NET,建议先执行dotnet --list-runtimes确认现有运行时列表,避免版本冲突。

安装.NET运行时或SDK

服务器只运行已发布的应用时,安装运行时即可;
如果需要在服务器上编译源码,则安装SDK。
两者不要混装多个大版本,除非项目确实需要。

Ubuntu 22.04安装.NET 8运行时的参考命令:

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-8.0

安装完成后验证:

dotnet --info

输出中能看到Microsoft.AspNetCore.App 8.x和Microsoft.NETCore.App 8.x即表示运行时可用。
如果提示找不到命令,检查/usr/bin/dotnet是否存在,或重新登录终端刷新环境变量。

发布项目并上传到服务器

在开发机上执行发布命令,生成可直接部署的文件目录:

dotnet publish -c Release -o ./publish

发布完成后,用scp或宝塔面板文件管理把publish目录上传到服务器,例如放到/var/www/myapp。
上传后检查关键文件是否存在:

ls /var/www/myapp

应能看到MyApp.dll、appsettings.json和web.config等文件。
如果是自包含发布,还会包含dotnet可执行文件。

配置Systemd守护进程

直接用dotnet MyApp.dll启动,关闭终端后进程会退出。
用Systemd托管可以开机自启并自动重启。

创建服务文件:

sudo nano /etc/systemd/system/myapp.service

写入以下内容,注意把路径和用户替换成实际值:

[Unit]
Description=My .NET App

[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll
Restart=always
RestartSec=10
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://127.0.0.1:5000

[Install]
WantedBy=multi-user.target

保存后重载并启动:

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
sudo systemctl status myapp

状态显示active (running)说明进程已正常运行。
如果失败,用journalctl -u myapp -n 50查看具体报错。

反向代理与端口放行

Kestrel监听的是127.0.0.1:5000,外部无法直接访问,通常用Nginx做反向代理。
宝塔面板操作路径为:网站 → 添加站点 → 设置 → 反向代理,目标URL填http://127.0.0.1:5000。

如果不用面板,Nginx配置片段参考:

location / {
    proxy_pass http://127.0.0.1:5000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

改完执行nginx -t检查语法,再nginx -s reload。
防火墙方面,只放行80和443即可,5000端口不需要对外开放。

访问验证时,浏览器打开域名或服务器IP,能正常返回页面即部署成功。
若显示502,优先检查应用是否在运行、端口是否一致、Nginx错误日志/var/log/nginx/error.log中的具体提示。

容易踩的坑

  • 发布时用了Debug配置,导致性能偏低,正式环境务必用-c Release。
  • 服务文件里的路径写错,尤其是WorkingDirectory和ExecStart必须指向真实文件。
  • 用root运行应用存在权限风险,建议用www-data等低权限用户,并确保该用户对应用目录有读取权限。
  • 修改代码后忘记重新发布和重启服务,页面还是旧内容;执行sudo systemctl restart myapp后再刷新。
  • 服务器时间不同步可能影响日志和HTTPS证书校验,可用timedatectl检查。

常见疑问

服务器上必须装SDK吗? 只运行已发布的应用装运行时即可,SDK体积更大,适合需要编译的场景。

为什么本机访问5000正常,外网打不开? 因为Kestrel默认只监听本地回环地址,需要Nginx反向代理或改为监听0.0.0.0,但直接暴露端口不安全,推荐前者。

应用启动后自动退出怎么排查? 先看journalctl -u myapp -n 100,常见原因是端口被占用、配置文件缺失或数据库连接字符串错误。

ASP.NET Core和传统.NET Framework部署有什么区别? ASP.NET Core跨平台,可直接跑在Linux上;
传统.NET Framework通常依赖Windows和IIS,两者部署方式不通用。

整体流程可以概括为:装运行时、发布上传、Systemd托管、Nginx反代、验证访问。
按这个顺序排查,大部分服务器.NET部署问题都能定位到具体环节。

分享到:
上一篇
服务器Go教程:从零编译部署到Systemd守护与Nginx反代
下一篇
服务器端C++程序编译部署入门教程
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意