Я установил apache 2.4 с HHVM 3.1.0 (по ночам) на ubuntu 13.10. По какой-то причине сервер правильно обслуживает файлы 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
Любой совет?
Директива ProxyPassMatch предназначена для маршрутизации только определенного трафика (например, запросов файлов php) на сервер FastCGI (например, HHVM). Вместо этого используйте директиву ProxyPass:
ProxyPass / fcgi://127.0.0.1:9000/var/www/whatever.com/
Согласно документация, который должен направлять все запросы на сервер FastCGI.
Изменить: хорошо, в ответ на ваш комментарий ProxyPassMatch - это директива, которую вы хотите использовать.
Вместо того, чтобы обсуждать с вами, как у вас все настроено, я просто объясню, как я настроил это на Ubuntu 12.04, и, возможно, вы поймете, что вам не хватает.
Прежде всего, я использую старый формат конфигурации .hdf, хотя я использую HHVM v3.1.0-dev, потому что я не могу заставить журнал доступа работать в новом формате .ini. Я попытался hhvm.log.access.file = /var/log/hhvm/access.log
но это не сработало. Это важный журнал для устранения неполадок, поэтому я пока буду придерживаться .hdf.
Вот мой сценарий выскочки:
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. Это случается для сайта Laravel 4.2.x с чистыми URL-адресами через mod_rewrite. Если ваш сайт также настроен для чистых 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 admin@site.com
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.