2017-01-19 6 views
1
server { 
    listen 80; 
    server_name ~^(?<cc>.+?).local.solar.bc.digital$; 
    client_max_body_size 1m; 

    root /home/vagrant/sites/$cc/_www/; 
    index index.html index.htm index.php; 
    error_page 404 /index.php; 
    access_log /var/log/nginx/$cc-access.log; 
    error_log /var/log/nginx/$cc-error.log; 
    charset utf-8; 
    sendfile off; 

    location/{ 
    root /home/vagrant/sites/$cc/_www/php/; 
    try_files $uri $uri/ /index.php?$query_string; 
    } 

    location /shop/ { 
    # root /home/vagrant/sites/$cc/_www/bcshop/; 
    try_files $uri $uri/ /index.php?$query_string; 
    } 

    location ~ \.php$ { 
    fastcgi_index index.php; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $request_filename; 
    fastcgi_param APP_ENV dev; 
    fastcgi_param PLATFORM_ENVIRONMENT local; 
    fastcgi_read_timeout 300; 
    fastcgi_buffers 16 16k; 
    fastcgi_buffer_size 32k; 
    } 

    location ~ /\.ht { 
    deny all; 
    } 
} 

맞아요. 내가하려고하는 것을 보았다면, 그것이 효과가 없다는 것을 알아라!Nginx 여러 위치에 각각 고유 한 루트가 있습니다.

