假设你在真实硬件上安装了一个全新的现代 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 附带的系统单元:
- 不要等到网络接口启动或系统实际在线
- 即使以太网已初始化,IP(无论是否静态配置)也可能需要几秒钟才能准备好绑定
- 当此类服务失败时,Ubuntu 库存单元未配置为在几秒后重新启动并重试启动该服务
所以我当前的解决方案是修改这些单元文件,以添加对网络启动和系统在线的强依赖,并在启动失败时添加 5 秒重试/重启。
但什么是恰当的纠正这个问题的方法?