我已经在 ubuntu 13.10 上安装了 apache 2.4 和 HHVM 3.1.0 (nightly)。由于某种原因,服务器可以正确提供 hhvm 文件 (.php),但是当我尝试加载 .html/.css 或任何其他静态文件时,它会启动下载,而不是显示
我在 stackoverflow 上问了这个问题,但是由于与服务器相关所以被搁置了:原始帖子
我的 HHVM server.ini 如下所示:
hhvm.server.port = 9000
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.server.source_root = /var/www
hhvm.enable_static_content_from_disk = true
并且 apache2.conf 包含以下 proxypassmatch:
ProxyPassMatch ^/(.*.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1
有什么建议吗?
答案1
ProxyPassMatch 指令用于仅将某些流量(即对 php 文件的请求)路由到 FastCGI 服务器(即 HHVM)。请改用 ProxyPass 指令:
ProxyPass / fcgi://127.0.0.1:9000/var/www/whatever.com/
根据文档,它将把所有请求路由到 FastCGI 服务器。
编辑:好的,回应您的评论,ProxyPassMatch 就是您想要使用的指令。
我不会来回跟你讲解如何设置一切,而是只解释一下我是如何在 Ubuntu 12.04 上进行设置的,这样你也许就能弄清楚你遗漏了什么。
首先,尽管我运行的是 HHVM v3.1.0-dev,但我使用的是旧的 .hdf 配置格式,因为我似乎无法让访问日志以新的 .ini 格式工作。我试过了,hhvm.log.access.file = /var/log/hhvm/access.log
但没有成功。这是故障排除的重要日志,所以我现在还是坚持使用 .hdf。
这是我的 upstart 脚本:
description "HipHop VM server"
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 10 5
umask 002
pre-start script
mkdir -p -m0755 /var/run/hhvm
chown apachetwo:threews /var/run/hhvm
end script
# Location of executable
env SERVER=/usr/local/sbin/hhvm
exec $SERVER --mode daemon -c /etc/hhvm/test.hdf --user apachetwo
每当我想要停止和启动 HHVM 时,我都会使用sudo stop hhvm
和sudo start hhvm
。
这是我的 /etc/hhvm/server.hdf 文件:
PidFile = /var/run/hhvm/pid
Server {
Type = fastcgi
Port = 9000
SourceRoot = /var/www/html/
DefaultDocument = index.php
}
Log {
Level = Verbose
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
}
}
}
Repo {
Central {
Path = /var/log/hhvm/.hhvm.hhbc
}
}
MySQL {
TypedResults = false
}
理论上,新格式的等效配置文件.ini
将如下所示:
; php options
pid = /var/run/hhvm/pid
; hhvm specific
hhvm.server.type = fastcgi
hhvm.server.port = 9000
hhvm.server.source_root = /var/www/html
hhvm.server.default_document = index.php
hhvm.log.level = Verbose
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.log.use_log_file = true
hhvm.log.use_syslog = false
hhvm.log.file = /var/log/hhvm/error.log
hhvm.log.access.file = /var/log/hhvm/access.log
hhvm.log.access.format = %h %l %u % t \”%r\” %>s %b
hhvm.repo.central.path = /var/log/hhvm/.hhvm.hhbc
hhvm.mysql.typed_results = false
下面是一个基于我的一个站点的示例 VirtualHost 文件,该站点配置为将 PHP 脚本的请求代理到 HHVM。这恰好是一个通过 mod_rewrite 具有干净 URL 的 Laravel 4.2.x 站点。如果您的站点也配置了干净 URL,请确保[PT]
在行末有RewriteRule
,以便 mod_rewrite 在完成请求后将请求传递给 mod_proxy。最初,我正在使用[L]
(可能是错误的),但无法弄清楚为什么 mod_proxy 没有将请求传递给 HHVM。
<VirtualHost *:80>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/site.com/htdocs/public/$1
DirectorySlash On
DirectoryIndex index.php
ServerAdmin [email protected]
ServerName www.site.com
DocumentRoot /var/www/site.com/htdocs/public/
AllowEncodedSlashes On
# Don't display the ServerAdmin email address on server generated pages
ServerSignature Off
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(index\.php|/images|/includes|/cache|/mpd|/packages|/queues|/samples|/robots\.txt|/sitemap\.xml)
RewriteRule ^(.*)$ /index.php$1 [PT]
<Directory /var/www/site.com/htdocs>
Require all granted
Options +FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/site.com/htdocs/public>
Require all granted
Options +FollowSymLinks
AllowOverride None
</Directory>
ErrorLog /var/log/apache2/www.site.com.error.log
LogLevel alert rewrite:trace6 proxy:trace6
CustomLog /var/log/apache2/www.site.com.access.log combined
</VirtualHost>
我认为这些是您需要关注的主要三个配置文件。ProxyPassMatch 指令应指示 Apache 将 PHP 文件的请求代理到 HHVM。其他文件类型的请求应由 Apache 正常处理。如果您可以注释掉 ProxyPassMatch 指令,重新启动 Apache 并且一切正常,那么我会感到惊讶。我猜您的 Apache 应该为将 CSS、JS 和 HTML 文件作为下载提供负责。