2011-11-11 17 views
63

Uso SetEnv en Apache para establecer algunas variables en hosts virtuales que recupero en PHP usando $_SERVER[the_variable].¿Variables de Nginx similares a SetEnv en Apache?

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 mejor enfoque o mi sistema anterior no funciona con Nginx.

  • Uso 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 sé el nombre de la base de datos, todas las consultas van a su base de datos adecuada, desde la primera consulta.
  • Puedo tener varios dominios usando la misma base de datos, solo incluyendo la misma variable en las directivas.

Respuesta

46

NGINX no gestiona los procesos de back-end como lo hace apache, por lo que no puede afectar a sus entornos. Para establecer una nueva variable PHP $_SERVER de NGINX, debe agregar una nueva entrada fastcgi_param junto con el resto de ellas. Donde sea que esté incluyendo fastcgi_params o fastcgi.conf.

+0

Gracias, lo hace el truco. Para las personas que usan Perl Catalyst, el valor requerido es $ c-> engine-> env -> {MY_CUSTOM_VARIABLE}, similar a $ _SERVER en php. [link] http://search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm – MIguelele

+0

Esto no es verdad para mí ... Cuando configuro la variable de esta manera, solo puedo recuperar la variable a través del método getenv. La variable no se agrega a la matriz $ _SERVER. –

88
location/{ 
... 
    fastcgi_param APPLICATION_ENV production; 
    fastcgi_param APPLICATION_CONFIG user; 
... 
} 

pero es para PHP-CGI

+21

Me pregunto cuál es el propósito de los comentarios a la derecha :-) – Andrew

+0

Supongo que solo quería mostrar el equivalente apache como un comentario – lloiacono

+5

Luego falló bastante horriblemente, porque así no es cómo definir las variables de entorno en Apache . – rightfold

32

Usted debe tener en cuenta, que nginx no gestiona los procesos PHP como Apache hace. Debe configurar php-fpm, o php-cgi, dependiendo de qué ejecuta php en su servidor.

php-cgi

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

php-FPM

location/{ 
    ... 
    fastcgi_param APP_ENV production; 
    ... 
} 
5

La ubicación del zócalo fastcgi_pass tiene que venir primero, a continuación, cada uno de los parámetrosfastcgi_param. También puede listar variables en un archivo en la carpeta nginx config, luego incluir ese archivo. El archivo de inclusión comúnmente tiene el nombre fastcgi_params. Sus parámetros del entorno pueden ser fácilmente añadidos 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; 
     } 

Los fastcgi_params archivo que se encuentra en el mismo directorio que nginx.conf menudo se parece a esto:

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; 
Cuestiones relacionadas