wordpress全栈优化

2023-05-16

原创文章,转载请注明: 转载自始终不够

本文链接地址: wordpress全栈优化

转载请注明:始终不够 » wordpress全栈优化

从最开始计算,《始终不够》个人博客上线已经有两年多了。从最开始就是使用的wordpress,最初为了丰富站内功能,使用了一箩筐的插件,首页加载基本在10s以上,期间使用xhprof做过几次优化,都不是很理想。最近抽出时间整体做了一次性能优化。首页响应时间从1s减少到20ms,并发度从2/s增加到500/s。可以说是有了质的飞跃。这里分享下这次的优化过程。

首先,确定我们要优化的组件:

  1. 浏览器端优化
  2. php端优化
  3. nginx优化

浏览器端优化

浏览器端优化比较简单,从减少网络流量的角度来看,我们需要使用压缩和浏览器端缓存。

启用压缩(注意放到http块中)。启动压缩后,浏览器接收到的是trunk编码,可以一边接收一边解析展示,提高前端加载效率。


gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;  

启用浏览器端cache,因为我很少会去修改静态文件,所以缓存时间设定为了30天。


location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
     expires      30d;
}
location ~ .*\.(js|css)?$
{
     expires      30d;
}  

启用wp super cache后,你可以启用一个cdn域名。浏览器一半会限制对同一个域名的并发度(最多对同一个域名发起N个请求,N视浏览器而定)。你可以再解析一个域用于CDN静态缓存,或者将这些静态资源上传至七牛等CDN上。如果你的首页资源比较多,这是个不错的选择。

PHP端优化

PHP端优化需要考虑以下几个问题:

  • 对象缓存
  • PHP本身的执行效率

对象缓存,可以使用Redis Object Cache插件来实现,只需要简单配置即可,这里注意你需要安装redis扩展,否则这个插件无法启动。PHP本身的执行效率,可以使用Zend opcache来缓存php字节码,效果还是很明显的。同时,你需要对php-fpm做一些优化,例如启动模式,启动进程数量。由于我的vps使用的是阿里云,内存有限,配置并不是最优的。关于php-fpm的优化可以参考其他文章。

另外wordpress的插件,wp super cache,它可以极大的减少php对数据的访问,能够非常明显的提高执行效率,强烈推荐安装。

经过以上调整,首页响应时间从1s减少到40ms以内,平均在20ms左右。测试过程中发现,效果最好的是wp supser cache,对象缓存不是非常明显,但启用Redis Object Cache后,对并发有一定益处。

最近php7和hhvm都很火,php7和wordpress存在兼容问题,如果想进一步提升php的执行效率,可以考虑使用hhvm。hhvm安装过于复杂,可以考虑使用docker安装。

还可以将session存入redis中。文件session存在一个文件锁的问题,同一个用户同时发起两个请求时,由于session文件锁,这两个请求实际上在一定程序是串行的。将session放入redis能够解决这个问题,这里同样要求你安装redis扩展。配置方法非常简单,只需更改如下两个配置即可:


session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"  

nginx优化

nginx的优化主要考虑缓存,尽可能的将请求拦截在nginx端,阻止没有必要的php执行。原理是使用nginx反向代理,将所有请求的响应结果都缓存起来。在缓存没有发生变化的情况下,直接返回缓存内容,无需执行php。产生的效果就是并发能力的明显提升。在使用反向代理之前,并发基本在6/s左右,启用反向代理之后,并发能够达到500/s,提升了近100倍。nginx配置过程如下:

1、在http块中添加如下两段

代理缓存配置,注意www.huyanping.cn需要换成你的域名(或者其他字符串都可以)


proxy_temp_path  /tmp/nginx;
proxy_cache_path /tmp/cache/nginx levels=1:2 keys_zone=www.huyanping.cn:20m max_size=1g inactive=1d;  

upstream配置


upstream backend_server {
      server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
}  

2、代理服务器配置

80端口用于做反向代理,8080端口是真实的server


