Apache의 SetEnv와 유사한 Nginx 변수?


82

Apache에서 SetEnv를 사용하여 .NET을 사용하여 PHP에서 복구하는 가상 호스트의 일부 변수를 설정 $_SERVER[the_variable]합니다.

이제 Perl Catalyst와 Nginx로 전환하고 있지만 Nginx의 "env"지시문이 동일하지 않은 것 같습니다. 작동하지 않습니다. 어떻게 이룰 수 있습니까?

누군가가 더 나은 접근 방식을 제안 할 수 있거나 이전 시스템이 Nginx에서 작동하지 않는 경우를 대비하여 배경 그림은 다음과 같습니다.

  • 여러 도메인에 동일한 앱을 사용합니다. 모든 데이터는 동일한 구조의 다른 데이터베이스에서 가져옵니다.
  • 데이터베이스 이름은 해당 환경 변수에서 가상 호스트에 하드 코딩됩니다.
  • 데이터베이스 이름을 알기 때문에 모든 쿼리는 첫 번째 쿼리부터 적절한 데이터베이스로 이동합니다.
  • 동일한 변수를 지시문에 포함하여 동일한 데이터베이스를 사용하여 여러 도메인을 가질 수 있습니다.

답변:


57

NGINX는 아파치처럼 백엔드 프로세스를 관리하지 않으므로 환경에 영향을 미칠 수 없습니다. $_SERVERNGINX에서 새 PHP 변수 를 설정하려면 fastcgi_param나머지 항목과 함께 새 항목 을 추가해야 합니다. 어디든지 당신은 포함하고 fastcgi_paramsfastcgi.conf.


1
감사합니다. 트릭입니다. Perl Catalyst를 사용하는 사람들의 경우 필요한 값은 $ c-> engine-> env-> {MY_CUSTOM_VARIABLE}에 있으며 php의 $ _SERVER와 유사합니다. [링크] search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/Engine.pm
MIguelele 2011

이것은 사실이 아닙니다 ... 이렇게 변수를 설정하면 getenv 메소드를 통해서만 변수를 검색 할 수 있습니다. 변수는 $ _SERVER 배열에 추가되지 않습니다.
파블로 에세 키엘 리온

@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

나는 그가 단지 주석으로 아파치와 동등한 보여주고 싶었 추측
lloiacono

5
그런 다음 그는 Apache에서 환경 변수를 정의하는 방법이 아니기 때문에 매우 끔찍하게 실패했습니다.
rightfold

...하지만 여전히 아주 유용 ;-)
마이클 Gallovic

1
비어있는 값의 경우 값 부분에 ''를 입력합니다.
Subin

41

nginx는 아파치처럼 PHP 프로세스를 관리하지 않는다는 것을 명심해야합니다. 서버에서 php를 실행하는 것에 의존하여 php-fpm 또는 php-cgi를 구성해야합니다.

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

fastcgi_params는 nginx.conf은 종종 다음과 같습니다과 같은 디렉토리에있는 파일 :

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.