最后更新时间 2023-01-24.
背景
笔者所在公司技术栈为 Golang + PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。
相比 Go 语言,互联网公司常见的 Nginx + PHP-FPM 模式,经常会出现性能问题——
特别是我们的活动业务,尽管底层用了鸟哥的 Yaf 框架,
但由于业务逻辑繁重,即使框架层面上完全零损耗,常常支撑不了流量高峰。
一旦某个时间段开启活动,虚拟机的扩容真的非常痛苦。
SRE、开发、QA 三方经常需要因为某个运营活动的进行,提前压测预估容量。
目前活动业务已经逐步用 Go 语言改造,此处不具体展开,防止跑题哈哈。
正因为 PHP 虚拟机模式,每次扩容需要流量剔除、克隆、操作负载均衡、验证流量等等,
推进 PHP 容器化就显得格外重要。
公司在去年年中,已经开始进行 PHP 容器化,不过由于项目优先级以及人力原因,进度较为迟缓。
事情经过
- 某项目进行 PHP 容器化改造,切换少许流量到容器中
- 逐步加大灰度流量
- 某一天开发上线新功能,发现滚动部署过程中存在 502 错误
分析原因
nginx 发生了 502,很多时候是后端,也就是 php-fpm 不在工作。
我们的 PHP 业务的 Pod,由以下 5 个容器组成: