【问题标题】:Nginx variables similar to SetEnv in Apache?Nginx 变量类似于 Apache 中的 SetEnv?
【发布时间】:2011-11-11 19:27:46
【问题描述】:

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

现在我正在切换到 Perl Catalyst 和 Nginx,但似乎 Nginx 中的“env”指令不一样。这是行不通的。如何实现?

这是背景图片,以防有人可以提出更好的方法,或者我以前的系统不适用于 Nginx。

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

【问题讨论】:

    标签: nginx


    【解决方案1】:
    location / {
    ...
       fastcgi_param   APPLICATION_ENV  production;
       fastcgi_param   APPLICATION_CONFIG user;
    ...
    }
    

    但它适用于 PHP-CGI

    【讨论】:

    • 我想知道右边的 cmets 的目的是什么 :-)
    • 我猜他只是想将 apache 等价物显示为评论
    • 然后他失败得很惨,因为这不是在Apache中定义环境变量的方式。
    • ...但仍然非常有用 ;-)
    • 对于空值,只需将 '' 放在值部分
    【解决方案2】:

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

    【讨论】:

    • 谢谢,它成功了。对于使用 Perl Catalyst 的人,所需的值在 $c->engine->env->{MY_CUSTOM_VARIABLE} 中,类似于 php 中的 $_SERVER。 [链接]search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
    • 这对我来说不是事实......当我这样设置变量时,我只能通过 getenv 方法检索变量。该变量未添加到 $_SERVER 数组中。
    • @MIguelele , 变量链 $c->engine->env->{SOME_ENV_VAR} 与 fastcgi 接口分发的 $ENV{SOME_ENV_VAR} 完全相同。
    【解决方案3】:

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

    php-cgi

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

    php-fpm

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

    【讨论】:

      【解决方案4】:

      fastcgi_pass 套接字位置需要先出现,然后是每个 fastcgi_param 参数。您还可以在 nginx 配置文件夹的文件中列出变量,然后包含该文件。包含文件的名称通常为 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2013-11-26
        • 2016-09-19
        • 1970-01-01
        • 2012-07-22
        • 2015-01-14
        相关资源
        最近更新 更多