CentOS 7 编译安装 HHVM 3.4.1

博客彻底迁移到了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

已有 2 条评论
  1. 对了~ 我自己在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中编译的原因.

    1. 内存小于2G最好就不要尝试编译了,而且不能开-j3,这个在注释那边有描述的。

      并不是没有编译好,文件确实都完整了,可能是CMakeCache的问题,有些代码重新生成了,具体出现在[27%,46%,86%,97%]四个段,保证内存足够,它自己会完成的。本站在迁移之前就是运行在这个hhvm之上的。

      路径问题的确存在,这个是疏忽,谢谢指正,现已更新安装包,具体请看Changelog。

      至于为何不在/tmp上编译,那是因为,很多时候/tmp可能是一个ramdisk,并且限制了大小,大的文件是绝不可能在这个上面编译的。

说两句: