C# webapi发布到linux云服务器上最简教程[玩服务器]

  • 新建dotnet core webapi项目 为方便后面访问项目,修改appsettings.json文件,增加配置 "urls":"http://*:5000"

Image

  • 在云服务器上修改防火墙 允许外部访问上面你指定的端口(如:5000)
sudo ufw allow 5000/tcp
sudo ufw reload

这里我使用的是在云服务器管理界面 设置防火墙

Image

  • 使用dotnet publish 命令发布项目 由于我这里不希望再在云服务器上安装dotnet环境 故这里选择了Self-Contained Deployment 自包含部署 且 选择了单文件发布
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true  -o ./publish

参考:【译】.NET Core 3.0 发布小尺寸 self-contained 单体可执行程序
执行完会在 ./publish 目录下生成应用程序

  • 将publish目录上传到linux云服务器上(这里上传的方式多种多样 比如使用xshell工具的远程传输功能)
  • 给应用程序文件赋权限
chmod 777 ./appname(你的应用名)
  • ./appname 运行你的webapi应用
  • 在浏览器中输入 http://ip:5000 就可以访问了

以上便完成了应用从创建到发布的流程;
BUT 如果你希望应用以服务方式启动,则需要多做一些工作:

  • 在 /etc/systemd/system 目录下创建一个服务文件 myapi.service
nano /etc/systemd/system/myapi.service

给文件中粘贴下面内容 其中 WorkingDirectory是指你将应用程序放到了哪个目录下

[Unit]
Description=bigboss .NET Core WebAPI App

[Service]
WorkingDirectory=/usr/local/bin/publish
ExecStart=/usr/local/bin/publish/yourappname
Restart=always
RestartSec=10


[Install]
WantedBy=multi-user.target

按CTRL+O 然后再按Enter 保存文件 最后按CTRL+X 退出

  • 启动服务并设置开机自启
sudo systemctl start myapi
sudo systemctl enable myapi
  • 如何查看服务是否已经启动
systemctl status myapi
# 或者 使用下面查看服务启动日志
journalctl -u myapi

如果没有发现错误信息 表示服务已启动,但是我的服务没有正常启动,我在服务启动日志中发现了 错误信息

DOTNET_BUNDLE_EXTRACT_BASE_DIR is not set, and a read-write cache directory couldn't be created.

这个错误信息表明你的 .NET 应用程序在运行时需要提取单文件发布(Single File Publish)中的内容,但无法找到合适的目录来缓存这些提取的文件。具体原因是环境变量 DOTNET_BUNDLE_EXTRACT_BASE_DIR 未设置,且无法创建可读写的缓存目录。
解决方法

  • 创建了缓存目录
mkdir -p /usr/local/bin/cache/mywebapi
  • 给目录赋予权限
chown -R root /usr/local/bin/cache/mywebapi
# 查看目录权限
ls -ld /usr/local/bin/cache/mywebapi
  • 最后修改了服务配置文件
nano /etc/systemd/system/myapi.service

添加了缓存目录

Unit]
Description=bigboss .NET Core WebAPI App

[Service]
WorkingDirectory=/usr/local/bin/publish
ExecStart=/usr/local/bin/publish/yourappname
Restart=always
RestartSec=10
Environment=DOTNET_BUNDLE_EXTRACT_BASE_DIR=/usr/local/bin/cache/mywebapi


[Install]
WantedBy=multi-user.target
  • 重新启动服务
systemctl daemon-reload
systemctl restart mywebapi.service

最后我的服务成功启动 通过外网ip我可以在任何地方访问到发布的webapi了!!!

posted @ 2025-06-07 22:46  BigBosscyb  阅读(35)  评论(0)    收藏  举报