Posso usare le variabili di ambiente nginx all'interno di file statici serviti da nginx?


10

Se uso una variabile d'ambiente nella configurazione di nginx e nginx è configurato per servire solo file statici (html, js, css - ad esempio un'app AngularJs), c'è un modo in cui posso usare la variabile d'ambiente all'interno di un file JS che serve a nginx ? Oppure è l'unico modo per farlo per eseguire un server non statico, ad esempio io.js, php, ecc.


Tra l'altro non è possibile utilizzare le variabili di ambiente in modo nativo nella configurazione di nginx.

Quando parlo di variabili d'ambiente nella configurazione di nginx intendo come in questo post: Come posso usare le variabili d'ambiente in Nginx.conf dove usano env APP_WEB_1_PORT_5000_TCP_ADDR;e$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};


Spiega esattamente il tuo caso d'uso

Il mio caso d'uso specifico è che ho un'app AngularJS basata su nginx in un contenitore docker. L'app è una "Applicazione a pagina singola" che utilizza un'API in esecuzione su un altro sistema. Attualmente eseguo un container docker diverso tra produzione e gestione temporanea perché l'app ha una configurazione diversa, ad esempio il codice Google-Analtyics. Questi dati specifici dell'ambiente vengono conservati in un config.jsfile e i valori sono attualmente codificati, un valore per il masterramo in git e un valore diverso per il stagingramo. Voglio cambiare il design in modo da poter utilizzare lo stesso contenitore sia per la produzione che per la messa in scena. Voglio passare un var ENV nel contenitore quando lo eseguo ( docker run -e GACODE=UA-12345-6 ...) e faccio in modo che nginx usi il var ENV (tramite env GACODE;e $ENV{"GACODE"}quindi ilconfig.jsfile può utilizzare i codici GoogleAnaltyics che vengono passati, piuttosto che codificarli). Non so se sia possibile o meno (da qui la domanda;)). L'uso di solo nginx rende il mio contenitore un processo singolo, mentre se devo usare io.js avrò bisogno di più contenitori collegati e più parti mobili saranno più complesse).


Che cosa ?! Spiega esattamente il tuo caso d'uso poiché sembra che tu lo stia guardando dalla parte sbagliata. Tuttavia, non è possibile utilizzare le variabili di ambiente in modo nativo nella configurazione di nginx.
Xavier Lucas,

Grazie @XavierLucas - Ho aggiornato la domanda per cercare di spiegare di più.
Tom

Risposte:


4

sub_filter

Se si desidera una semplice sostituzione della stringa, è possibile utilizzare sub_filter . Per esempio:

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
}

Tuttavia , non è possibile leggere una variabile di ambiente in nginx config - puoi ovviamente scrivere script che scrivono il file di configurazione nginx in qualsiasi modo tu abbia bisogno / desideri produrre un file di configurazione valido e quindi ricaricare nginx.


4

Ho sperimentato l'utilizzo delle variabili di ambiente sub_filter e nginx ma ho concluso che non è possibile .

Ad esempio, questo mostra i miei esperimenti e mostra che usare ENV passati a nginx non funziona in un serverblocco:

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

dove il file statico config.json che sto servendo ha varie stringhe di test come il seguente:

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

Come menzionato da @ AD7six, il modo di procedere è avere uno script che viene eseguito prima che nginx inizi a produrre un file di configurazione valido dai segnaposto. Ma questo fa sorgere la domanda: se uno script verrà eseguito prima dell'inizio di nginx, potrei anche impostare il contenuto del mio config.jsonfile in quello script e non preoccuparmene sub_filteraffatto.


2
Se è per un file statico - ha sicuramente senso non farlo tramite la configurazione di nginx, ho pensato che il tuo caso d'uso fosse un po 'più ampio di quello. Per informazioni / contrasto che utilizzo sub_filter "example.com" "example.dev";in un'impostazione di sviluppo per sostituire qualsiasi riferimento al dominio di produzione nell'ambiente locale perché tali riferimenti provengono da risposte API di terze parti / codice app / js / db dump / ecc. - vale a dire per nginx potrebbe essere ovunque in qualsiasi risposta html / js / json. +1
AD7,

3

Ho cercato di risolvere lo stesso problema del PO e questo post è apparso nella ricerca di Google, quindi ho pensato di aggiungere una potenziale soluzione.

Questo post illustra come è possibile esporre una variabile d'ambiente all'interno della configurazione di nginx: https://blog.doismellburning.co.uk/environment-variables-in-nginx-config/

E puoi restituire il contenuto senza avere un file nel file system: Rispondi con 200 dalla configurazione di Nginx senza pubblicare un file

Mettendo insieme queste due cose finiamo con il seguente:

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

Questo ha funzionato per me in un ambiente di test. È un po 'ingombrante (non sono sicuro che sia meglio che generare automaticamente un file all'avvio di Docker che contenga le variazioni necessarie).

Spero che aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.