Переменные nginx похожи на SetEnv в Apache?

82

Я использую SetEnv в Apache для установки некоторых переменных в виртуальных хостах, которые я восстанавливаю с помощью PHP $_SERVER[the_variable].

Сейчас я перехожу на Perl Catalyst и Nginx, но мне кажется, что директива env в Nginx отличается. Это не работает. Как этого добиться?

Вот фоновое изображение, на случай, если кто-то может предложить лучший подход или моя предыдущая система не работает с Nginx.

  • Я использую одно и то же приложение для многих доменов. Все данные поступают из разных баз данных с одинаковой структурой.
  • Имя базы данных жестко привязано к виртуальному хосту в этой переменной среды.
  • Поскольку я знаю имя базы данных, все запросы отправляются в соответствующую базу данных с самого первого запроса.
  • Я могу иметь несколько доменов, использующих одну и ту же базу данных, просто включая одну и ту же переменную в директивы.
Мигелеле
источник

Ответы:

57

NGINX не управляет вашими внутренними процессами, как apache, поэтому не может влиять на их среду. Чтобы установить новую $_SERVERпеременную PHP из NGINX, вам необходимо добавить новую fastcgi_paramзапись вместе с остальными. Куда бы вы ни включили fastcgi_paramsили fastcgi.conf.

колбиджек
источник
1
Спасибо, это помогает. Для людей, использующих Perl Catalyst, необходимое значение находится в $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, аналогично $ _SERVER в php. [ссылка] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
Мигелеле
Для меня это неправда ... Когда я устанавливаю переменную таким образом, я могу получить ее только с помощью метода getenv. Переменная не добавляется в массив $ _SERVER.
Пабло Эсекьель Леоне
@MIguelele, цепочка переменных $ c-> engine-> env -> {SOME_ENV_VAR} строго совпадает с $ ENV {SOME_ENV_VAR}, который распространяется через интерфейс fastcgi.
Znik
118
location / {
...
   fastcgi_param   APPLICATION_ENV  production;
   fastcgi_param   APPLICATION_CONFIG user;
...
}

но это для PHP-CGI

TREx
источник
22
Интересно, зачем комменты
Думаю, он просто хотел показать эквивалент apache в качестве комментария
lloiacono
5
Затем он потерпел ужасную неудачу, потому что это не способ определения переменных среды в Apache.
rightfold
... но все же очень полезно ;-)
Михал Галлович
1
и пустые значения просто положить «» в значении части
Шубин
41

Вы должны иметь в виду, что nginx не управляет процессами php, как apache. Вы должны настроить либо php-fpm, либо php-cgi, в зависимости от того, что запускает php на вашем сервере.

php-cgi

...
env[APP_ENV] = production
...

php-fpm

location / {
    ...
    fastcgi_param APP_ENV production; 
    ...
}
Олег
источник
11

Fastcgi_pass расположение сокета должен прийти первым, то каждый из fastcgi_param параметров. Вы также можете перечислить переменные в файле в папке конфигурации nginx, а затем включить этот файл. Включаемый файл обычно называется fastcgi_params . Параметры вашего окружения можно легко добавить в блок обработки php:

        location ~ \.php$ {
            fastcgi_pass     unix:/your_sock_location/nginxFastCGI.sock;
            fastcgi_param    SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param    APP_ENV production;
            include          fastcgi_params;
        }

В fastcgi_params файл , расположенный в том же каталоге, nginx.conf часто выглядит следующим образом :

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
i_a
источник