centos6.5使用hhvm为wordpress加速
近期由于appfog的免费套餐不让用了,将自己的blog站点从国外迁移到阿里云上。阿里云的配置为1核cpu 1G memory ,最初使用的是nginx + php-fpm的组合 。在使用了更种cache和cdn手段优化后,打开伪静态页面时速度还可以。不过在打开page页面时出奇的慢。使用web在线测试工具后排除了网络自身的问题(当前办公环境的网络挺烂,上个外网都要各种代理)后,登陆云主机查看进程信息和资源信息后,发现在打开page页时,php-fpm进程cpu使用率一直维持在99% ~ 100% 。
在尝试使用xcache 、apache + mod_php 等各种优化组合后问题依旧不见好转。万般无奈之下决定尝试使用facebook 开发的神器 ———— hhvm 。
一、hhvm简介
HHVM(HipHop Virtual Machine)会将PHP代码转换成高级别的字节码(通常称为中间语言)。然后在运行时通过即时(JIT)编译器将这些字节码转换为x64的机器码。在这些方面,HHVM十分类似与C#的CLR和Java的JVM。
2008年Facebook就开始使用HipHop(现在成为HPHP),这是一种PHP执行引擎;最初是为了将Fackbook的大量PHP代码转成C++,以提高性能和节约资源。最初的版本成为HPHPc,是一个PHP到C++的编译器。
2010年初,facebook将HipHop平台开源,在后续的发展中,hiphop开发出更高的版本,也就是HHVM 。HHVM加强了HPHPc的健壮性,同时还修复了许多重要错误。
二、hhvm的安装
这里以centos6.x为例,增加epel 及gleez 源,并安装hhvm:
1#增加epel源,并安装相关依赖包
2rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
3yum install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel\
4libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \
5bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \
6libevent-devel libcurl-devel libmemcached-devel
7#增加gleez源,并安装hhvm
8rpm -Uvh http://yum.gleez.com/6/x86_64/gleez-repo-6-0.el6.noarch.rpm
9yum -y install hhvm
除了gleez源,也可以使用hop5源:
1wget http://www.hop5.in/yum/el6/hop5.repo
2yum clean all
3yum install hhvm
安装完成后,可以通过以下命令查看进行确认:
1[root@361way ~]# hhvm -a
2Welcome to HipHop Debugger!
3Type "help" or "?" for a complete list of commands.
4Note: no server specified, debugging local scripts only.
5If you want to connect to a server, launch with "-h" or use:
6 [m]achine [c]onnect <servername>
7hphpd>
注:ubuntu、mint、debian等其他平台的安全这里就不再介绍,安装时具体可以参看hhvm 在 github上的wiki 介绍 。
三、hhvm 的运行模式及配置文件
hhvm有三种运行模式:web服务器模式、fastcgi 模式、socket模式
1、web服务器模式
类似于python、ruby的web框架运行模式,hhvm可以不依赖其他web服务器,直接以web模式运行。其可以通过以下命令直接运行:
1/usr/bin/hhvm --mode server --user www -vServer.Port=80
也可以通过读取配置文件进行运行:
1# cat /etc/hhvm.hdf
2Server {
3 Port = 80
4 SourceRoot = /var/www/ #指定web站点的根目录
5}
6Eval {
7 Jit = true
8}
9Log {
10 Level = Error
11 UseLogFile = true
12 File = /var/log/hhvm/error.log
13 Access {
14 * {
15 File = /var/log/hhvm/access.log
16 Format = %h %l %u %t \"%r\" %>s %b
17 }
18 }
19}
20#指定虚拟主机
21VirtualHost {
22 * {
23 Prefix = blog.361way.com
24 #这里是Server节点 SourceRoot根目录下的子目录名称,本例中表示虚拟主机位于/var/www/blog
25 PathTranslation = blog
26 CheckExistenceBeforeRewrite = true
27 #虚拟主机域名
28 ServerName = www.361way.com
29 Pattern = .*
30 RewriteRules {
31 dirindex {
32 pattern = ^/(.*)/$
33 to = $1/index.php
34 qsa = true
35 }
36 }
37 }
38}
39#指定静态文件及规则
40StaticFile {
41 FilesMatch {
42 * {
43 pattern = .*\.(dll|exe)
44 headers {
45 * = Content-Disposition: attachment
46 }
47 }
48 }
49 Extensions {
50 css = text/css
51 gif = image/gif
52 html = text/html
53 jpe = image/jpeg
54 jpeg = image/jpeg
55 jpg = image/jpeg
56 png = image/png
57 tif = image/tiff
58 tiff = image/tiff
59 txt = text/plain
60 }
61}
可以通过下面的命令通过读取配置文件直接运行:
1/usr/bin/hhvm --mode daemon --user www-data --config /etc/hhvm.hdf
2、fastcgi模式
hhvm也可以像php-fpm 一样,通过监听某个端口,前端通过apache、nginx进行反向代理进行访问,如监听在9000端口,就可以通过以下命令运行:
1/usr/bin/hhvm --mode daemon --user www -vServer.Type=fastcgi -vServer.Port=9000
以前端为nginx为例,nginx的反向代理配置部分如下 ( 可以看出和使用php-fpm模式没什么区别 ):
1location ~ .*\.(hh|php|php5)?$ {
2 fastcgi_pass 127.0.0.1:9000;
3 fastcgi_index index.php;
4 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
5 include fastcgi_params;
6 }
同样也可以通过读取配置文件,配置更多的参数,hhvm配置文件如下:
1# cat /etc/hhvm/server.hdf
2PidFile = /var/run/hhvm/pid
3Server {
4 Port = 9000
5 Type=fastcgi
6 # File_socket = /var/run/hhvm/hhvm.sock
7 # SourceRoot = /var/www/
8 DefaultDocument = index.php
9}
10Log {
11 Level = Warning
12 AlwaysLogUnhandledExceptions = true
13 RuntimeErrorReportingLevel = 8191
14 UseLogFile = true
15 UseSyslog = false
16 File = /var/log/hhvm/error.log
17 Access {
18 * {
19 File = /var/log/hhvm/access.log
20 Format = %h %l %u % t \"%r\" %>s %b
21 }
22 }
23}
24Repo {
25 Central {
26 Path = /var/log/hhvm/.hhvm.hhbc
27 }
28}
29#include "/usr/share/hhvm/hdf/static.mime-types.hdf"
30StaticFile {
31 FilesMatch {
32 * {
33 pattern = .*\.(dll|exe)
34 headers {
35 * = Content-Disposition: attachment
36 }
37 }
38 }
39 Extensions : StaticMimeTypes
40}
41MySQL {
42 TypedResults = false
43}
通过以下命令读取配置文件运行:
1/usr/bin/hhvm --config /etc/hhvm/server.hdf --user www --mode daemon
3、socket模式
该模式大部分配置文件同fastcgi 模式下的参数一致,这点和php-fpm 运行在端口模式与socket模式一样。运行socket模式下需要开启下面配置中的参数:
1 # File_socket = /var/run/hhvm/hhvm.sock
同样,也可以直接在命令行中增加vServer.File_socket参数进行运行。
四、hhvm为什么这么快?
相对于原生的php,网上很多人评测hhvm是原生的5-6倍的有之,10-20倍的亦有之。且不管网上的这些评测结果,单说我在阿里云上运行的效果。页面打开的速度显然较之前快了不止一倍,而且较之前使用php-fpm的方式运行,稳定性也有所增强。根据我当前的配置hhvm进程占用内存在20%左右(200M左右),当有页面进行解析时,也基本维持在这个范围,这点很类似java的jvm模式 ,预先将内存点用。
通过查询发现,hhvm使用了以下技术:
- 字节码:是一种人类无法阅读的代码,专门用来给编译器高效执行的。当HHVM首次加载项目时,它会将所有的PHP代码转换成字节码;字节码的生成是与平台无关的。
- 机器码:是一系列供CPU执行的指令。用过汇编的都应该清楚机器码,估计没人喜欢用汇编编程。通过编译器就可以把汇编转成机器码,然后供CPU处理。
- JIT(即时)编译器:即时编译是种软件优化技术,指在运行时才会去编译字节码。字节码会存放在内存中,然后JIT编译器会根据需要加载并编译所涉的字节码。
通过以上技术,HipHop和HHVM获得了性能的提升。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/centos-nginx-hhvm-wordpress/4010.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.