博客彻底迁移到了DigitalOcean上,无奈囊中羞涩,只能开个512MB内存的Droplet。。。
只不过,小内存也可以玩出花样。之前就一直想尝试用一下HHVM,无奈编译实在是太麻烦,一直偷懒没使用。这篇文章就用来记录期间编译安装的过程,以及一些常见的错误。以下内容部分参考HHVM的github wiki,当然也从其他博客收集了点信息,算是拼凑出来的把,希望对大家有用。
目前我所使用的系统是 CentOS 7,接下来编译安装的是HHVM-3.4.1。如果你的环境和我的一致,并且不想自己花时间编译,那么也可以下载本人已经编译好的文件HHVM-3.4.1.tar.gz。
废话不多说,开始正文。
===Changelog===
感谢zjhzxhz提交的issue,原安装包存在路径问题,现已更正,同时采用直接打包二进制文件的形式,安装方式为直接解压到/。
可能会提示找不到libonig.so.2,这个需要各位自己ldd /usr/local/bin/hhvm,看下其他的动态链接库在哪个目录,然后再为onig的动态链接库建立相应的软链接。
添加repo
yum install epel-release # add EPEL repository
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # ImageMagick
安装依赖
# 如下都是必要的依赖,不要怀疑,当然你也可以一个个排查,如果你有时间的话
yum install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc}-devel \
{sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre,glog}-devel \
lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \
{unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel
# 修补bug,在/usr/lib中创建glog的软连接
ln -s /usr/lib64/libglog.so /usr/lib/libglog.so
# 别问我为什么,我至今怀疑是否要添加这个包,但是不添加确实在链接gd_jpeg的时候出问题
yum autoremove ImageMagick # 如果已经安装,请先卸载,放心地使用autoremove
yum install ImageMagick-last* --enablerepo=remi # 从remi中获取最新的包
# 编译安装oniguruma,一个正则表达式解析库
cd /tmp
wget http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.5.tar.gz &&
tar xvzf onig-5.9.5.tar.gz && cd onig-5.9.5
./configure --prefix=/usr
make && sudo make install
编译安装hhvm
# 获取hhvm代码
cd /tmp
git clone https://github.com/facebook/hhvm -b hhvm-3.4.1 hhvm --recursive
cd hhvm
# 编译
./configure
make -j2 # 开两个线程编译,我在2G内存的虚拟机上编译,开2-3条线程最合适
sudo make install # 默认安装至/usr/local
将HHVM添加为service
创建/usr/lib/systemd/system/hhvm.service,内容如下
[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
[Service]
ExecStart=/usr/local/bin/hhvm --user www --mode daemon \
--config /etc/hhvm/server.ini \
--config /etc/hhvm/php.ini \
--config /etc/hhvm/config.hdf
[Install]
WantedBy=multi-user.target
创建必要的配置
# 请确定你已经有用户www,以及用户组www
mkdir /etc/hhvm
mkdir /var/run/hhvm
sudo chown www.www /var/run/hhvm
mkdir /var/log/hhvm
sudo chown www.www /var/log/hhvm
在/etc/hhvm中添加如下文件
config.hdf,内容如下
ResourceLimit {
CoreFileSize = 0 # in bytes
MaxSocket = 10000 # must be not 0, otherwise HHVM will not start
SocketDefaultTimeout = 5 # in seconds
MaxRSS = 0
MaxRSSPollingCycle = 0 # in seconds, how often to check max memory
DropCacheCycle = 0 # in seconds, how often to drop disk cache
}
Log {
Level = Info
AlwaysLogUnhandledExceptions = true
RuntimeErrorReportingLevel = 8191
UseLogFile = true
UseSyslog = false
File = /var/log/hhvm/error.log
Access {
* {
File = /var/log/hhvm/access.log
Format = %h %l %u % t \"%r\" %>s %b
}
}
}
MySQL {
ReadOnly = false
ConnectTimeout = 1000 # in ms
ReadTimeout = 1000 # in ms
SlowQueryThreshold = 1000 # in ms, log slow queries as errors
KillOnTimeout = false
}
Mail {
SendmailPath = /usr/sbin/sendmail -t -i
ForceExtraParameters =
}
server.ini,内容如下:
; php options
pid = /var/run/hhvm/pid
; hhvm specific
hhvm.server.port = 9001
;hhvm.server.file_socket = /var/run/hhvm/sock
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
php.ini,内容如下:
hhvm.mysql.socket = /tmp/mysql.sock
expose_php = 0 ;关闭头信息X-Powered-By (和hhvm.server.expose_hphp = false作用一样)
memory_limit = 400M
post_max_size = 50M
开启hhvm
systemctl enable hhvm
systemctl start hhvm
# 查看状态
systemctl status hhvm
在nginx中添加fastcgi配置
# 在nginx.conf中添加如下location块
location ~ .*\.php(\/.*)*$ {
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
include fastcgi_params;
}
reload Nginx配置
nginx -s reload
至此,hhvm完整的安装配置完了,当然后续还有很多调优的可能,可玩性十足,具体请参考github wiki
对了~ 我自己在2GB的VPS上编译(make)
然后在1GB的VPS上make install, 没有出现问题.
应该是你打包的版本没有编译好, 你再检查检查看看.
补充: make install遇到的问题是:
[ 27%] Building CXX object hphp/compiler/CMakeFiles/hphp_analysis.dir/compiler.cpp.o
sc++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See for instructions.
make[2]: *** [hphp/compiler/CMakeFiles/hphp_analysis.dir/compiler.cpp.o] Error 4
make[1]: *** [hphp/compiler/CMakeFiles/hphp_analysis.dir/all] Error 2
make: *** [all] Error 2
Env.: Cent OS 7.0 with Gcc 4.8.2
你有尝试申请一台新的VPS 然后在/tmp下make install吗?
显然你没有~
至于为什么在make install出现这样的Error Message
显然是有部分文件没有完全编译~ 可能是路径不同所致.
这也就是为什么HHVM的Wiki中要求在/tmp中编译的原因.
内存小于2G最好就不要尝试编译了,而且不能开-j3,这个在注释那边有描述的。
并不是没有编译好,文件确实都完整了,可能是CMakeCache的问题,有些代码重新生成了,具体出现在[27%,46%,86%,97%]四个段,保证内存足够,它自己会完成的。本站在迁移之前就是运行在这个hhvm之上的。
路径问题的确存在,这个是疏忽,谢谢指正,现已更新安装包,具体请看Changelog。
至于为何不在/tmp上编译,那是因为,很多时候/tmp可能是一个ramdisk,并且限制了大小,大的文件是绝不可能在这个上面编译的。