
Ich habe Apache 2.4 mit HHVM 3.1.0 (nightly) auf Ubuntu 13.10 eingerichtet. Aus irgendeinem Grund stellt der Server die hhvm-Dateien (.php) korrekt bereit, aber wenn ich versuche, eine .html/.css oder eine andere statische Datei zu laden, wird ein Download initiiert, anstatt
Ich habe diese Frage auf Stackoverflow gestellt, sie wurde jedoch zurückgestellt, da sie mit dem Server zusammenhängt:Ursprünglicher Beitrag
Meine HHVM server.ini sieht folgendermaßen aus:
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
Und apache2.conf enthält das folgende ProxyPassMatch:
ProxyPassMatch ^/(.*.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1
Irgendein Rat?
Antwort1
Die ProxyPassMatch-Direktive dient dazu, nur bestimmten Datenverkehr (z. B. Anfragen für PHP-Dateien) an den FastCGI-Server (z. B. HHVM) weiterzuleiten. Verwenden Sie stattdessen die ProxyPass-Direktive:
ProxyPass / fcgi://127.0.0.1:9000/var/www/whatever.com/
Entsprechend derDokumentation, das alle Anfragen an den FastCGI-Server weiterleiten sollte.
Bearbeiten: Okay, als Antwort auf Ihren Kommentar: ProxyPassMatch ist die Direktive, die Sie dann verwenden möchten.
Anstatt mit Ihnen immer wieder zu erklären, wie Sie alles eingerichtet haben, erkläre ich Ihnen einfach, wie ich es unter Ubuntu 12.04 eingerichtet habe. Vielleicht finden Sie dann heraus, was Sie übersehen haben.
Zunächst einmal verwende ich das alte .hdf-Konfigurationsformat, obwohl ich HHVM v3.1.0-dev verwende, da ich das Zugriffsprotokoll im neuen .ini-Format nicht zum Laufen bekomme. Ich habe es versucht, hhvm.log.access.file = /var/log/hhvm/access.log
aber es hat nicht funktioniert. Das ist ein wichtiges Protokoll für die Fehlerbehebung, also bleibe ich vorerst bei .hdf.
Hier ist mein Upstart-Skript:
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
Wenn ich HHVM stoppen und starten möchte, verwende ich sudo stop hhvm
und sudo start hhvm
.
Hier ist meine /etc/hhvm/server.hdf-Datei:
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
}
Theoretisch würde eine entsprechende Konfigurationsdatei im neuen .ini
Format ungefähr so aussehen:
; 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
Und hier ist eine Beispieldatei von VirtualHost basierend auf einer meiner Sites, die so konfiguriert ist, dass Anfragen für PHP-Skripte an HHVM weitergeleitet werden. Dies ist zufällig eine Laravel 4.2.x-Site mit sauberen URLs über mod_rewrite. Wenn Ihre Site auch für saubere URLs konfiguriert ist, stellen Sie sicher, dass Sie [PT]
am Ende der RewriteRule
Zeile Folgendes haben, damit mod_rewrite die Anfrage an mod_proxy weiterleitet, nachdem es damit fertig ist. Anfangs habe ich [L]
(vielleicht irrtümlicherweise) Folgendes verwendet und konnte nicht herausfinden, warum mod_proxy die Anfrage nicht an HHVM weiterleitete.
<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>
Ich denke, das sind die drei wichtigsten Konfigurationsdateien, auf die Sie sich konzentrieren müssen. Die ProxyPassMatch-Direktive sollte Apache anweisen, Anfragen für PHP-Dateien an HHVM weiterzuleiten. Anfragen für andere Dateitypen sollten wie gewohnt von Apache bedient werden. Wenn Sie die ProxyPassMatch-Direktive auskommentieren, Apache neu starten und alles wie vorgesehen funktioniert, wäre ich überrascht. Ich vermute, Ihr Apache ist schuld daran, dass CSS-, JS- und HTML-Dateien als Downloads bereitgestellt werden.