Nginx-Variablen ähnlich wie SetEnv in Apache?

82

Ich verwende SetEnv in Apache, um einige Variablen in virtuellen Hosts festzulegen, die ich in PHP mithilfe von wiederherstelle $_SERVER[the_variable].

Jetzt wechsle ich zu Perl Catalyst und Nginx, aber es scheint, dass die "env" -Richtlinie in Nginx nicht dieselbe ist. Es funktioniert nicht. Wie kann es erreicht werden?

Hier ist das Hintergrundbild, nur für den Fall, dass jemand einen besseren Ansatz vorschlagen kann oder mein vorheriges System mit Nginx nicht funktioniert.

  • Ich benutze die gleiche App für viele Domains. Alle Daten stammen aus verschiedenen Datenbanken mit derselben Struktur.
  • Der Datenbankname ist in dieser Umgebungsvariablen fest auf dem virtuellen Host codiert.
  • Da ich den Datenbanknamen kenne, werden alle Abfragen von der ersten Abfrage an in die entsprechende Datenbank verschoben.
  • Ich kann mehrere Domänen mit derselben Datenbank haben, wobei nur dieselbe Variable in die Anweisungen aufgenommen wird.
MIguelele
quelle

Antworten:

57

NGINX verwaltet Ihre Backend-Prozesse nicht wie Apache und kann daher keine Auswirkungen auf deren Umgebung haben. Um eine neue $_SERVERPHP-Variable in NGINX festzulegen, müssen Sie fastcgi_paramzusammen mit den anderen einen neuen Eintrag hinzufügen . Wo immer Sie einschließen fastcgi_paramsoder fastcgi.conf.

Kolbyjack
quelle
1
Danke, es macht den Trick. Für Benutzer von Perl Catalyst befindet sich der erforderliche Wert in $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, ähnlich wie $ _SERVER in PHP. [Link] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
MIguelele
Dies ist für mich nicht die Wahrheit ... Wenn ich die Variable so einstelle, kann ich sie nur über die Methode getenv abrufen. Die Variable wird dem Array $ _SERVER nicht hinzugefügt.
Pablo Ezequiel Leone
@MIguelele, variable Kette $ c-> engine-> env -> {SOME_ENV_VAR} entspricht genau $ ENV {SOME_ENV_VAR}, das von der fastcgi-Schnittstelle verteilt wird.
Znik
117
location / {
...
   fastcgi_param   APPLICATION_ENV  production;
   fastcgi_param   APPLICATION_CONFIG user;
...
}

aber es ist für PHP-CGI

T-Rex
quelle
22
Ich frage mich, was der Zweck der Kommentare auf der rechten Seite ist :-)
lks128
Ich denke, er wollte nur das Apache-Äquivalent als Kommentar zeigen
lloiacono
5
Dann ist er ziemlich schrecklich gescheitert, weil so Umgebungsvariablen in Apache nicht definiert werden können.
Rechtsfalte
... aber immer noch sehr nützlich ;-)
Michal Gallovic
1
und für leere Werte setzen Sie einfach '' in den
Werteteil
41

Sie sollten bedenken, dass nginx PHP-Prozesse nicht wie Apache verwaltet. Sie sollten entweder php-fpm oder php-cgi konfigurieren, abhängig davon, was PHP auf Ihrem Server ausführt.

php-cgi

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

PHP-Fpm

location / {
    ...
    fastcgi_param APP_ENV production; 
    ...
}
Oleg
quelle
11

Der Socket-Speicherort fastcgi_pass muss zuerst und dann jeder der Parameter fastcgi_param angegeben werden. Sie können auch Variablen in einer Datei im Ordner nginx config auflisten und diese Datei dann einschließen. Die Include-Datei hat üblicherweise den Namen fastcgi_params . Ihre Umgebungsparameter können einfach zum PHP-Handling-Block hinzugefügt werden:

        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;
        }

Die Datei fastcgi_params , die sich im selben Verzeichnis wie nginx.conf befindet, sieht häufig folgendermaßen aus:

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
quelle