2014-09-19 1 views
9

나는 꽤 오랫동안이 주변을 둘러 보았고, nginx + hhvm이 나의 요청을 매핑하는 방법에 대해 정말로 이해할 수 없었다.nginx지도 api 이상한 행동에 대한 하위 디렉토리를 받아 들일 때

나는 기본적으로 api.example.com에 API를 사용하여 Accept : application/vnd.com.example.api.v1 + json 버전 1과 application/vnd.com.example .api.v2 + json (버전 2). API 자체는 새로 설치 한 HHVM을 사용하여 실행할 PHP 응용 프로그램입니다. 모든 요청은 index.php에 의해 전달됩니다.

폴더 구조는 다음과 같습니다 : 내 REST 클라이언트를 사용할 때마다

api.example.com/ 
    index.php (content: fail) 
    v1/ 
    index.php (content: v1) 
    v2/ 
    index.php (content: v2) 

내가 다시 V1의 응답을받을 헤더를 수락 V1과 api.example.com/test에 액세스 할 수 있습니다. v2에 accept 헤더를 사용하면 v2가 표시됩니다. 그래서 모든 것이 정확합니다. 내가 어떤 헤더를 허용 제공하지 않으면 내가 Nginx에 구성이 hhvm.conf 파일이 아래에 포함되어 있습니다이

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; 
     } 
} 

과 같은

example.com로 리디렉션. hhvm에 포함 된 기본 hhvm.conf의 파생되거나 다소 정확한 기능입니다. 내가 응답을 "실패"내가 할 api.example.com/index.php에 액세스하려고 나는 V1에 대한 V1을 기대하고 경우에도 헤더 및 v2에 동의하면
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; 
} 

내 문제

입니다 v2 accept 헤더. 다른 모든 것들이 잘 작동하는 것처럼 보입니다. 심지어 index.html도 올바르게 서브 디렉토리에 매핑됩니다. 내가 구성에

root /var/www/api.example.com/v$api_version/; 

를 사용

내가 해봤을 시도했습니다,하지만 그건 단지의 nginx에서 나에게 404 오류를 제공 무엇

. 내가 찾고있는 것이 루트 경로를 실제로 바꾸는 것이라고 생각하지만 실제로 작동하게 만드는 방법에 대한 내 머리가 없습니다. 또한 nginx 구성 및 hhvm.conf에서 인덱스 매개 변수를 제거하려고 시도했지만 도움이되지 않습니다. 나 또한 다른 구성의 톤을 시도하고 적어도 20-30 탭 stackoverflow이 문제를 해결하기 위해 열어 봤지만, 분명히 여기에 뭔가가 (아마 비교적 간단) 누락되었습니다. 나는 또한 위치 블록 내부에 hhvm include를 이동 시키려고 시도했다.

셋업

의 nginx/1.2.1 데비안 7, , hhvm 3.2.0

아, 그리고 실제로 여기에 질문을 내 첫 번째 시간입니다. :) 나는 모든 것을 올바르게 포맷했으면 좋겠다.

+0

+1 큰 질문입니다. 왜 모든 신규 사용자가 당신과 같을 수 있습니까? –

+0

@RaduMurzea 대단히 감사합니다. 듣는 것이 즐겁습니다. 슬프게도 귀하의 질문에 대한 답변이 없지만 더 자세히 조사 할 것입니다. –

답변

2

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가 없으면 다음에 할 일을 말하기 어렵지만, HHVM fastcgi 설정이 들어있는 위치 지정 문에 루트 값에 집중해야한다고 생각합니다.

UPDATE 그래서 나는의 nginx + HHVM에 나를 위해 일하는 파일 시스템에 헤더 매핑에서 파생 된 API 버전의 개념을 가지고있다. 여기 HHVM 내의 nginx의 설정입니다 :

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 등 그러나 정적 파일을 제공하지 않기 때문에 아마도 더 이것은 나를 위해 일하고있다 - 내가 curl -H 'Accept: application/vnd.com.example.api.v2+json' localhost 일 때 원래 게시물에 가지고있는 map과 결합하여 버전 디렉토리 안에있는 index.php 파일의 예상 응답을 얻는다.

당신이해야 할 일은 위의 광산처럼 동적으로 생성 된 root 선언으로 HHVM nginx 설정을 업데이트하는 것입니다. 여전히 404가 나오면 다음을 시도하십시오. /etc/init.d/hhvm에서 ADDITIONAL_ARGS="-vServer.FixPathInfo=true"으로 ADDITIONAL_ARGS= var을 찾으십시오. 나는 그것이 정확히 무엇인지 모르겠지만, 전에 우연히 만났고, 내가 과거에 가지고 있었던 이상한 404 문제를 해결했다. (404가 HHVM에서 온 것이지, Apache/nginx가 아니다.)

+0

저는 혼란을 피하기 위해 기본 HHVM 구성을 사용하고 있습니다. (나는 그것이 그것의 일부가되도록 시켰지 만, 어떻게 작동하는지에 대해서는 확신이 없습니다.) 질문을 HHVM 구성 파일로 업데이트하겠습니다. 나는 당신이하는 것과 같은 방식으로 추론 해왔다.하지만 내 질문에 따르면, 당신은'root /var/www/api.example.com/v$api_version/; '위치 디렉토리에서 404 오류 만 제공합니다. –

+0

귀하의 답변은 많은 도움이됩니다. 그것은 올바른 방향으로 나아가는 단계입니다. hhvm.conf에는 실제로 .hh 및 .php 파일 엔딩에 대한 매핑이 포함되어있어 try_files보다 우선 순위가 높습니다. 그러나 이상한 404 오류로 인해 루트를 하위 디렉토리로 변경할 수 없습니다. 하지만 아마도 hhvm.conf를 포함 시켜서이 문제를 해결할 수 있습니다.이 경우 hh 및 .php에 대한 매핑이 포함되지 않습니다. –

+0

내 대답이 내 HHVM 구성으로 업데이트되었습니다. – ndavison