解决nginx下wordpress系统变慢问题一例

原创文章,转载请指明出处并保留原文url地址

一、Wordpress简介

WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的blog。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在GNU通用公共许可证下授权发布。

wps_clip_image-22710[3][1]

WordPress 是一个功能非常强大的博客系统,插件众多,易于扩充功能。安装和使用都非常方便。 WordPress 已经成为主流的 Blog 搭建平台。WordPress有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的HTML代码、CSS、PHP等相关知识。

WordPress 是目前世界上使用最广泛的博客系统,是一款开源的PHP软件。因为使用者众多,所以WordPress社区非常活跃,有丰富的插件模板资源。使用WordPress可以快速搭建独立的博客网站。

WordPress 不仅仅是一个博客程序,也是一个优秀的小型CMS,很多非博客网站也是用WordPress搭建的。

而Wordpress现在的应用又不仅仅只是在BLOG方面,因为其强大的扩展性,部分网站甚至已经开始使用Wordpress来架设,或者说这些BLOG甚至都看不出它们只是BLOG而已了。WordPress是最热门的开源个人信息发布系统(Blog)之一,基于PHP MySQL构建。

为了运行Php还需要一个web服务器,可以选择apache也可以选择nginx

二、Nginx简介

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯

Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:

在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。

Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都非常好。

Nginx 是一个安装非常的简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

三、wordpress运行缓慢优化的方法

本站就是采用nginx配合wordpress开发完成, 看看完成后,运行速度很快, 显示、管理等都非常好。

一段时间之后,主机速度似乎越来越慢,一开始以为网络问题,也没在意,过了几天还是很慢,开始怀疑是系统问题了,然后开始慢慢的查找问题的原因,到百度上搜索相关问题,还真有类似的问题

主机自身的速度的确是影响网站速度最重要的一点,但除此之外,还受到其他很多方面的影响。这就是为什么刚刚安装WP的时候感觉很快,用了一段时间后却变慢的原因。

经过一段时间查找后,发现有如下办法可以提高wordpress性能的办法

1. 减少插件的使用

这是首要的一点。大部分人往往都没足够的代码知识,更不可能做到每个插件的代码化,故大部分人都在用大量插件等。大部分的插件都会进行数据查询与生成,这在页面生成过程中 将耗费时间。如果刚好你的主机限制比较严格的话(为了均衡资源使用率),这个时间甚至会变得比较长。减少插件是非常必要的优化手段之一

2 减少HTTP请求

每一次对于JS,CSS等文件的访问都是一次HTTP请求。插件用得少,HTTP请求数自然就更少。速度自然快了

WP在每一次的页面访问时,都会判断插件的使用情况。让WP做更少的判断就等于做更少的数据查询。解放它的负担吧。

3. 谨慎的选择主题或手动优化

许多主题虽然漂亮但在优化方面做得并不算好,各种JS,各种CSS,各种背景图片,各 种空行,各种冗余,这些都会影响到载入速度。不过这并不意味着不能选择绚丽的主题,而是主题应该要基本满足以下要求,或者你手动修改它使其满足以下要求:

l 合并CSS和JS:将多个CSS合并为1个。

l 合并背景图片:使用CSS Sprites将大部分的背景图片合并为1个文件,同样是减少HTTP请求,减少文件体积,加快渲染时间。

l 减少数据查询:能用HTML直接输出的地方就不要搞个数据查询。

l 合理的JS和CSS位置:合理的将一些JS和CSS放置到网页底部。

l 优化主题的背景图片

4. 减少外部资源的使用

外部资源就是不在自己服务器上的资源。使用太多的外部资源会遇到以下问题:

l 解析DNS的时间变长

每一个域名都是需要DNS解析才能够正常工作。如果网站上的内容同时需要加载a.com,b.com,c.com,d.com这些网站的资源,那就 需要更多的时间去分别解析每个域名的DNS,建立连接。而同样的,如果自己的站点是a.com,如果同时加载1.a.com,2.a.com这些类似的域名,也同样会加长DNS解析时间。外部资源是不可能完全避免的,但能少则少。

l 外部资源的加载速度不可控制

这主要是针对一些国外站点的内容而言,比如fickr,twitter等,因为众所周知的原因,加载它们的资源会明显减慢载入速度。而国内的站点相对来说速度还算是比较快。

5. 减少数据库查询,或使用数据库缓存插件

许多的插件都需要数据库查询,上面关于插件和主题的部分也提到了优化代码尽量减少数据库的查询次数。如果不懂,可以考虑使用数据库缓存,它能够将数据库的查询内容缓存起来