일부 세부 사항은 : 나는 에러가 발생하지 않고 있기 때문에

  1. 나는 일반 '루트'를 가지고있다.
  2. 이것은 개발 용 로컬 VM에 있습니다. 우리는 각 프로젝트마다 위의 설정에서 $ cc 변수를 참조하는 배포 도구를 로컬로 가지고 있으며 최대 두 개의 응용 프로그램을 배포 할 수 있습니다. 각각의 프로젝트마다 반드시 둘 다 배포되는 것은 아닙니다. 첫 번째 앱은 /home/vagrant/sites/$cc/_www/php에 배포되고 두 번째 앱은 /home/vagrant/sites/$cc/_www/bcshop (내가 만들 수 있습니다. 설정에서 볼 수 있습니다) -
  3. 두 앱 모두 드루팔 (Drupal에서 실행되므로로드가 동일합니다. 나는 그 (것)들을 일하게 단순히 만들 수 없다. 내가 시도한 작은 변형의 대부분과 함께 파일을 찾을 수 없습니다.
  4. 두 번째 앱을 /home/vagrant/sites/$cc/_www/shop (예 : /home/vagrant/sites/$cc/_www/bcshop)에 배치하면 홈페이지가로드 될 수 있지만 다른 것은 없습니다.
  5. 두 번째 앱을 무시하고 첫 번째 앱에만 집중하면 일반 루트를 /home/vagrant/sites/$cc/_www/php으로 설정하고 /에서 로컬 루트를 삭제하면됩니다. 그거야. 그러나 로컬 루트로 지정된 경우에는 그렇지 않습니다. 이 경우 로그에서이 오류가 발생합니다. "FastCGI가 stderr로 전송되었습니다 :"업스트림에서 응답 헤더를 읽는 동안 "기본 스크립트를 알 수 없음". 이것은 첫 번째 앱에만 해당됩니다.
  6. 일반적인 루트가 그 값으로 설정된 이유가 궁금하다면, 일반적인 루트가 일치되는 위치에 대해 검증 할 수없는 경우 로그에 오류가 발생하기 때문입니다. 말이된다?

내가 요약 한 내용을 거의 다 설명했다고 생각합니다.

생각하십니까?

저는 전문가가 아니기 때문에 시험 및 기타 도움을 받아 여기에서 답변을 드리겠습니다. 그러나 지금까지는 기쁨이 없습니다.

감사합니다.

+0

귀하의 * 글로벌 * 루트가 위치'에 의해 사용됩니다 ~ \ .PHP $'는'$의 request_filename'를 해결하기 위해. 여전히 PHP 파일에는'/ home/vagrant/sites/$ cc/_www'를 사용하고 그 밖의 모든 것에 대해서는'/ home/vagrant/sites/$ cc/_www/php'를 왜 사용하는지 이해하지 못합니다. –

+0

@ 리차드 스미스 좋은 지적입니다. 나는 그 자신을 의심했다. 그러나 나는 일반적인 루트가 존재 테스트를 실패하지 않아야한다는 나의 이슈를 해결할 방법을 모른다. (예 :'testing '/ home/vagrant/sites/shop/_www/php "존재하지 못했습니다."). 두 위치 모두에 대해 PHP를 처리하려면'location ~ \ .php $'를 사용하고 싶습니다. 가능한? 'location ~ \ .php $'의 루트는 첫 번째 위치와/home/vagrant/sites/$ cc/_www/bcshop'과 일치 할 때'/ home/vagrant/sites/$ cc/_www/php'가되어야합니다. 두 번째와 일치 할 때. 방법? –

답변

0

경로가 _www/bcshop/이고 경로가 _www/php/ 인 PHP 파일이 있습니다. 두 응용 프로그램에 공통적 인 location ~ \.php$을 사용하려면 각 응용 프로그램의 URI 앞에 /bcshop/php을 각각 추가해야합니다. 즉, 두 응용 프로그램 은 서브 디렉토리에서 실행하려면으로 표시됩니다.

한 응용 프로그램의 경우 /shop 접두사를 사용하고 다른 응용 프로그램의 경우 접두어 /을 사용하려고합니다. 이 경우 2 개의 location ~ \.php$ 블록이 필요합니다.

root /home/vagrant/sites/$cc/_www/php; 
location/{ 
    try_files $uri $uri/ /index.php?$query_string; 
} 
location ~ \.php$ { 
    try_files $uri /index.php; 

    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $request_filename; 
    ... 
} 

그리고 하나의 응용 프로그램이 /shop의 URI 접두어로 실행되지만 하위 디렉토리 _www/bcshop에 있습니다 : :

location ^~ /shop { 
    rewrite ^/shop(?:/(.*))?$ /bcshop/$1 last; 
} 

location ^~ /bcshop/ { 
    internal; 
    root /home/vagrant/sites/$cc/_www; 

    try_files $uri /shop/index.php?$query_string; 

    location ~ \.php$ { 
     try_files $uri /shop/index.php; 

     include /etc/nginx/fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $request_filename; 
     ... 
    } 
} 

^~ 수정이 location 보장

한 응용 프로그램은 서버 루트에서 실행 블록은 위의 정규식 위치 블록보다 우선합니다. 자세한 내용은 this document을 참조하십시오.

외부 URI 접두어는 /shop이지만 그대로 지정 문을 사용할 수 있도록 자동으로 /bcshop으로 다시 작성됩니다. alias 지시문이 있지만 issues with try_files이 있으며 PHP에서 사용하기가 까다 롭습니다.

+0

정말 고마워. '/ shop /'앱을 때리면'index.php' 파일을 다운로드하는 이유가 무엇입니까? –

+0

상점의 PHP 파일은 중첩 된'location ~ \ .php $'블록 (즉, ** 위치^~/상점 블록 안에있는 **)에 의해 처리됩니다. 이 블록은 첫 번째'location ~ \ .php $'블록과 사실상 동일해야 PHP 파일이 처리를 위해 FastCGI로 전달됩니다. –

+0

'try_files' 행을 제외하고는 동일합니다. 흠. –

0

@RichardSmith의 답을 바탕으로, 나는 (자신의 변형이 잘 작동하고 있습니다). 간단히 location ~ \.php$의 블록을 반복하기 때문에 내 머리를하고 있었다.

... 
... 
root /home/vagrant/sites/$cc/_www/; 
... 
... 
location/{ 
    set $actual_root /home/vagrant/sites/$cc/_www/php/; 
    set $fastcgi_index /index.php; 
    root $actual_root; 
    try_files $uri $uri/ $fastcgi_index?$query_string; 
} 

location /shop/ { 
    set $actual_root /home/vagrant/sites/$cc/_www/; 
    set $fastcgi_index /shop/index.php; 
    root $actual_root; 
    try_files $uri $uri/ $fastcgi_index?$query_string; 
} 

location ~ \.php$ { 
    root $actual_root; 
    fastcgi_index $fastcgi_index; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_param SCRIPT_FILENAME $actual_root/$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param APP_ENV dev; 
    fastcgi_param PLATFORM_ENVIRONMENT local; 
    fastcgi_read_timeout 300; 
    fastcgi_buffers 16 16k; 
    fastcgi_buffer_size 32k;  
} 

... 
...