C# webapi发布到linux云服务器上最简教程[玩服务器]
- 新建dotnet core webapi项目 为方便后面访问项目,修改appsettings.json文件,增加配置 "urls":"http://*:5000"
- 在云服务器上修改防火墙 允许外部访问上面你指定的端口(如:5000)
sudo ufw allow 5000/tcp
sudo ufw reload
这里我使用的是在云服务器管理界面 设置防火墙
- 使用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了!!!

浙公网安备 33010602011771号