最近对上线半年多的laravel项目做了一次少大的改动,由php-fpm改为swoole,这里做个记录。
2019年过年前半个月,上阿里云后台查看前一天的访问请求日志,发现很多接口响应慢。翻了前几天的日志,发现不少响应慢的接口,包括app首页资讯、文章列表、文章详情等所有和cms相关的接口。想着最近没上线过什么新功能,怎么最近变慢好多。阿里云后台查看nginx错误日志,上服务器看php-fpm错误日志。发现和上次php-fpm优化报的同样错误信息。时间点差不多都吻合,大都是push发出后的那几分钟。用户大都在开盘那会打开咱们公司的APP了,虽然公司这款app不做期货交易,黄金交易,但接口响应这么慢,严重影响用户体验!(下图是阿里云后台看到的日志信息)因为临近过年不想有大改动,向公司临时申请加一台服务器,配置好调试上生产负载均衡。
过完年后,刚开工,需求不多。想着要优化系统,自己ab压测一下测试环境的接口,接口tps110多,有点低。参考网上的laravel框架优化资料(https://learnku.com/articles/5088/optimize-laravel-site-to-open-speed),照着改了tps上升到120左右,没起到什么起作用。
在公司技术群里咨询下,有人建议用swoole+laravel,网上说做得好性能可以十倍以上的提升。又上github搜索swoole+laravel,选用别人已经集成好的,最后选用laravels(https://segmentfault.com/a/1190000013358289?utm_source=tag-newest)。
开发机安装swoole扩展,composer拉取laravels包(折腾好会,这里就不表述了)。
原来http请求到达web服务器,服务器nginx将请求转发给php-fpm,让php-fpm管理进程对php程序读取解析并返回。使用 swoole会接管php-fpm要做这部分事情。
nginx配置更改如下(nginx监听接收88端口的请求并转发本机5200端口,如果是php-fpm,默认本机9000端口接收):
gzip on;
gzip_min_length 1024;
gzip_comp_level 2;#返回结果的压缩比,数值越高压缩的越小但更消耗CPU,但不一定有更高的压缩率╥﹏╥
gzip_disable "msie6";
upstream laravels {
# 通过 IP:Port 连接
# 通config/laravels.php中listen_ip listen_port保持一致
server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
keepalive 16;
}
server {
listen 88;
server_name test-cms.xxxx.com;
root /alidata/www/test-cms.xxx.com/public;
access_log /alidata/logs/nginx/test-cms.xxx.com.log;
error_log /alidata/logs/nginx/test-cms.xxx.com-error.log;
charset utf-8;
location / {
try_files $uri @laravels;
}
location @laravels {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://laravels;
}
}