nginx가 제공하는 정적 파일 내에서 nginx 환경 변수를 사용할 수 있습니까?


10

nginx 설정에서 환경 변수를 사용하고 nginx가 정적 파일 (html, js, css-예를 들어 AngularJs 앱) 만 제공하도록 구성된 경우 nginx가 제공하는 JS 파일 내에서 환경 변수를 사용할 수있는 방법이 있습니까 ? 또는 io.js, php 등의 비 정적 서버를 실행하기위한 유일한 방법입니다.


그러나 nginx의 구성에서 기본적으로 환경 변수를 사용할 수 없습니다.

나는 환경에 대해 말할 때이에 바르의 nginx 설정 I 평균이 게시물에 같이 : 어떻게 Nginx.conf에서 환경 변수를 사용할 수 있습니다 그들이 사용하는 경우 env APP_WEB_1_PORT_5000_TCP_ADDR;$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};


사용 사례를 정확하게 설명

내 구체적인 사용 사례는 도커 컨테이너에 nginx 기반 AngularJS 앱이 있다는 것입니다. 이 응용 프로그램은 다른 시스템에서 실행되는 API를 모두 사용하는 "단일 페이지 응용 프로그램"입니다. 현재 앱에 Google-Analtyics 코드와 같은 구성이 다르기 때문에 프로덕션과 스테이징 사이에 다른 도커 컨테이너를 실행합니다. 이 환경 특정 데이터는 config.js파일에 보관되며 값은 현재 하드 코딩 master되어 있으며 git 의 분기 값 하나 와 staging분기의 값이 다릅니다 . 생산 및 준비에 동일한 컨테이너를 사용할 수 있도록 디자인을 변경하고 싶습니다 . 나는 그것을 (실행 컨테이너로 ENV의 VAR를 전달하려는 docker run -e GACODE=UA-12345-6 ...)와를 통해 ENV var에를 (사용의 nginx가 env GACODE;$ENV{"GACODE"}너무config.js파일은 하드 코딩하지 않고 전달 된 GoogleAnaltyics 코드를 사용할 수 있습니다). 이것이 가능한지 아닌지 모르겠습니다 (따라서 질문;)). nginx 만 사용하면 컨테이너가 단일 프로세스가되지만 io.js를 사용해야하는 경우 여러 개의 연결된 컨테이너가 필요하며 더 많은 움직이는 부분이 더 복잡합니다).


뭐 ?! 잘못된 측면에서보고있는 것처럼 보이기 때문에 유스 케이스를 정확하게 설명하십시오. 그러나 nginx의 구성에서 기본적으로 환경 변수를 사용할 수 없습니다.
Xavier Lucas

감사합니다 @XavierLucas-자세한 설명을 위해 질문을 업데이트했습니다.
Tom

답변:


4

sub_filter

간단한 문자열 바꾸기를 원하면 sub_filter 를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

server {
    sub_filter "REPLACE_THIS" "with this";
    sub_filter_once off; # Don't stop at the first match, replace all of them
    sub_filter_types "text/javascript" "application/json"; # Apply to these mime types in addition to text/html 

    # Everything else
}

그러나 nginx config 에서 환경 변수를 읽을 수는 없습니다. 물론 유효한 구성 파일을 생성하고 nginx를 다시로드하기 위해 nginx 구성 파일을 작성 / 필요한 방식으로 스크립트를 작성할 수 있습니다.


4

sub_filter 및 nginx 환경 변수 를 사용하여 실험 했지만 불가능하다는 결론을 내 렸습니다 .

예를 들어, 이것은 내 실험과 nginx로 전달 된 ENV 사용 이 블록 내에서 작동 하지 않는 것을 보여줍니다 server.

env TOMTEST1; # OK - makes $ENV{"TOMTEST1"} available but NOT in server block.

http {

    server {

        # set $TOMTEST1 $ENV{"TOMTEST1"};    # KO - DOES NOT WORK - NGINX WONT START
        set $TOMTEST2   'tomtest2 Var';      # OK - THIS DOES WORK OK

        sub_filter 'TOM_TEST2' $TOMTEST2;       # OK - but not useful to me.
        sub_filter 'TOM_TEST3' 'tomtest3 Var';  # OK - but not useful to me.
        sub_filter_once off;                    # Don't stop at the first match, replace all of them
        sub_filter_types "text/javascript" "application/json"; # Apply to these mime types in addition to text/html

        # Serve static files
        location / {
           try_files $uri /index.html =404;
        }
        ...

내가 제공하는 정적 config.json 파일에는 다음과 같은 다양한 테스트 문자열이 있습니다.

{
    "environment": "local",
    "test1": "$ENV{"TOMTEST1"}",
    "test3": "TOM_TEST2",
    "test4": "TOM_TEST3",
}

@ AD7six가 언급했듯이, 진행 방법은 nginx가 자리 표시 자에서 유효한 구성 파일을 생성하기 전에 실행되는 스크립트를 갖는 것입니다. 그러나 이것은 nginx가 시작되기 전에 스크립트가 실행될 경우 질문을 제기 config.json합니다. 파일 의 내용을 해당 스크립트에 설정하고 전혀 신경 쓰지 않을 수도 sub_filter있습니다.


2
하나의 정적 파일 인 경우-nginx 구성을 통해 파일을하지 않는 것이 합리적입니다. 유스 케이스가 그보다 약간 더 넓다고 가정합니다. 정보 / 대비 sub_filter "example.com" "example.dev";를 위해 프로덕션 환경에 대한 모든 참조를 로컬 환경으로 대체하기 위해 dev 설정에서 사용 합니다. 이러한 참조는 타사 API 응답 / 응용 프로그램 코드 / JS / db 덤프 등에서 비롯 되었기 때문입니다. -즉 nginx의 경우 모든 html / js / json 응답의 어느 곳에 나있을 수 있습니다. +1
AD7six

3

OP와 동일한 문제를 해결하려고 노력 했으며이 게시물이 Google 검색에 나타 났으므로 잠재적 인 솔루션을 추가 할 것이라고 생각했습니다.

이 게시물은 nginx 설정 내에서 환경 변수를 노출하는 방법을 간략하게 설명합니다 : https://blog.doismellburning.co.uk/environment-variables-in-nginx-config/

파일 시스템에 파일이 없어도 컨텐츠를 반환 할 수 있습니다. 파일을 제공하지 않고 Nginx 설정에서 200으로 응답

이 두 가지를 종합하면 다음과 같은 결과를 얻게됩니다.

env MY_ENV_VAR;

# Snip

http {
    # Snip

    server {
        # Snip

        location ~ ^/config.js$ {
            add_header Content-Type text/javascript;
            set_by_lua $env_var 'return os.getenv("MY_ENV_VAR")';
            return 200 'const MY_ENV_VAR = \'$env_var\'';
        }
    }
}

이것은 테스트 환경에서 나를 위해 일했습니다. 약간 성가시다 (필요한 변수가 포함 된 Docker 실행시 파일을 자동 생성하는 것보다 낫지 않다).

희망이 도움이됩니다.

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