Назад | Перейти на главную страницу

Apache 2.4 HHVM 3.1 Обслуживание статического контента

Я установил 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.