Variables de Nginx similares a SetEnv en Apache?

82

Utilizo SetEnv en Apache para establecer algunas variables en los hosts virtuales que recupero en PHP usando $_SERVER[the_variable].

Ahora estoy cambiando a Perl Catalyst y Nginx, pero parece que la directiva "env" en Nginx no es la misma. No funciona. ¿Cómo se puede lograr?

Aquí está la imagen de fondo, en caso de que alguien pueda sugerir un enfoque mejor o mi sistema anterior no funcione con Nginx.

  • Utilizo la misma aplicación para muchos dominios. Todos los datos provienen de diferentes bases de datos con la misma estructura.
  • El nombre de la base de datos está codificado en el host virtual, en esa variable de entorno.
  • Como conozco el nombre de la base de datos, todas las consultas van a la base de datos correspondiente, desde la primera consulta.
  • Puedo tener varios dominios usando la misma base de datos, simplemente incluyendo la misma variable en las directivas.
MIguelele
fuente

Respuestas:

57

NGINX no administra sus procesos de backend como lo hace apache, por lo que no puede afectar sus entornos. Para establecer una nueva $_SERVERvariable PHP desde NGINX, debe agregar una nueva fastcgi_paramentrada junto con el resto de ellas. Donde sea que estés incluido fastcgi_paramso fastcgi.conf.

Kolbyjack
fuente
1
Gracias, funciona. Para las personas que usan Perl Catalyst, el valor requerido está en $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, similar a $ _SERVER en php. [enlace] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
MIguelele
Esto no es verdad para mí ... Cuando configuro la variable de esta manera, puedo recuperar la variable solo a través del método getenv. La variable no se agrega a la matriz $ _SERVER.
Pablo Ezequiel Leone
@MIguelele, cadena de variables $ c-> engine-> env -> {SOME_ENV_VAR} es estrictamente lo mismo que $ ENV {SOME_ENV_VAR} que se distribuye por la interfaz fastcgi.
Znik
118
location / {
...
   fastcgi_param   APPLICATION_ENV  production;
   fastcgi_param   APPLICATION_CONFIG user;
...
}

pero es para PHP-CGI

Tirano saurio Rex
fuente
22
Me pregunto cuál es el propósito de los comentarios de la derecha :-)
lks128
Supongo que solo quería mostrar el equivalente de apache como comentario
lloiacono
5
Luego falló bastante, porque no es así como definir las variables de entorno en Apache.
derecha
... pero sigue siendo muy útil ;-)
Michal Gallovic
1
y para valores vacíos simplemente ponga '' en la parte de valor
Subin
41

Debe tener en cuenta que nginx no administra los procesos php como lo hace apache. Debe configurar php-fpm o php-cgi, confiando en lo que ejecuta php en su servidor.

php-cgi

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

php-fpm

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

La ubicación del socket fastcgi_pass debe aparecer primero, luego cada uno de los parámetros fastcgi_param . También puede enumerar las variables en un archivo en la carpeta de configuración nginx, luego incluir ese archivo. El archivo de inclusión comúnmente tiene el nombre fastcgi_params . Los parámetros de su entorno se pueden agregar fácilmente al bloque de manejo de 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;
        }

El archivo fastcgi_params ubicado en el mismo directorio que nginx.conf a menudo se ve así:

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
fuente