Ubuntu下.NET Core站点重部署后未加载新DLL如何解决?
解决方案
.NET Core 运行时启动后会将加载的DLL文件锁定在内存中,仅替换磁盘上的DLL不会触发运行时重新加载新二进制文件,必须重启对应的systemd服务才会生效,按照以下步骤配置即可实现部署后自动更新:
步骤1:配置部署账号sudo免密执行重启命令
你用于GitHub Action SSH登录服务器的部署账号,默认执行sudo命令需要输入密码,会导致自动化流程卡住,需要提前配置免密权限:
- 登录Ubuntu服务器,执行
sudo visudo打开sudo配置文件 - 在文件末尾添加如下规则,将
deploy_user替换为你实际使用的部署账号用户名:deploy_user ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp.service - 保存退出配置文件后,切换到部署账号执行
sudo systemctl restart myapp.service,确认无需输入密码即可执行成功即配置完成。
步骤2:在GitHub Action流程中添加重启步骤
在你现有的自动部署流程的文件上传完成的步骤之后,新增SSH执行重启命令的步骤即可,参考配置如下:
- name: 重启.NET应用服务 uses: appleboy/ssh-action@v0.1.10 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} port: ${{ secrets.SERVER_PORT }} script: sudo systemctl restart myapp.service
注意:上述配置中的服务器地址、账号、SSH密钥等敏感参数需要提前存储在GitHub仓库的Secrets中,禁止硬编码在Action配置文件里
可选优化:配置零停机重启
如果不希望重启服务时站点出现短暂不可用,可以修改systemd服务配置降低中断时长:
- 执行
sudo nano /etc/systemd/system/myapp.service编辑服务文件 - 在
[Service]配置块下新增如下参数:Restart=always RestartSec=1 - 执行
sudo systemctl daemon-reload让配置生效。
注意事项
- 必须确保所有发布文件全部上传完成后再执行重启操作,否则可能出现服务启动失败的问题
- 如果本地开发的配置文件和服务器线上配置不同,可以在Action上传步骤中排除
appsettings.json等配置文件,避免覆盖线上配置
内容的提问来源于stack exchange,提问作者raklos
相关产品推荐
相关产品推荐

