Nginx变量类似于Apache中的SetEnv?


82

我在Apache中使用SetEnv在虚拟主机中设置一些变量,这些变量在PHP中使用进行恢复$_SERVER[the_variable]

现在,我切换到Perl Catalyst和Nginx,但是Nginx中的“ env”指令似乎并不相同。这没用。如何实现?

这是背景图片,以防万一有人可以提出更好的方法,或者我以前的系统无法在Nginx上使用。

  • 我在多个域中使用相同的应用程序。所有数据都来自具有相同结构的不同数据库。
  • 数据库名称在该环境变量中被硬编码到虚拟主机。
  • 据我所知,数据库的名称,所有查询都从第一个查询转到其相应的数据库。
  • 我可以有多个使用同一数据库的域,只是将相同的变量包含在指令中。

Answers:


57

NGINX不会像apache那样管理您的后端进程,因此不会影响他们的环境。要从$_SERVERNGINX设置新的PHP变量,您需要fastcgi_param与其他变量一起添加一个新条目。无论您在哪里包括fastcgi_paramsfastcgi.conf


1
谢谢,它能解决问题。对于使用Perl Catalyst的用户,所需的值在$ c-> engine-> env-> {MY_CUSTOM_VARIABLE}中,类似于php中的$ _SERVER。[link] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
MIguelele,2011年

这对我来说不是事实……当我像这样设置变量时,只能通过getenv方法检索变量。该变量不会添加到$ _SERVER数组中。
Pablo Ezequiel Leone

@MIguelele,可变链$ c-> engine-> env-> {SOME_ENV_VAR}与由fastcgi接口分发的$ ENV {SOME_ENV_VAR}严格相同。
Znik

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

但这是针对PHP-CGI的


22
我想知道右边评论的目的是什么:-)
lks128

我想他只是想在评论中显示与Apache相当的东西
lloiacono

5
然后他非常失败,因为这不是在Apache中定义环境变量的方法。
2016年

...但仍然非常有用;-)
Michal Gallovic

1
对于空值,只需在值部分中输入“”
-Subin

41

您应该记住,nginx不像apache那样管理php进程。您应该配置php-fpm或php-cgi,具体取决于服务器上运行php的内容。

PHP的CGI

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

php-fpm

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

11

fastcgi_pass插槽的位置需要是第一位的,然后每个的fastcgi_param参数。您还可以在nginx config文件夹中的文件中列出变量,然后包括该文件。包含文件通常具有名称fastcgi_params。您的环境参数可以轻松添加到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;
        }

与nginx.conf位于同一目录中的fastcgi_params文件通常如下所示:

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.