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