需要注意的是,数据库缓存插件不要和静态化缓存插件一起使用。因为两者都是数据缓存内容减少查询,如果一起用就等于重复劳动。

6, 使用页面静态化缓存插件

静态化缓存插件和数据库缓存插件的原理差不多,都是将内容提前整理好并生成静态的文件,当需要的时候直接拿出来,而不需要再去查找、生成,浪费时间。缓存过的静态文件基本上可以等同于一张静态图片,不需要执行太多复杂的内容。

还有一些其他优化的方法等,使用GZIP压缩网页、优化博客文章图片、使用CDN分布式网络加速静态文件等。

四、安装wordpress插件检查缓慢原因

本站运行一段时间后,每次访问首页最多时候需要20秒钟以后上, 访问一个单独文章页面也要10秒,简直不可接受,基本都要崩溃了, 最后下定决心彻底解决它。

通过查阅大量资料, 参照前面一节的办法对系统做了优化。

1. 首先屏蔽全部插件,发现系统问题依然存在, 打开首页速度依然在10秒钟左右

2. 通过httpwatch检查http请求情况,发现访问首页中,获取php页面时间是9秒钟, 打开图片、js、css等时间是2~3秒钟左右, 因此不是http请求过多造成的。

3. 打开mysql数据库的慢查询,检查数据库的慢查询情况,发现多数查询都比较快,对一些查询做了测试,速度非常快。因此数据库因素也可以排除了。

实在没办法了, 最后考虑找wordpress插件来研究一下在显示首页中都发生了那些内容,然后看看那里占用时间最长, 然后有针对的慢慢优化,只好这么干了。

到了wordpress网站,搜索 debug插件, 搜索了很多,试用了很多,都不太符合自己的要求。最后发现了一个插件“Debug Queries”,按照wp的老习惯下载并且安装,最后路下图,点击启用按钮开启插件。

wps_clip_image-31431[4][1]

安装完成插件后,打开网站首页,查看效果发现没有任何变化

最后打开一个文章页面,在文章页面最下面发现了久久寻找的东西,路下图:

wps_clip_image-11595[6][1]

图中已经用不同颜色的区域做了一些标注

红色区域: time:0.000xxxx  查询需要的时间

绿色区域: Query: 查询的sql语句

Call from: require,xxx  调用顺序等等

然后下面是另外的调用。 页面显示了本次页面显示过程调用了那些函数以及调用过程,及需要的时间(数据库的查询时间,根据这个时间及总时间我们计算出php花费的时间)

最后页面路下图:

wps_clip_image-16518[4][1]

蓝色部分:是本次访问数据查询时间 汇总, 可以看到查询共花费了0.24秒, 发生了83次查询(这个也说明wp插件带来性能的问题,只是目前系统中数据量较少,还不至于影响系统的性能)

绿色部分:是本次用户访问过程中总体时间的汇总,这里统计的应该是包括了php的总体时间。

红色部分:是本次访问的总时间

紫色部分: 本次访问中花费在php程序中消耗的百分比。97.5%

黄色部分:是本次访问中花费在MySQL数据库上时间的百分比 2.5%

从上面数据中我们可以看到, 一次10秒钟的用户访问中, mysql花费时间仅仅占用了2.5%因此可以肯定这次10秒钟的访问问题出在mysql以外的环节上, 主要应该是php的问题。

五、重新启动php进程解决缓慢问题

从上面部门的分析中我们已经可以了解到问题很可能出在php上面,排查php问题,不是我的专长,因此决定重新启动php进程看一下效果。

1. 查找php进程

输入 su - 命令, 切换端到root帐号下

在输入: ps -ef | grep php 命令,查看php进程,如下

wps_clip_image-26547[4][1]

从图中我们可以了解到php进程id 是 26765, 进程名称php-fpm(这个是nginx需要的php程序)。

2. 查找php进程的启动路径

输入如下命令 lsof -p 8584(这里的8584是在进行问题解决时php进程的id,上面26765还是最近写文章是查找的进程的id)

wps_clip_image-27654[4][1]

3. 关闭进程

kill -9 8584 关闭老的php进程

有的时候php开辟了很多进程, 不好关闭,可以采用下面的办法进行

killall php-fpm  (本站就是采用这个办法进行的)

4. 重新启动php进程

输入如下命令

/usr/sbin/php-fpm 重新启动进程

启动完毕php进程后, 去网站测试,发现1秒钟就可以网站,问题解决

发表评论