Змінні 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
MIguelele

Це не правда для мене ... Коли я встановлюю змінну таким чином, я можу отримати змінну лише за допомогою методу 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


22
Цікаво, яка мета коментарів праворуч :-)
lks128

Думаю, він просто хотів показати еквівалент apache як коментар
lloiacono

5
Тоді він зазнав невдалого жаху, бо це не те, як визначати змінні середовища в Apache.
праворуч

... але все одно дуже корисний ;-)
Міхал Галлович,

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.