Soru Nginx ortam değişkenlerini nginx'in sunduğu statik dosyalar içinde kullanabilir miyim?


Nginx yapılandırmasında bir ortam değişkeni kullanırsam ve nginx yalnızca statik dosyalara (html, js, css - örneğin AngularJs uygulaması) hizmet edecek şekilde yapılandırılırsa, ortam değişkenini nginx hizmetinin bulunduğu bir JS dosyasında kullanabileceğim herhangi bir yol var mı? ? Veya statik olmayan bir sunucuyu çalıştırmak için bunu yapmanın tek yolu, örn. io.js, php vb.


Btw, nginx'in yapılandırmasında ortam değişkenlerini yerel olarak kullanamazsınız.

Çevre hakkında konuştuğum zaman, bu yazıdaki gibi nginx yapılandırmasında var. Nginx.conf'ta ortam değişkenlerini nasıl kullanabilirim kullandıkları yer env APP_WEB_1_PORT_5000_TCP_ADDR; ve $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};


Kullanım durumunuzu tam olarak açıklayın

Benim özel kullanım durumum, bir docker konteynerinde bir nginx-powered AngularJS uygulamasına sahip olduğumdur. Uygulama, başka bir sistem üzerinde çalışan bir API'yi tüketen "Tek Sayfa Uygulaması" dır. Şu anda, uygulama ve aşamalandırma arasında farklı bir docker konteyneri çalıştırıyorum çünkü uygulamanın Google-Analtyics kodu gibi farklı bir yapılandırması var. Bu ortama özgü veriler bir config.js dosya ve değerler şu anda sabit kodlanmış, bir değer master git dalında ve farklı değer staging dalı. Tasarımı değiştirmek istiyorum, böylece kullanabilirim aynısı üretim ve evreleme için konteyner. Çalıştığımda kabın içine bir ENV varışı geçmek istiyorum (docker run -e GACODE=UA-12345-6 ...) ve nginx kullanarak ENV var env GACODE; ve $ENV{"GACODE"} Böylece config.js dosya, kodlanmış olarak değil, iletilen GoogleAnaltyics kodlarını kullanabilir. Bunun mümkün olup olmadığını bilmiyorum (bundan dolayı soru;)). Yalnızca nginx kullanımı kapımı tek işlem yapar, oysa io.js'yi kullanmam gerekirse, birden çok bağlantılı kapsayıcıya ihtiyacım var ve daha fazla hareketli parça daha karmaşıktır).


8
2018-03-19 11:16


Menşei


Ne ?! Tam olarak kullanım durumunuzu açıklayın çünkü yanlış tarafa bakıyorsunuz. Btw, nginx'in yapılandırmasında ortam değişkenlerini yerel olarak kullanamazsınız. - Xavier Lucas
Teşekkürler @XavierLucas - Daha fazla açıklamaya çalışmak için soruyu güncelledim. - Tom


Cevaplar:


sub_filter

Basit bir string-replace istiyorsanız, kullanabilirsiniz sub_filter. Örneğin:

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
}

ancak bir ortam değişkeni okumak mümkün değil içinde nginx config - elbette nginx config dosyasını herhangi bir şekilde yazmanız gereken bir komut dosyası oluşturabilir veya geçerli bir config dosyası oluşturmak ve daha sonra nginx'i yeniden yüklemek isteyebilirsiniz.


3
2018-03-19 14:18



Bahşiş için teşekkürler sub_filter - Tom


Kullanarak denedim sub_filter ve nginx ortam değişkenleri ancak sonuç mümkün değil.

Örneğin, bu benim deneylerimi gösterir ve nginx'e aktarılan ENV'leri kullanarak gösterir değil içinde çalışmak server blok:

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

Hizmet ettiğim statik config.json dosyasının aşağıdaki gibi çeşitli test dizeleri vardır:

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

@ AD7six'in belirttiği gibi, devam etmenin yolu, nginx'in yer tutuculardan geçerli bir yapılandırma dosyası oluşturmaya başlamadan önce çalışan bir betiğe sahip olmasıdır. Ama bu soruya cevap verir, eğer bir betik nginx başlamadan önce yayınlanacaksa, config.json Bu komut dosyasında dosya ve rahatsız etmeyin sub_filter hiç


1
2018-03-23 10:20



Tek bir statik dosya içinse - nginx config ile yapmamanız kesinlikle mantıklıdır, usecase'inizin bundan daha geniş olduğunu varsaydım. Bilgi / kontrast için kullanıyorum sub_filter "example.com" "example.dev"; Bu referanslar, üçüncü taraf api yanıtları / uygulama kodu / js / db dumps / etc'den geldiği için, üretim etki alanına yapılan tüm referansları yerel ortama dönüştürmek için bir kurulumda. - nginx için herhangi bir html / js / json cevabının herhangi bir yerinde olabilir. +1 - AD7six


OP ile aynı sorunu çözmek istedim ve bu yayın Google aramada geldi, bu yüzden potansiyel bir çözüm ekleyeceğimi düşündüm.

Bu gönderi, nginx config içindeki bir ortam değişkenini nasıl göstereceğinizi özetliyor: https://blog.doismellburning.co.uk/environment-variables-in-nginx-config/

Ve dosya sisteminde bir dosya olmadan içerik döndürebilirsiniz: Bir dosya sunmadan Nginx yapılandırmasından 200 ile yanıtla

Bu iki şeyi bir araya getirdiğimizde şu sonuçlara varıyoruz:

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

Bu benim için bir test ortamında çalıştı. Bu biraz hantaldır (ihtiyacınız olan vars içerir Docker lansmanı üzerinde bir dosya otomatik oluştururken daha iyi değil).

Umarım yardımcı olur.


1
2017-07-17 03:32



İlginç, teşekkürler! - Tom