Re: Re: Наследование fastcgi_param

Maxim Dounin mdounin at mdounin.ru
Thu Jul 9 13:28:00 UTC 2015


Hello!

On Thu, Jul 09, 2015 at 05:14:19PM +0500, Amanda Sproule wrote:

> >>Поведение nginx'а сейчас: послать на бекенд ровно то, что администратор
> написал в конфиге, и оно консистентно для всех соответствующих модулей
> (proxy, fastcgi, scgi, uwsgi). Менять это поведение не планируется.
> 
> послать на бекенд ровно то, что администратор написал в конфиге - так ведь
> не посылает, в начале топика я описал, что если в локейшене переопределён
> fastcgi_param SCRIPT_FILENAME /www/info.php; то только он и передаётся (и
> тут возник весь сыр бор с наследованием).

Вы путаете темы обсуждения: я отвечал Гене про дублирующиеся 
fastcgi-параметры с одинаковыми именами.  Вы же пытаетесь в 
очередной раз рассказать миру о том, что не понимаете, как 
работает наследование директив конфигурации в nginx'е.

Впрочем, ответ "ровно то, что администратор написал в конфиге" в 
данном случае также подходит.  В соответствующем location'е 
написан ровно один параметр, и именно он и посылается.

Именно так работает наследование для всех директив конфигурации: 
если на текущем уровне соответствующая директива не встречается, 
то используется значение с предыдущего уровня.  Если встречается - 
то используется то, что написано на текущем уровне.  Это относится 
как к директивам, которые могут существовать только в единственном 
экземпляре (e.g., root), так и к директивам, которые можно 
указывать несколько раз (e.g., fastcgi_param, proxy_set_header, 
access_log).

> Экспериментальным путём подобрал минимальное количество параметров
> 
> location /info {
>     fastcgi_param  REQUEST_METHOD     $request_method;
>     fastcgi_param SCRIPT_FILENAME /www/info.php;
>     fastcgi_pass 127.0.0.1:9000;
> }
> 
> и phpinfo() ровно эти параметры и показал, никаких других не было.

Специально для того, чтобы SCRIPT_FILENAME можно было задавать 
руками отдельно от других параметров - в дистрибутиве лежит файл 
fastcgi_params, содержащий все параметры кроме SCRIPT_FILENAME.  
Соответсвенно, если вам надо указать явно SCRIPT_FILENAME, то 
правильно делать так:

    location = /info {
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME /path/to/info.php;
         fastcgi_pass 127.0.0.1:9000;
    }

Если же путь к файлу стандартный, то можно использовать 
fastcgi.conf, где SCRIPT_FILENAME уже задан в виде 
$document_root$fastcgi_script_name, и соответственно писать как-то 
так:

    include fastcgi.conf;
    root /path/to;

    location = /info.php {
        fastcgi_pass 127.0.0.1:9000;
    }

Note: в этом случае в конкретном location'е можно вообще ничего 
кроме fastcgi_pass не писать, а задать всё на более ранних 
уровнях.
        
-- 
Maxim Dounin
http://nginx.org/



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