Re: fastcgi и несколько document root

Maxim Dounin mdounin на mdounin.ru
Чт Июн 9 11:02:47 UTC 2016


Hello!

On Thu, Jun 09, 2016 at 01:40:28PM +0300, Alex Domoradov wrote:

> Привет всем,
> 
> столкнулся с казалось бы тривиальной задачей, для одного location надо
> задать root отличный от того, что задан на уровне server
> 
> server {
> 
>    root /vhosts/example.com/public_html/web/;
> 
>    location ~/api/.*\.php {
>       root /vhosts/dev-designer/public_html/api;
>       add_header X-DEBUG "LOC-API-PHP" always;
>       error_page 406 = @fastcgi;
>       return 406;
>    }
> 
>    location ~/api/ {
>       add_header X-DEBUG "API" always;
>       root /vhosts/example.com/public_html/api;
>    }
> 
>    location ~ \.php$ {
>       error_page 406 = @fastcgi;
>       return 406;
>    }
> 
>    location @fastcgi {
>       add_header X-DEBUG "FAST-CGI" always;
> 
>       fastcgi_pass unix:/run/php/php5.6-fpm.sock;
>       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
>       ...
>    }
> }
> 
> но в таком случае, запрос попадает в @fastcgi, но при этом root у него
> остается дефолтный. При этом если я коментирую *error_page/return* в
> *~/api/.*\.php*, то я вижу что запрос попадает в этот location и root у
> него меняется, но почему то с учетом return root остается с уровня server

Потому что то, какая конфигурация была задана в location'е, в 
котором запрос обрабатывался ранее, не влияет на то, как он будет 
обрабатываться после перенаправления в другой location.

Конфигурация для обработки запроса задаётся полностью в конкретном 
location'е.  Наследование конфигурации - только на этапе её 
парсинга с предыдущих уровней, не более того.

> Гугл предлагает такой вариант
> 
> http://serverfault.com/questions/317641/nginx-multiple-document-roots-with-fastcgi
> 
> хотелось бы узнать, это единственно верный способ решения данной задачи
> (использование вложенных локейшенов)?

Нет, не единственный.  В вашем случае проще всего будет завести 
ещё один именованный location для обработки fastcgi, в котором и 
указать нужный root:

    location ~/api/.*\.php {
       root /vhosts/dev-designer/public_html/api;
       add_header X-DEBUG "LOC-API-PHP" always;
       error_page 406 = @fastcgi_api;
       return 406;
    }

    location @fastcgi_api {
       root /vhosts/dev-designer/public_html/api;
       fastcgi_pass ...
       ...
    }
 
-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru