歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> hhvm Nginx環境搭建

hhvm Nginx環境搭建

日期:2017/2/27 15:57:12   编辑:Linux教程
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獲得了性能的提升。

安裝步驟:
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 http://blog.linuxeye.com/lnmp.tar.gz
#wget http://blog.linuxeye.com/lnmp-full.tar.gz # 包含源碼(官方下載太慢)
tar xzf lnmp.tar.gz
cd lnmp
#如果需要修改目錄(安裝、數據存儲、Nginx日志),請修改options.conf文件
screen -S lnmp # 如果網路出現中斷,可以執行命令`screen -r lnmp`重新連接安裝窗口
./install.sh
如下圖:

2. 安裝hhvm(CentOS 6 64bit)
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum clean all
yum -y remove  libevent-devel libevent 
yum -y install hhvm  --setopt=protected_multilib=false

3. 配置
修改/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 http://blog.linuxeye.com/wp-content/uploads/2014/05/vhost_hhvm.sh
chmod +x vhost_hhvm.sh
配置hhvm修改/etc/hhvm/config.hdf,保持如下:
PidFile = /var/run/hhvm/pid

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 =
}
配置以www運行hhvm:
mkdir  /home/www
chown www.www /home/www
修改/etc/hhvm/php.ini指定mysql.sock路徑(hhvm默認路徑sock路徑是/var/lib/mysql/mysql.sock)
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不提供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
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/hhvm
chmod +x hhvm
chkconfig hhvm on
service hhvm restart 
添加虛擬主機:
vhost_hhvm.sh #和lnmp添加虛擬主機一樣
測試wordpress完美運行,且速度非常快;discuz後台正常,前台頁面顯示有問題,兼容性有待完善!
出現一個問題,運行1天左右hhvm進程會自動宕掉(直接報502),可暫時加入crontab(後面找到解決方法再更新):
*/4 * * * * [ -z "`ps -ef | grep hhvm | grep -v grep`" ] && /sbin/service hhvm restart | tee -a /home/wwwlogs/hhvmrestart.log

參考:https://github.com/facebook/hhvm
原文:http://blog.linuxeye.com/396.html
Copyright © Linux教程網 All Rights Reserved