server  {
        listen          80;
        server_name     www.huyanping.cn huyanping.cn;

        location / {
                proxy_pass http://backend_server;
                proxy_redirect          off;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        Host            $host;

                proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;

                client_max_body_size       10m;
                client_body_buffer_size    128k;

                proxy_connect_timeout      90;
                proxy_send_timeout         90;
                proxy_read_timeout         90;

                proxy_cache www.huyanping.cn; 
                proxy_cache_valid 200 302 12h; 
                proxy_cache_valid 301 1d; 
                proxy_cache_valid any 1h; 

                proxy_buffer_size          4k;
                proxy_buffers              4 32k;
                proxy_busy_buffers_size    64k;
                proxy_temp_file_write_size 64k;
        }
}  

真实server配置


server {
        listen       8080;
        server_name  www.huyanping.cn huyanping.cn;
        index index.php index.html index.htm;
        root /alidata/www/private/www.huyanping.cn/;

        #charset koi8-r;

        error_page 403 = /404.html;
        error_page 404 = /404.html;

        location / {
            if (-f $request_filename/index.html){
                rewrite (.*) $1/index.html break;
            }
            if (-f $request_filename/index.php){
                rewrite (.*) $1/index.php;
            }
            if (!-f $request_filename){
                rewrite (.*) /index.php;
            }
        }


        location ~ \.php$ {
            add_header Access-Control-Allow-Origin http://cdn.huyanping.cn;
            if ( $request_method = HEAD ) {
               access_log /dev/null;
               return 403;
            }
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
            access_log /data/logs/nginx/www.huyanping.cn/access.log blog;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            add_header Access-Control-Allow-Origin http://cdn.huyanping.cn;
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
          add_header Access-Control-Allow-Origin http://cdn.huyanping.cn;
          expires      30d;
        }

    }  

效果截图

wordpress优化效果
wordpress优化效果
wordpress优化效果
wordpress优化效果

ab测试结果


> ab -n100 -c10 "http://www.huyanping.cn/"
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.huyanping.cn (be patient).....done


Server Software:        nginx
Server Hostname:        www.huyanping.cn
Server Port:            80

Document Path:          /
Document Length:        0 bytes

