我有一个在 Debian 服务器上运行的 Django 应用程序,带有一个通过 GitHub webhook 自动调用的简单部署脚本:
#!/bin/sh
git pull
/home/criticalnotes/.local/bin/poetry install --with prod --sync
/home/criticalnotes/.local/bin/poetry run ./manage.py migrate
sudo /usr/sbin/service api.critical-notes.com restart
echo "service api.critical-notes.com restarted"
因此,此部署脚本从 git 中提取最新代码,安装依赖项,运行迁移脚本,然后重新启动服务。
我的api.critical-notes.com.service
文件:
[Unit]
Description=api.critical-notes.com
[Service]
User=criticalnotes
Group=criticalnotes
Restart=on-failure
WorkingDirectory=/home/criticalnotes/api.critical-notes.com
ExecStart=/home/criticalnotes/.local/bin/poetry run uvicorn criticalnotes.asgi:application --log-level warning --workers 8 --uds /tmp/uvicorn.sock
[Install]
WantedBy=multi-user.target
这个设置在很长一段时间内都运行得很好,但今天当我将新代码推送到 GitHub 时,该网站停止了工作。在查看发生的情况后,我注意到该api.critical-notes.com
服务不再运行,它不断因故障而死亡,当尝试手动启动后端时,我收到此错误:
Address already in use
我不知道是什么导致了这个问题,特别是因为以前从未发生过这种情况,而且我今天(或最近的任何时候)都没有进行任何部署或设置更改。所以我的问题是这是怎么发生的——当后端没有运行时,地址怎么可能仍在使用中?其次,我如何改进我的部署脚本,以免这种情况再次发生?
当我试图弄清楚为什么我的代码推送会出现问题时,由于后端处于离线状态,站点离线了大约 30 分钟,这非常可怕。我不想再发生这样的事
答案1
如果不了解更多有关应用程序和部署过程的信息,几乎不可能肯定地回答这个问题。常见问题包括配置脚本冲突、使用保留范围内的端口或保留上次重新启动所需绑定的延迟进程。如果您在过去几个月更新了任何必需的库/依赖项(例如 uvicorn、python 等),它们可能已经更改了默认配置,因此您现在需要指定一个附加参数才能正常工作。它还可能与 UDS 文件相关,特别是如果您的启动脚本需要创建它。如果由于某种原因它仍然被锁定打开,则可能会触发这样的错误。如果不知道如何使用该套接字,文件挂起打开的根本原因可能是代码中几乎任何地方的错误。 (或者自上次工作以来已更新的任何依赖项。)
如果我注意到您添加了更多详细信息,我会尝试返回并使用更具体的答案进行编辑,但我希望这至少能为您指明正确的方向。
答案2
地址已被使用
这确实是您在这里需要考虑的唯一事情。您没有说明该服务使用什么地址(特别是端口)。如果它是一个 Web 服务,那么这些端口可能会是 80 和/或 443。您需要找出正在使用这些端口的内容。根据 debian 的版本,您使用的命令将是(作为 root)netstat -nap | grep :80
或ss -nlp | grep :80
.
您还可以使用以下命令检查相关端口上是否有任何内容正在侦听nc -zv localhost 80
(重复 443)
如果确实没有任何监听,那么听起来好像您的服务器正在尝试自行启动两次。
您还可以查看 的输出,看看从终端会话systemctl status api.critical-notes.com
运行时会发生什么。systemctl restart api.critical-notes.com