Zmienne Nginx podobne do SetEnv w Apache?

82

Używam SetEnv w Apache, aby ustawić niektóre zmienne w virtualhostach, które odzyskuję w PHP za pomocą $_SERVER[the_variable].

Teraz przechodzę na Perl Catalyst i Nginx, ale wygląda na to, że dyrektywa „env” w Nginx nie jest taka sama. To nie działa. Jak to osiągnąć?

Oto zdjęcie w tle, na wypadek, gdyby ktoś zaproponował lepsze podejście lub mój poprzedni system nie działa z Nginx.

  • Używam tej samej aplikacji dla wielu domen. Wszystkie dane pochodzą z różnych baz danych o tej samej strukturze.
  • Nazwa bazy danych jest zakodowana na stałe w wirtualnym hoście w tej zmiennej środowiskowej.
  • Ponieważ znam nazwę bazy danych, wszystkie zapytania od pierwszego zapytania trafiają do odpowiedniej bazy danych.
  • Mogę mieć wiele domen korzystających z tej samej bazy danych, po prostu włączając tę ​​samą zmienną do dyrektyw.
MIguelele
źródło

Odpowiedzi:

57

NGINX nie zarządza procesami zaplecza, tak jak robi to Apache, więc nie może wpływać na ich środowiska. Aby ustawić nową $_SERVERzmienną PHP z NGINX, musisz dodać nowy fastcgi_paramwpis wraz z resztą. Gdziekolwiek włączasz fastcgi_paramslub fastcgi.conf.

kolbyjack
źródło
1
Dziękuję, to załatwia sprawę. Dla osób używających Perl Catalyst wymagana wartość to $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, podobnie jak $ _SERVER w php. [link] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
MIguelele
To nie jest dla mnie prawda ... Kiedy ustawiam zmienną w ten sposób, mogę ją pobrać tylko metodą getenv. Zmienna nie jest dodawana do tablicy $ _SERVER.
Pablo Ezequiel Leone
@MIguelele, łańcuch zmiennych $ c-> engine-> env -> {SOME_ENV_VAR} to dokładnie to samo, co $ ENV {SOME_ENV_VAR}, które jest dystrybuowane przez interfejs fastcgi.
Znik
118
location / {
...
   fastcgi_param   APPLICATION_ENV  production;
   fastcgi_param   APPLICATION_CONFIG user;
...
}

ale to jest dla PHP-CGI

TREx
źródło
22
Zastanawiam się jaki jest cel komentarzy po prawej stronie :-)
lks128
Myślę, że po prostu chciał pokazać odpowiednik Apache jako komentarz
lloiacono
5
Potem zawiódł dość okropnie, ponieważ nie jest to sposób definiowania zmiennych środowiskowych w Apache.
prawostronny
... ale nadal bardzo przydatne ;-)
Michal Gallovic
1
a dla pustych wartości po prostu wstaw „” w części dotyczącej wartości
Subin
41

Należy pamiętać, że nginx nie zarządza procesami php, tak jak robi to Apache. Powinieneś skonfigurować php-fpm lub php-cgi, opierając się na tym, co uruchamia php na twoim serwerze.

php-cgi

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

php-fpm

location / {
    ...
    fastcgi_param APP_ENV production; 
    ...
}
Oleg
źródło
11

Fastcgi_pass lokalizacja gniazdo musi przyjść, potem każdy z fastcgi_param parametrów. Możesz także wyświetlić listę zmiennych w pliku w folderze konfiguracyjnym nginx, a następnie dołączyć ten plik. Plik dołączany zwykle ma nazwę fastcgi_params . Parametry twojego środowiska można łatwo dodać do bloku obsługi 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;
        }

Plik fastcgi_params znajdujący się w tym samym katalogu co nginx.conf często wygląda następująco:

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
źródło