95

I use SetEnv in Apache to set some variables in virtualhosts that I recover in PHP using $_SERVER[the_variable].

Now I am switching to Perl Catalyst and Nginx, but it seems that the "env" directive in Nginx is not the same. It does not work. How can it be accomplished?

Here is the background picture, just in case someone can suggest a better approach or my previous system does not work with Nginx.

  • I use the same app for many domains. All data comes from different databases with the same structure.
  • The database name is hardcoded to the virtual host, in that environmental variable.
  • As I know the database name, all the queries go to its appropriate database, from the very first query.
  • I can have multiple domains using the same database, just including the same variable into the directives.

4 Answers 4

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

but it's for PHP-CGI

4
  • 5
    Then he failed quite horribly, because this isn't how to define environment variables in Apache.
    – user1804599
    Commented Jan 21, 2016 at 8:53
  • ... but still very useful ;-) Commented Mar 11, 2016 at 21:30
  • 1
    and for empty values just put '' in the value part
    – Subin
    Commented Jun 13, 2017 at 16:00
  • this is usefull to perl implementation, accessing by $ENV{Environment_variable_name}. You can check this by print Dumper \%ENV
    – Znik
    Commented Feb 14, 2019 at 11:17
64

NGINX doesn't manage your backend processes like apache does, so it can't affect their environments. To set a new $_SERVER PHP variable from NGINX, you need to add a new fastcgi_param entry along with the rest of them. Wherever you're including fastcgi_params or fastcgi.conf.

3
  • 1
    Thank you, it does the trick. For people using Perl Catalyst, the required value is in $c->engine->env->{MY_CUSTOM_VARIABLE}, similar to $_SERVER in php. [link]search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
    – Nacho B
    Commented Nov 12, 2011 at 10:58
  • This is not truth for me... When I set the variable like this, I can retrieve the variable only through getenv method. The variable isn't added to the $_SERVER array. Commented Jun 8, 2017 at 9:46
  • @MIguelele , variable chain $c->engine->env->{SOME_ENV_VAR} is strictly the same as $ENV{SOME_ENV_VAR} that is distributed by fastcgi interface.
    – Znik
    Commented Feb 14, 2019 at 11:15
47

You should keep in mind, that nginx doesn't manage php processes like apache does. You should config either php-fpm, or php-cgi, relying what runs php on your server.

php-cgi

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

php-fpm

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

The fastcgi_pass socket location needs to come first, then each of the fastcgi_param parameters. You can also list variables in a file in the nginx config folder, then include that file. The include file commonly has the name fastcgi_params. Your environment parameters can be added easily to the php handling block:

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

The fastcgi_params file located in the same directory as nginx.conf often looks like this:

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;

Not the answer you're looking for? Browse other questions tagged or ask your own question.