Concurrency Level:      10
Time taken for tests:   0.193371 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Non-2xx responses:      100
Total transferred:      32200 bytes
HTML transferred:       0 bytes
Requests per second:    517.14 [#/sec] (mean)
Time per request:       19.337 [ms] (mean)
Time per request:       1.934 [ms] (mean, across all concurrent requests)
Transfer rate:          160.31 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        4    8   7.5      5      32
Processing:     4    9   8.1      6      31
Waiting:        4    8   8.2      5      30
Total:          8   17  10.2     12      38

Percentage of the requests served within a certain time (ms)
  50%     12
  66%     14
  75%     32
  80%     32
  90%     34
  95%     36
  98%     38
  99%     38
 100%     38 (longest request)  

没能解决的问题

最初用ab测试,发现www.huyanping.cn的并发度非常低,基本在2/s左右,而wordpress裸跑基本能跑到300/s,调试了很久最终都没找到原因所在。虽然最终使用反向代理将并发度优化到500/s,但还是不甘心想找到原因。最初怀疑有文件锁存在,使用xhprof分析及阅读代码之后,并没有找到锁的存在,当然可能是我没找到。最终把原因归结在数据访问效率上,虽然有点牵强。

不知道有木有大牛可以帮忙分析下这个原因?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wordpress全栈优化 的相关文章

  • unity解决快速运动物体碰撞检测穿透问题

    在Unity中 xff0c 快速移动的物体在与其他物体进行碰撞检测时 xff0c 可能会穿透 比如子弹和墙壁的碰撞检测 如何解决这个问题呢 xff1f 网上看了下 xff0c 有说Rigidbody修改continus的 xff0c 但是我
  • leetcode33题解_Search in Rotated Sorted Array

    题意 xff1a 要在一个排好序的但是旋转过的序列中找给定的数字 xff08 通常的题目是 xff0c 比如 xff1a 1 xff0c 2 xff0c 3 xff0c 4 xff0c 5 xff0c 6 xff0c 7 找这组序列中是否有
  • 回溯算法的理解与使用

    最近在做题的过程中发现很多我不会的题目的解决方法都使用了回溯算法的思想 xff0c 说明我对这个算法目前掌握的还不够牢固 xff0c 因此今天花时间来好好了解这个算法 回溯算法是一种算法思想 xff0c 而递归则是具体的代码结构 就我的学习
  • Kmeans基本思想以及和SVM的区别

    由于最近要用到该算法 xff0c 但是发现算法的思想基本忘掉了 xff0c 只知道是聚类算法 xff0c 因此又回头去学习了一番 xff0c 记录下学习的感受 xff0c 方便以后复习 Kmeans算法的基本思想 xff1a 看如下图 xf
  • HTTPConnection与JSON应用实例

    JSON xff1a 一种轻量级的数据交换格式 JSONObject xff1a 一个json对象 包含一对儿 Key Value 数值 xff0c 在Key和Value之间是以逗号 分隔 JSONStringer xff1a json文本
  • VS(Visual Studio)与VC(Visual C++)对应关系

    opencv 2 4 10 gt vc10 vc11 vc12 opencv 2 4 13 gt vc11 vc12 opencv 3 4 0 gt vc14 vc15 opencv 3 4 1 gt vc14 vc15 Visual St
  • 如何在win10下用Anaconda安装gym(强化学习)

    默认已经安装好Anaconda和pycharm 配置libssl 1 1 x64 ddl libcrypto 1 1 x64 dll 把路径 Anaconda3 Library bin 下面的文件复制到路径 Anaconda3 DLLs 下
  • win10系统下TwinCAT3与VS2019之间的ADS通信

    64 WIN10 TwinCAT3 VS2019 ADS 转博后第一次出差 xff0c 来到了UnitedImaging xff0c 这次的任务是负责在ros系统和TwinCAT3之间的 ADS 通信 作为本次第一篇博客 xff0c 先跑通
  • 两步实现安卓手机秒变网络摄像头

    今天大概是兴趣加技术篇 xff0c 程序员不写点有趣的代码 xff0c 怕是很难在女票和家人面前秀出科技感 GITHUB xff1a https github com AndroidMsky RootPlay 如GIF所示 xff0c 自动
  • TwinCAT3与ROS之间的ADS通信实现

    TwinCAT3与ROS之间的ADS通信实现方法 摘要 xff1a TwinCAT xff08 The Windows Control and Automation Technology xff0c 基于Windows的控制和自动化技术 x
  • 基于DDPG、TD3的UR5装配仿真及其对比

    本项目为上海交通大学2020年度秋季学期 xff0c 乐心怡老师讲授的 最优控制 课程的大作业 xff0c 大部分内容基于方晓猛学长的工作 基于神经网络算法的多机械臂协同控制技术研究 xff0c 最近因为开题所以重新温习了一下强化学习 xf
  • Bullet 布料仿真的底层算法分析

    Bullet 可变物体的底层算法分析 1 计算机图形学中可变建模方法1 1 质点 弹簧模型 xff08 离散 xff09 1 2 有限元连续体模型 xff08 连续 xff09 2 布料模拟的两种主要算法2 1 隐式时间积分2 2 基于位置
  • 【文献阅读】Position Based Dynamics

    文献阅读 Position Based Dynamics 摘要3 Position Based Simulation3 1 算法3 2 求解器3 3 约束投影3 4 碰撞检测和回应3 5 阻尼3 6 接触 4 布料仿真4 1 布料的表示4
  • 完成一篇机器人领域期刊论文所需要的一些工具

    完成一篇机器人领域期刊论文所需要的一些工具 书写工具制图工具PDF格式PPT制图VISIO制图 EPS 格式Inkspace 仿真工具MATLAB路径点生成实时仿真动画Gif生成 ROS 仿真Rviz仿真 剪辑工具录屏软件 Obs Stud
  • NSData转为Int

    在Socket传输中 收到的数据一般都是NSData型 但是我们要对数据进行分析 分解出长度等信息 然后转为Int型 这里就需要转换 swift代码如下 var len Int data getBytes amp len length si
  • 常用的RTMP、RTSP、HTTP协议流直播流地址

    一 RTMP RTSP HTTP协议 这三个协议都属于互联网 TCP IP 五层体系结构中应用层的协议 理论上这三种都可以用来做视频直播或点播 但通常来说 xff0c 直播一般用 RTMP RTSP 而点播用 HTTP 下面分别介绍下三者的
  • 不同工程同一套代码(基础组件SDK一样)的使用

    说明 xff1a 当使用公司的代码要适应不同的地域的需求 xff0c 需要在基础组件的基础上开发不同的App即不同的工程 xff08 请看下图 xff09 xff0c 当两个工程用到同一套代码如何做到互不影响 xff0c 请看下文代码 1
  • 字节序、比特序(一)

    1 字节序 字节序即字节的存储顺序 xff0c 如果数据都是单字节的 xff0c 那怎么存储无所谓了 xff0c 但是对于多字节数据 xff0c 比如int xff0c double等 xff0c 就要考虑存储的顺序了 字节序是硬件层面的东
  • win10下,VsCode搭建golang运行环境,并能断点调试

    第一步 xff0c 下载 基础包 vscode git go xff0c 我用的都是64位 1 vscode https code visualstudio com Download 2 git https git scm com down
  • 揭秘之从RecyclerView滑动监听到Gilde平滑加载图片

    未经允许不得转载 转载请注明作者AndroidMsky及原文链接 http blog csdn net androidmsky article details 53115818 本文应该是RecyclerView的第三篇 xff0c 今天来

随机推荐

  • Unity 动画状态机 设置Trigger后,有时触发动画有时触发不了的问题

    如果想立即触发下一个动画 xff0c 必须把 has exit time 去掉 否则会有时能触发 xff0c 有时触发不了
  • [海康威视]-超脑设备告警布防代码C#实现

    这是海康威视的超脑设备的 告警布防 程序 xff0c 可以控制 接收超脑的识别到的熟人和陌生人的告警信息 通过超脑里面的人脸数据和摄像机抓拍到的人进行比对 xff0c 如果是人脸库的的人就返回 给你告警布防程序信息 xff0c 包括姓名 x
  • [海康威视]-门禁设备告警布防代码C#实现

    这是海康威视的门禁的 告警布防 程序 xff0c 人脸识别 xff0c 身份证识别 xff0c 可以控制 门禁的开关 可以接收门禁刷身份证的相关身份证信息 识图拿代码
  • centOS 7安装 teamviewer 再启动系统就登录不了系统了

    centOS7 安装了teamviewer 12 0 93330 i686 rpm 和teamviewer 13 0 9865 i686 rpm 都出现了同类情况 安装能成功 xff0c 安装命令直接 用的 yum install 安装后
  • Unity 按钮的按下处理事件之自定义处理函数

    例如 qq登陆按钮 首先准备好按钮 xff0c 然后按照下面的步骤 xff1a 1 给按钮添加脚本文件login btn qq cs 其实我已经添加好了 只是演示在哪里添加 2 打开 login btn qq cs 文件 xff0c 添加
  • vs2017安卓开发的问题:模拟器报错 Decryption unsuccessful

    按照微软官方文档还算顺利 直到 这里 Docs Xamarin Xamarin Android 开始操作 了解 Android 第 1 部分 xff1a 快速入门 这里zhi 39 直到写完代码也很顺利 但是调用模拟器时报错了 原因是 xf
  • 《视觉SLAM十四讲》 编译报错问题汇总 Ubuntu20.04

    Ubuntu 20虚拟机环境安装 高翔原视频是ubuntu14 04 xff0c 看了一下 xff0c 有很多库都有兼容问题 xff0c 所以初步按这个Ubuntu 20装 xff1a 这个教程是ubuntu20的 用ubuntu14会不兼
  • C语言结构体(struct)常见使用方法

    目录 结构体声明与定义 结构体变量及其内部成员变量的定义及访问 引用 xff08 C 43 43 xff09 指针和数组 结构体嵌套 结构体与函数传参 占用内存空间 变长结构体 基本定义 xff1a 结构体 xff0c 通俗讲就像是打包封装
  • 如何禁止STL map 自动排序

    最近在做一个SPC SQC 的项目 其中有一处用到了stl map 得到了一个小小的心得 xff0c 分享给大家 我们知道 xff0c 在向map中插入数据对时候 xff0c map中的元素将按照一定的顺序被插入到对应的节点上 xff0c
  • 关于buffer overflow detected 程序崩溃的思考

    我是在使用别人源码 xff08 DBT2 benchmark xff09 的时候 xff0c 编译成功然后运行就出现了这个问题 本以为像这种开源的软件应该没什么太明显的bug xff0c 但是后来细想 xff0c buffer overfl
  • 安卓微信自动抢红包插件优化和实现

    转载请注明作者AndroidMSky和链接http blog csdn net AndroidMsky article details 53490459 又是兴趣系列 网上有很多自动强红包的例子和代码 xff0c 笔者也是做了一些优化 先说
  • 串口通信的基本知识

    串口通信的基本知识 前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 分享一下给大家 点击跳转到教程 本文介绍了串口通讯的基本概念 数据格式 通讯方式 典型的串口通讯标准等内容 串口通讯 xff
  • 【毕业设计】深度学习YOLO图像视频足球和人体检测 - python opencv

    1 前言 x1f6a9 深度学习YOLO图像视频足球和人体检测 x1f947 学长这里给一个题目综合评分 每项满分5分 难度系数 xff1a 3分工作量 xff1a 3分创新点 xff1a 5分 x1f9ff 选题指导 项目分享 xff1a
  • 【C语言编程入门系列】—— 第三章,编写第一个C语言程序!

    导读 xff1a 一般学一门计算机语言的第一堂上机课 xff08 上机 顾名思义 xff0c 上计算机 xff0c 机你太美 xff09 xff0c 就是往屏幕输出 hello world xff0c 本章也不例外 3 1 Hello Wo
  • 基于PCNTL的PHP并发编程

    原创文章 xff0c 转载请注明出处 xff1a http huyanping sinaapp com p 61 178 作者 xff1a Jenner PHP是一门较早出现的WEB开发脚本语言 xff0c 并由于其语法结构简单 易学 开源
  • 基于Redis的MessageQueue队列封装

    原创文章 xff0c 转载请注明出处 xff1a http www huyanping cn p 61 275 作者 xff1a Jenner Redis的链表List可以用来做链表 xff0c 高并发的特性非常适合做分布式的并行消息传递
  • 基于PHP的crontab定时任务管理

    BY JENNER 2014年11月10日 阅读次数 xff1a 6 linux的crontab一直是服务器运维 业务开展的利器 但当定时任务增多时 xff0c 管理和迁移都变得很麻烦 xff0c 而且容易出问题 下面提供了一个使用php编
  • PHP模拟SQL的GROUP BY算法

    BY JENNER 2015年1月24日 阅读次数 xff1a 25 github地址 xff1a https github com huyanping Zebra PHP ArrayGroupBy packagist地址 xff1a ht
  • flume:支持重命名、移动文件的roll file sink升级版

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 flume xff1a 支持重命名 移动文件的roll file sink升级版 转载请注明 xff1a 始终不够 flume xff1a 支持重命名 移动文件的r
  • wordpress全栈优化

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 wordpress全栈优化 转载请注明 xff1a 始终不够 wordpress全栈优化 从最开始计算 xff0c 始终不够 个人博客上线已经有两年多了 从最开始就