2022年9月

最后更新时间 2023-01-24.

背景

笔者所在公司技术栈为 Golang + PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。

相比 Go 语言,互联网公司常见的 Nginx + PHP-FPM 模式,经常会出现性能问题——

特别是我们的活动业务,尽管底层用了鸟哥的 Yaf 框架,

但由于业务逻辑繁重,即使框架层面上完全零损耗,常常支撑不了流量高峰。

一旦某个时间段开启活动,虚拟机的扩容真的非常痛苦。

SRE、开发、QA 三方经常需要因为某个运营活动的进行,提前压测预估容量。

目前活动业务已经逐步用 Go 语言改造,此处不具体展开,防止跑题哈哈。

正因为 PHP 虚拟机模式,每次扩容需要流量剔除、克隆、操作负载均衡、验证流量等等,

推进 PHP 容器化就显得格外重要。

公司在去年年中,已经开始进行 PHP 容器化,不过由于项目优先级以及人力原因,进度较为迟缓。

事情经过

  1. 某项目进行 PHP 容器化改造,切换少许流量到容器中
  2. 逐步加大灰度流量
  3. 某一天开发上线新功能,发现滚动部署过程中存在 502 错误

分析原因

nginx 发生了 502,很多时候是后端,也就是 php-fpm 不在工作。

我们的 PHP 业务的 Pod,由以下 5 个容器组成:

阅读全文