服务器部署.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部署问题都能定位到具体环节。