当系统启动时 Systemd Units 绑定到非本地 IP 主机/端口时失败,如何正确修复/预防?

当系统启动时 Systemd Units 绑定到非本地 IP 主机/端口时失败,如何正确修复/预防?

假设你在真实硬件上安装了一个全新的现代 Ubuntu 系统(比如 20.04 LTS 服务器),并且你需要部署一个或多个网络绑定服务,例如:

  • Nginx
  • MySQL
  • PostgreSQL

根据我的经验,如果您将服务配置为绑定到 IPv4 0.0.0.0 或 IPv6 [::] 以外的任何内容或本地/环回接口,则该服务很可能会失败并且无法在系统重启后恢复。

例如,如果你绑定到任何本地、私有、公共主机:

192.168.22.30 或 2601:171c:d401:120a::1001 或 fde8:b0ab:dd91:1010::feeb

您将在该会话期间成功启动并启用它们,但在系统重启时可能会失败。

为什么?因为看起来 Ubuntu 附带的系统单元:

  1. 不要等到网络接口启动或系统实际在线
  2. 即使以太网已初始化,IP(无论是否静态配置)也可能需要几秒钟才能准备好绑定
  3. 当此类服务失败时,Ubuntu 库存单元未配置为在几秒后重新启动并重试启动该服务

所以我当前的解决方案是修改这些单元文件,以添加对网络启动和系统在线的强依赖,并在启动失败时添加 5 秒重试/重启。

但什么是恰当的纠正这个问题的方法?

相关内容