web-dev-qa-db-fra.com

Des variables Nginx similaires à SetEnv dans Apache?

J'utilise SetEnv dans Apache pour définir certaines variables dans les hôtes virtuels que je récupère dans PHP en utilisant $_SERVER[the_variable].

Je passe maintenant à Perl Catalyst et à Nginx, mais il semble que la directive "env" de Nginx ne soit pas la même. Ça ne marche pas. Comment cela peut-il être accompli?

Voici l'image de fond, juste au cas où quelqu'un pourrait suggérer une meilleure approche ou si mon système précédent ne fonctionnait pas avec Nginx.

  • J'utilise la même application pour plusieurs domaines. Toutes les données proviennent de différentes bases de données ayant la même structure.
  • Le nom de la base de données est codé en dur sur l'hôte virtuel, dans cette variable d'environnement.
  • Comme je connais le nom de la base de données, toutes les requêtes vont à la base de données appropriée, à partir de la toute première requête.
  • Je peux avoir plusieurs domaines utilisant la même base de données, en incluant simplement la même variable dans les directives.
76
MIguelele

NGINX ne gère pas vos processus backend comme Apache, il ne peut donc pas affecter leurs environnements. Pour définir un nouveau $_SERVER PHP variable de NGINX, vous devez ajouter un nouveau fastcgi_param entrée avec le reste d'entre eux. Partout où vous incluez fastcgi_params ou fastcgi.conf.

54
kolbyjack
location / {
...
   fastcgi_param   APPLICATION_ENV  production;
   fastcgi_param   APPLICATION_CONFIG user;
...
}

mais c'est pour PHP-CGI

104
TREx

N'oubliez pas que nginx ne gère pas les processus php comme le fait Apache. Vous devriez configurer soit php-fpm, soit php-cgi, en fonction de ce qui fonctionne php sur votre serveur.

php-cgi

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

php-fpm

location / {
    ...
    fastcgi_param APP_ENV production; 
    ...
}
40
Oleg

L'emplacement de la prise fastcgi_pass doit être défini en premier, suivi de chacun des paramètres fastcgi_param. Vous pouvez également répertorier les variables dans un fichier du dossier nginx config, puis inclure ce fichier. Le fichier include porte généralement le nom fastcgi_params. Les paramètres de votre environnement peuvent être facilement ajoutés au bloc de gestion 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;
        }

Le fichier fastcgi_params situé dans le même répertoire que nginx.conf se présente souvent ainsi:

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;
9
i_a