CentOS 6下hhvm Nginx环境搭建

    HHVM(HipHop Virtual Machine)会将PHP代码转换成高级别的字节码(通常称为中间语言)。然后在运行时通过即时(JIT)编译器将这些字节码转换为x64的机器码。在这些方面,HHVM十分类似与C#的CLR和Java的JVM。

    2008年Facebook就开始使用HipHop(现在成为HPHP),这是一种PHP执行引擎;最初是为了将Fackbook的大量PHP代码转成C++,以提高性能和节约资源。最初的版本成为HPHPc,是一个PHP到C++的编译器。
     
    之后的两年里,Fackbook又向HipHop中增加了HPHPi和HPHPd,HPHPi其实就是开发版的HPHP,HPHPd则是HipHop的调试器。通过HPHPd开发人员可以单步调试运行在HipHop平台上的PHP代码。
     
    使用HipHop的PHP代码在性能上最大可以是原生的6倍。但是,第一版的HipHop有不少确定,具体如下:
    HPHPc无法完全支持PHP的所有特性,最典型的是无法支持create_function()和eval()两个函数。但老实说,不支持后一个函数我不觉得是件坏事。
    Facebook的开发者不得不维护两种不同的引擎(HPHPc和HPHPi),这直接导致了重复劳动和资源浪费。

    最后,HPHPc部署步骤繁杂,这点很让PHP开发者头疼。.

    在2010年初,Fackbook因为这些问题做出了2个重大的决定。首先是将HipHop平台开源,通过这种方式来加快HipHop的发展。
    其次,Facebook开始开发HipHop的更高版本,也就是HHVM(HipHop虚拟机),HHVM加强了HPHPc的健壮性,同时还修复了许多重要错误。
     
    HHVM是在HPHPc的基础上构建,它会将PHP代码转换成高级别的字节码(一种中间语言),在运行时即时(JIT)编译器会将这些字节码翻译成机器码。
     
    下面是一些关于字节码、机器码和即时(JIT)编译器的概念,快速的浏览以下概念,可以清楚这些概念在HHVM所处的角色。

    • 字节码:是一种人类无法阅读的代码,专门用来给编译器高效执行的。当HHVM首次加载项目时,它会将所有的PHP代码转换成字节码;字节码的生成是与平台无关的。
    • 机器码:是一系列供CPU执行的指令。用过汇编的都应该清楚机器码,估计没人喜欢用汇编编程。通过编译器就可以把汇编转成机器码,然后供CPU处理。
    • JIT(即时)编译器:即时编译是种软件优化技术,指在运行时才会去编译字节码。字节码会存放在内存中,然后JIT编译器会根据需要加载并编译所涉的字节码。

    通过以上技术,HipHop和HHVM获得了性能的提升。
    CentOS 7下hhvm Nginx环境搭建》,下面是在CentOS6下安装教程
    安装步骤:
    1. 利用《lnmp一键安装包》安装Nginx和MySQL(也可以选择安装php,hhvm可以和php同时运行

    yum -y install wget screen # for CentOS/Redhat
    #apt-get -y install wget screen # for Debian/Ubuntu
    wget //linuxeye.com/lnmp.tar.gz
    #wget //linuxeye.com/lnmp-full.tar.gz # 包含源码(官方下载太慢)
    tar xzf lnmp.tar.gz
    cd lnmp
    #如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件
    screen -S lnmp # 如果网路出现中断,可以执行命令`screen -r lnmp`重新连接安装窗口
    ./install.sh

    如下图:

    CentOS 6下hhvm Nginx环境搭建

    2. 安装hhvm
    添加epel yum源

    rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    

    安装hhvm所需要的依赖包

    yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \
    libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \
    bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \
    libevent-devel libcurl-devel libmemcached-devel
    

    添加gleez yum源(官方地址被墙)

    rpm -Uvh //linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
    

    添加remi yum源

    rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
    

    从remi安装hhvm依赖包

    yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
    

    安装hhvm

    yum -y --nogpgcheck install hhvm
    

    查看hhvm版本号

    hhvm --version
    HipHop VM 3.4.0-dev+2014.09.29 (rel)
    Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905
    Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dca
    Extension API: 20140829
    

    3. 配置hhvm
    删除安装hhvm时创建的nginx用户

    userdel -r nginx
    

    修改hhvm目录权限为www

    chown -R www.www /var/run/hhvm
    chown -R www.www /var/log/hhvm 

    修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:

            location ~ .*\.(php|php5)?$  {
                    fastcgi_pass   unix:/var/run/hhvm/sock;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include        fastcgi_params;
                    }
    service nginx reload

    下载支持hhvm方式添加虚拟主机脚本 vhost_hhvm.sh

    cd lnmp
    wget //linuxeye.com/wp-content/uploads/2014/05/vhost_hhvm.sh
    chmod +x vhost_hhvm.sh

    配置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 =
    }

    配置hhvm修改/etc/hhvm/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

    修改/etc/hhvm/php.ini,使内容保存如下:

    hhvm.mysql.socket = /tmp/mysql.sock ;指定mysql.sock路径(hhvm默认路径sock路径是/var/lib/mysql/mysql.sock)
    expose_php = 0 ;关闭头信息X-Powered-By (和hhvm.server.expose_hphp = false作用一样)
    memory_limit = 400M
    post_max_size = 50M 

    默认hhvm不提供php中类似disable_functions参数,如何禁用hhvm中shell_exec函数?(可选
    在/etc/hhvm/php.ini中追加如下:

    hhvm.jit_enable_rename_function=true
    auto_prepend_file= /home/wwwroot/default/disable_functions

    新建/home/wwwroot/default/disable_functions,使该文件内容如下:

    <?php
    
    function __forbidden_function($name, $obj, $args, $data, &$done) {
      throw new Exception('Calling '.$name.' is forbidden.');
    }
    
    fb_intercept('shell_exec', '__forbidden_function');

    配置service管理hhvm:

    cd /etc/init.d/
    rm -rf hhvm #官方默认脚本是以www运行,建议用我修改后的
    wget //linuxeye.com/wp-content/uploads/2014/05/hhvm
    chmod +x hhvm
    chkconfig hhvm on
    service hhvm restart 
    

    添加虚拟主机:

    vhost_hhvm.sh #和lnmp添加虚拟主机一样

    测试wordpress完美运行,且速度非常快;discuz后台正常,前台页面显示有点问题
    参考:https://github.com/facebook/hhvm/wiki/HHVM-Pre-built-packages-for-Centos-6.5

    Sun May 18 22:08:28 CST 2014
    • 本文由 发表于 2014-05-18
    • 转载请务必保留本文链接:https://linuxeye.com/396.html
    Nginx Lua Redis防止CC攻击 Linux

    Nginx Lua Redis防止CC攻击

    Nginx Lua Redis防止CC攻击实现原理:同一个外网IP、同一个网址(ngx.var.request_uri)、同一个客户端(http_user_agent)在某一段时间(CCseconds...
    Keepalived+Nginx架构整理版 Linux

    Keepalived+Nginx架构整理版

    Keepalived介绍 keepalived是一个类似于layer3, 4, 5 交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如...
    Nginx中文域名配置 Linux

    Nginx中文域名配置

    Nginx虚拟主机上绑定一个带中文域名,比如linuxeye.中国,浏览器不能跳转。 why? 因为操作系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,所以DNS服务器上并不支持直接的中...
    Wordpress优化——利用Nginx fastcgi_cache缓存加速 Linux

    WordPress优化——利用Nginx fastcgi_cache缓存加速

    高并发网站架构的核心原则其实就一句话"把所有的用户访问请求都尽量往前推",即:能缓存在用户电脑本地的,就不要让他去访问CDN。 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了。能访问静...
    匿名

    发表评论

    匿名网友