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

57

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

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

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

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

4 ответа

42
Лучший ответ

NGINX не управляет вашими backend-процессами, такими как apache, поэтому он не может повлиять на их среду. Чтобы установить новую переменную PHP $_SERVER из 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
  • 0
    Это не правда для меня ... Когда я устанавливаю переменную таким образом, я могу получить переменную только с помощью метода getenv. Переменная не добавляется в массив $ _SERVER.
Показать ещё 1 комментарий
84
location / {
...
   fastcgi_param   APPLICATION_ENV  production; #APPLICATION_ENV = production
   fastcgi_param   APPLICATION_CONFIG user; #APPLICATION_CONFIG = user
...
}

но это для PHP-CGI

  • 22
    Мне интересно, какова цель комментариев справа :-)
  • 0
    Я думаю, что он просто хотел показать эквивалент Apache в качестве комментария
Показать ещё 4 комментария
29

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

PHP-CGI

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

PHP-FPM

location / {
    ...
    fastcgi_param APP_ENV production; 
    ...
}
4

Сначала необходимо найти расположение сокета fastcgi_pass, затем каждый из параметров fastcgi_param. Вы также можете перечислить переменные в файле в папке конфигурации nginx, а затем включить этот файл. Файл include обычно имеет имя 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню