大并发下 PHP +Laravel 的部署架构应该是怎样的?

2019-05-13 11:23:26 +08:00
 HaroldChen

背景:

  1. 公司的开发语言是 PHP, 大部分业务是 php7+laravel5, 小部分是 php5+laravel4。
  2. 电商类,日常 tcp 并发连接在 1.5W 左右,赶上活动,tcp 连接数短时间会达到 10W+。现在是靠机器去堆,但高峰期还是会看到 php-fpm 经常 cpu 100%,且 php-fpm 的端口健康检测失败。已排除数据库层面的问题。xhprof 之类的代码分析目前暂时没精力去看,以后会关注。
  3. 目前正在进行服务化,已经拆出的服务数量在 10 个左右。

目前部署的架构是每个服务都购买单独的服务器(访问量最大的一个业务,用了 20 台左右的服务器支撑),每台服务器上面部署 Openresty + php-fpm,代码也在每台服务器发布。

现在其实每台服务器的冗余比较严重,非高峰期的负载不需要这么多服务器。所以考虑换一种方式,前端负载均衡(阿里云 SLB ) -> Openresty 集群(每台上都有所有业务域名的配置文件) -> php-fpm 集群 ,每台服务器只负责一个服务的运行。并发量大的时候直接扩容 php-fpm 服务器的个数。

问题:

  1. 想请教下,这种部署方式有问题吗?现在主流的部署结构是怎样的?
  2. 以前的那种部署方式,哪里支撑不住只会影响单个业务。现在这种部署方式如果并发上来,怎么去判断是哪个业务造成的?(查看各个业务的 pv 和 qps?)
  3. 目前也在进行容器化的改造,想问下 php 部署一般是什么形式,sidecar?
7115 次点击
所在节点    程序员
52 条回复
mooncakejs
2019-05-14 09:52:54 +08:00
@realpg 真诚的问,最近用 JAVA 写个小项目,JAVA 有像 laravel migration 这么方便的轮子吗,
realpg
2019-05-14 10:26:15 +08:00
@mooncakejs #41
不知道 我不写 java 我写 PHP
zyh94946
2019-05-14 10:34:14 +08:00
我猜楼主不是开发,估计是 SRE,动不了框架业务逻辑
haohappy
2019-05-14 11:51:02 +08:00
@keikeizhang “用户开始猛增,然后用 JAVA 去替换频率高的 API ” 你好 换 JAVA 主要是因为性能吗 还是其他原因?
Caballarii
2019-05-14 13:23:38 +08:00
@mooncakejs 不懂 laravel,写 java 现在就 springboot 一把梭
zibber
2019-05-14 14:01:11 +08:00
nginx 日志 awk 查一下看一下接口耗时,定向排查一下
nginx 的并发数 和 php-fpm 的进程数要优化一下
fuxkcsdn
2019-05-14 14:22:44 +08:00
用容器部署避免资源浪费
不好改动语言或者语言框架的话,就只能是活动期间加资源硬抗了

语言改不动也建议改框架,讲真,用过一阵 laravel 后我一直在想,php 都写成这样了,我干嘛不用 java ?比如上面说的 SpringBoot 一把梭,有点 java 基础开发起来肯定比 laravel 快(单从 ide 支持方面,反正调试需要跟踪 laravel 源码的时候,我是真想屎)。20 台服务器的前提下,性能应该也能甩 laravel 一条街以上
keikeizhang
2019-05-14 14:41:02 +08:00
@haohappy 性能是当时的一部分原因,还有就是 PHP 优秀的程序员少,未来项目扩大,需要的系统肯定有更高的稳定性和性能,显然这方面 JAVA 更好一些。
fghjghf
2019-05-14 15:09:17 +08:00
不是写 php 的。但 10W+ 并发量不算大吧。socket 吞吐量从来不是瓶颈,瓶颈都是出在 IO 上,主机分配请求、多机读写分离,缓存。注意来者不拒的 io 多路复用,请求过多击穿数据库哦
hasdream
2019-05-14 16:12:29 +08:00
php 特性短连接,连接数据库短连接,连接 redis 短连接, 连接 mysql 和 redis 都有持久连接的方法,实际 php 的长连接不是特别靠谱(基于 php-fpm 的),
优化的话
1. 使用 Swoole 替代 php-fpm,使用 swoole 要考虑资源回收(关闭文件,请求连接池用完释放等等 我知道 php 是最牛逼的语言,写程序不需要考虑资源释放。)
2. 暴力优化 php-fpm 和 Openresty 分离 php-fpm 机器开启 tcp 快速回收,tcp 时间戳, Openresty 机器开启开启 tcp 时间戳不开 tcp 快速回收。 开启快速回收 对 NAT 网络环境有概率问题, 局域网内没啥问题(我没测试过).
mandy0119
2019-05-14 18:33:29 +08:00
@avenger 老哥,20 台抗 10 万并发很菜吗。。。我看他意思是一个频繁调用的业务就要 20 台服务器。 我是用 java 的,这边服务器比较差,2C4G 的机器 抗 2K 并发就满负荷了,业务逻辑还极其简单
xman99
2019-05-15 08:51:56 +08:00
考虑下用轻量级 lume 框架,替代一些高频接口。优化下性能,lavavel 并发不高情况下,其实短板不大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/563568

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX