Wenn ich eine Umgebungsvariable in der Nginx-Konfiguration verwende und Nginx so konfiguriert ist, dass nur statische Dateien (HTML, JS, CSS - z. B. eine AngularJs-App) bereitgestellt werden, kann ich die Umgebungsvariable in einer von Nginx bereitgestellten JS-Datei verwenden ? Oder ist die einzige Möglichkeit, dies zu tun, um einen nicht statischen Server auszuführen, z. B. io.js, PHP usw.
Übrigens können Sie Umgebungsvariablen in der Konfiguration von nginx nicht nativ verwenden.
Wenn ich über Umgebungsvariablen in der Nginx-Konfiguration spreche, meine ich wie in diesem Beitrag: Wie kann ich Umgebungsvariablen in der Nginx.conf verwenden, wo sie env APP_WEB_1_PORT_5000_TCP_ADDR;
und verwenden$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};
Erklären Sie genau Ihren Anwendungsfall
Mein spezieller Anwendungsfall ist, dass ich eine AngularJS-App mit Nginx-Unterstützung in einem Docker-Container habe. Die App ist eine "Einzelseitenanwendung", die eine API verwendet, die insgesamt auf einem anderen System ausgeführt wird. Derzeit führe ich einen anderen Docker-Container zwischen Produktion und Staging aus, da die App eine andere Konfiguration hat, z. B. den Google-Analtyics-Code. Diese umgebungsspezifischen Daten werden in einer config.js
Datei gespeichert und die Werte sind derzeit fest codiert, ein Wert für den master
Zweig in Git und ein anderer Wert für den staging
Zweig. Ich möchte das Design ändern, damit ich für die Produktion und die Inszenierung denselben Container verwenden kann . Ich möchte eine ENV-Variable an den Container übergeben, wenn ich sie ausführe ( docker run -e GACODE=UA-12345-6 ...
) und nginx die ENV-Variable verwenden soll (via env GACODE;
und $ENV{"GACODE"}
so dieconfig.js
Datei kann die übergebenen GoogleAnaltyics-Codes verwenden, anstatt sie fest zu codieren. Ich weiß nicht, ob dies möglich ist oder nicht (daher die Frage;)). Die Verwendung von nur Nginx macht meinen Container zu einem einzigen Prozess. Wenn ich jedoch io.js verwenden muss, benötige ich mehrere verknüpfte Container und mehr bewegliche Teile sind komplexer.
Antworten:
sub_filter
Wenn Sie eine einfache Zeichenfolge ersetzen möchten, können Sie sub_filter verwenden . Zum Beispiel:
Allerdings ist es nicht möglich , eine Umgebungsvariable lesen in nginx Config - Sie natürlich Skript kann das Schreiben der nginx Config - Datei beliebig Sie brauchen / wollen eine gültige Konfigurationsdatei erzeugen und dann neu laden nginx.
quelle
Ich habe mit der Verwendung von Umgebungsvariablen sub_filter und nginx experimentiert, bin jedoch zu dem Schluss gekommen, dass dies nicht möglich ist .
Dies zeigt zum Beispiel meine Experimente und zeigt, dass die Verwendung von an nginx übergebenen ENVs innerhalb eines Blocks nicht funktioniert
server
:Dabei enthält die statische Datei config.json, die ich bediene, verschiedene Testzeichenfolgen wie die folgenden:
Wie bei @ AD7six erwähnt, müssen Sie ein Skript ausführen, bevor nginx eine gültige Konfigurationsdatei aus Platzhaltern erstellt. Dies wirft jedoch die Frage auf, ob ein Skript vor dem Start von nginx ausgeführt werden soll. Ich kann den Inhalt meiner
config.json
Datei auch in diesem Skript festlegen und mich überhaupt nicht darum kümmernsub_filter
.quelle
sub_filter "example.com" "example.dev";
in einem Entwicklungs-Setup alle Verweise auf die Produktionsdomäne in der lokalen Umgebung, da diese Verweise aus API-Antworten von Drittanbietern / App-Code / js / db-Dumps / etc. - dh für nginx könnte es irgendwo in einer html / js / json-Antwort sein. +1Ich habe versucht, das gleiche Problem wie das OP zu lösen, und dieser Beitrag wurde in der Google-Suche angezeigt. Daher dachte ich, ich würde eine mögliche Lösung hinzufügen.
In diesem Beitrag wird beschrieben, wie Sie eine Umgebungsvariable in der nginx-Konfiguration verfügbar machen können: https://blog.doismellburning.co.uk/environment-variables-in-nginx-config/
Und Sie können Inhalte zurückgeben, ohne eine Datei im Dateisystem zu haben: Antworten Sie mit 200 aus der Nginx-Konfiguration, ohne eine Datei bereitzustellen
Wenn wir diese beiden Dinge zusammenfügen, erhalten wir Folgendes:
Dies hat bei mir in einer Testumgebung funktioniert. Es ist etwas umständlich (nicht sicher, ob es besser ist, als beim Docker-Start automatisch eine Datei zu generieren, die die von Ihnen benötigten Variablen enthält).
Ich hoffe, das hilft.
quelle