Я довольно долго возился с этим и не могу понять, как nginx + hhvm отображает мои запросы.
В основном у меня есть API на api.example.com, который я хотел бы вызвать с помощью Accept: application / vnd.com.example.api.v1 + json для версии 1 и application / vnd.com.example.api.v2 + json для версии 2. Сам API — это PHP-приложение, которое я буду запускать с использованием новой установки HHVM. Все запросы будут обработаны index.php.
api.example.com/
index.php (content: fail)
v1/
index.php (content: v1)
v2/
index.php (content: v2)
Всякий раз, когда я использую свой REST-клиент для доступа к api.example.com/test с заголовком принятия v1, я получаю ответ v1. Когда я использую заголовок accept для v2, он показывает v2. Так что все правильно. Если я не предоставлю заголовок accept, я буду перенаправлен на example.com
map $http_accept $api_version {
default 0;
"application/vnd.com.example.api.v1+json" 1;
"application/vnd.com.example.api.v2+json" 2;
}
server {
# listen to :80 is already implied.
# root directory
root /var/www/api.example.com/;
index index.html;
server_name api.example.com;
include hhvm.conf;
location / {
if ($api_version = 0) {
# redirect to example.com if applicable
# Accept-header is missing
return 307 http://example.com;
}
try_files /v$api_version/$uri /v$api_version/$uri/ /v$api_version/index.php?$args;
}
# Prevent access to hidden files
location ~ /\. {
deny all;
}
}
файл hhvm.conf включен ниже. Это производная или несколько точная функциональность hhvm.conf по умолчанию, включенная в hhvm.
location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Если я пытаюсь получить доступ к api.example.com/index.php, я получаю ответ «ошибка», даже если я ожидаю v1 для заголовка принятия v1 и v2 для заголовка принятия v2. Все остальное работает нормально, даже index.html корректно отображается в его подкаталоге.
Я пытался использовать
root /var/www/api.example.com/v$api_version/;
в конфигурации, но это только дает мне 404 ошибки от NGINX. Я верю, что на самом деле я ищу изменение корневого пути, но я не могу понять, как заставить его работать. Я также попытался удалить параметры индекса как в конфигурации nginx, так и в hhvm.conf, но это, похоже, не помогает. Я также пробовал множество различных конфигураций, и у меня было открыто по крайней мере 20-30 вкладок stackoverflow, но я явно что-то упускаю (возможно, довольно просто) здесь. Я также попытался переместить hhvm include внутри блока местоположения.
Debian 7,
Nginx / 1.2.1,
ххвм 3.2.0
О, и я впервые задаю вопрос здесь. 🙂 надеюсь, я все правильно отформатировал.
Каково содержание hhvm.conf?
Я предполагаю, что Fast CGI используется для прокси-запросов к серверу HHVM. Так что ваш hhvm.conf может выглядеть примерно так:
root /var/www/api.example.com;
index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
Который должен быть обернут директивой местоположения.
Итак, на основании вашей конфигурации показано, что я думаю, что вы должны сопоставлять php-скрипты с директивой определения местоположения HHVM, что хорошо, но при этом ваш параметр try_files, который, кажется, отвечает за выполнение версии API для файла отображение системы, не обрабатывается.
Без вашего hhvm.conf трудно сказать, что делать дальше, но я подозреваю, что вам нужно сосредоточиться на корневом значении внутри директивы location, которая содержит настройки HHVM fastcgi.
ОБНОВИТЬ
Итак, у меня есть концепция версии API, полученной из сопоставления заголовков с файловой системой, работающей для меня на nginx + HHVM. Вот мой конфиг nginx для HHVM:
location / {
root /var/www/html/hh/v$api_version;
index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
На самом деле, хотя расположение /
не лучше вашего — на самом деле ваш, вероятно, лучше, так как вы, вероятно, не хотите, чтобы HHVM обслуживал статические файлы и т. д. Но это работает для меня — в сочетании с map
у вас в исходном посте, когда я curl -H 'Accept: application/vnd.com.example.api.v2+json' localhost
Я получаю ожидаемый ответ от index.php
файл внутри каталога версии.
Я думаю, что вам нужно обновить конфигурацию HHVM nginx динамически сгенерированным root
декларация как у меня выше. Если вы все еще получаете 404, попробуйте это: в /etc/init.d/hhvm
, Найти ADDITIONAL_ARGS=
вар, сделай это ADDITIONAL_ARGS="-vServer.FixPathInfo=true"
, Я не уверен точно, что он делает, но я сталкивался с этим раньше, и это устранило странную проблему 404, с которой я сталкивался в прошлом (когда 404 исходил от HHVM, а не от Apache / nginx).
Других решений пока нет …