सवाल मैं Nginx.conf में पर्यावरण चर का उपयोग कैसे कर सकता हूं


[क्रॉस-पोस्ट और से संपादित किया गया https://stackoverflow.com/questions/21933955 क्योंकि इसे स्टैक ओवरफ्लो के लिए भी sysadmin माना जाता था।]

मेरे पास एक डॉकर कंटेनर है जो Nginx चला रहा है, जो कि दूसरे डॉकर कंटेनर से जुड़ा हुआ है। दूसरे कंटेनर का होस्ट नाम और आईपी पता Nginx कंटेनर में स्टार्टअप पर पर्यावरण चर के रूप में लोड किया गया है, लेकिन इससे पहले पता नहीं है (यह गतिशील है)। मुझे मेरा चाहिये nginx.conf इन मानों का उपयोग करने के लिए - उदा।

upstream gunicorn {
    server $APP_HOST_NAME:$APP_HOST_PORT;
}

मैं स्टार्टअप पर Nginx कॉन्फ़िगरेशन में पर्यावरण चर कैसे प्राप्त कर सकता हूं?

संपादित करें 1

नीचे दिए गए सुझाव के बाद, यह पूरी फ़ाइल है:

env APP_WEB_1_PORT_5000_TCP_ADDR;
# Nginx host configuration for django_app

# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
    server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}

server {
    listen 80;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /static/ {
        alias /app/static/;
    }
    location /media/ {
        alias /app/media/;
    }
    location / {
        proxy_pass http://gunicorn;
    }
}

Nginx फिर से लोड करना त्रुटियों:

$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1

संपादित करें 2: अधिक जानकारी

वर्तमान पर्यावरण चर

root@87ede56e0b11:/# env | grep APP_WEB_1
APP_WEB_1_NAME=/furious_turing/app_web_1
APP_WEB_1_PORT=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP_PROTO=tcp
APP_WEB_1_PORT_5000_TCP_PORT=5000
APP_WEB_1_PORT_5000_TCP_ADDR=172.17.0.63

रूट nginx.conf:

root@87ede56e0b11:/# head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;

साइट nginx विन्यास:

root@87ede56e0b11:/# head /etc/nginx/sites-available/default
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
    server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}

server {
    listen 80;

Nginx कॉन्फ़िगरेशन पुनः लोड करें:

root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3

143
2018-02-21 15:02


मूल


यह पर्यावरण चर के लिए एक सामान्य समाधान नहीं है, लेकिन यदि आप अपस्ट्रीम सर्वर के होस्टनाम / आईपी पते के लिए पर्यावरण चर का उपयोग करना चाहते हैं, तो ध्यान दें कि डॉकर (कम से कम हाल के संस्करणों में) आपके लिए / etc / hosts को संशोधित करता है। देख docs.docker.com/userguide/dockerlinks    इसका अर्थ यह है कि, यदि आपके लिंक किए गए कंटेनर को 'app_web_1' कहा जाता है, तो डॉकर आपके Nginx कंटेनर में / etc / hosts में एक लाइन बनाएगा। तो आप बस प्रतिस्थापित कर सकते हैं server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;    साथ में server app_web_1:5000; - mozz100
धन्यवाद @ mozz100 - यह अविश्वसनीय रूप से उपयोगी है - / etc / hosts प्रविष्टियां इस मामले में env vars से कहीं अधिक प्रभावी हैं। एकमात्र बिट लापता होने पर क्या होता है यदि अपस्ट्रीम कंटेनर पुनरारंभ होता है, और एक नया आईपी प्राप्त करता है। मुझे लगता है कि बच्चे के कंटेनर अभी भी मूल आईपी को इंगित करेंगे, न कि नया? - Hugo Rodger-Brown
हाँ, अगर आपने पुनरारंभ किया था app_web_1 इसे एक नया आईपी पता मिलेगा, इसलिए आपको अपने nginx कंटेनर को फिर से शुरू करना होगा। डॉकर इसे अद्यतन के साथ पुनरारंभ करेगा /etc/hosts इसलिए आपको nginx कॉन्फ़िगरेशन फ़ाइल को बदलने की आवश्यकता नहीं होगी। - mozz100


जवाब:


यदि आप एक लिंक का उपयोग कर रहे हैं, तो डॉकर पर्यावरण चर सेट करता है और लिंक किए गए कंटेनर के लिए उपनाम जोड़ता है /etc/hosts। यदि आप पोर्ट को हार्ड कोड करने में सक्षम हैं (या यदि यह सिर्फ पोर्ट 80 है) तो आप बस ऐसा कर सकते हैं:

upstream gunicorn {
    server linked-hostname:5000;
}

बंदरगाह केवल एक पर्यावरण चर में उपलब्ध है, जिसका उपयोग नहीं किया जा सकता है upstream मॉड्यूल, न ही सर्वर या स्थान ब्लॉक में। उन्हें केवल मुख्य कॉन्फ़िगरेशन में संदर्भित किया जा सकता है, जो आपकी सहायता नहीं करता है। आप इसके साथ कर सकते हैं ओपनरेस्ट बंडल इसमें लुआ शामिल है।

यदि आप ओपनस्टी / लुआ का उपयोग नहीं करना चाहते हैं, तो दूसरा विकल्प कंटेनर स्टार्टअप पर कुछ प्रतिस्थापन करना है। तुंहारे docker run आदेश लिंक बना सकता है फिर एक रैपर स्क्रिप्ट चला सकता है जो उचित प्रतिस्थापन करता है:

#!/bin/bash
/usr/bin/sed -i "s/server<gunicorn_server_placeholder>/${APP_WEB_1_PORT_5000_TCP_ADDR}/" default
start nginx

56
2018-03-18 06:14



Yup - वर्तमान (काम कर रहा) समाधान बिल्कुल यह है। बस थोड़ा सा हैकी लगता है। (उसने कहा, यह केवल एक स्थानीय देव पर्यावरण है, इसलिए हैकिंग एक बड़ी समस्या नहीं है।) - Hugo Rodger-Brown
मैं इसमें भाग गया, इसलिए मैंने थोड़ी अधिक सामान्य बना दी nginx कंटेनर जो स्वचालित रूप से कॉन्फ़िगरेशन में पर्यावरण चर का विस्तार करता है। - Shepmaster


से आधिकारिक Nginx डॉकर फ़ाइल:

Nginx विन्यास में पर्यावरण चर का उपयोग करना:

आउट ऑफ़ द बॉक्स, Nginx पर्यावरण चर का उपयोग करने का समर्थन नहीं करता है   अधिकांश विन्यास ब्लॉक के अंदर।

परंतु envsubst एक के रूप में इस्तेमाल किया जा सकता है   अगर आपको अपनी nginx विन्यास उत्पन्न करने की आवश्यकता है तो वर्कअराउंड   nginx शुरू होने से पहले गतिशील रूप से।

डॉकर-compose.yml का उपयोग कर एक उदाहरण यहां दिया गया है:

image: nginx
volumes:
 - ./mysite.template:/etc/nginx/conf.d/mysite.template
ports:
 - "8080:80"
environment:
 - NGINX_HOST=foobar.com
 - NGINX_PORT=80
command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" 

Mysite.template फ़ाइल में वैरिएबल संदर्भ शामिल हो सकते हैं   इस :

listen ${NGINX_PORT};

अद्यतन करें:

लेकिन आप इसे इस तरह के Nginx चर के कारण जानते हैं:

proxy_set_header        X-Forwarded-Host $host;

क्षतिग्रस्त:

proxy_set_header        X-Forwarded-Host ;

तो, इसे रोकने के लिए, मैं इस चाल का उपयोग करता हूं:

मेरे पास Nginx चलाने के लिए एक स्क्रिप्ट है, जिसका उपयोग किया जाता है docker-compose Nginx सर्वर के लिए कमांड विकल्प के रूप में फ़ाइल, मैंने इसे नाम दिया run_nginx.sh:

#!/usr/bin/env bash
export DOLLAR='$'
envsubst < nginx.conf.template > /etc/nginx/nginx.conf
nginx -g "daemon off;"

और परिभाषित नए की वजह से DOLLAR परिवर्तनीय run_nginx.sh स्क्रिप्ट, अब मेरी सामग्री nginx.conf.template Nginx खुद चर के लिए फ़ाइल इस तरह है:

proxy_set_header        X-Forwarded-Host ${DOLLAR}host;

और मेरे परिभाषित चर के लिए इस तरह है:

server_name  ${WEB_DOMAIN} www.${WEB_DOMAIN};

भी यहाँ, इसके लिए मेरा वास्तविक उपयोग मामला है।


61
2018-02-11 12:39



वह nginx confs की तरह मारता है proxy_set_header Host $http_host; - shredding
@shredding आप बदलने के लिए चर नामों में गुजर सकते हैं - दूसरों को छुआ नहीं है: command: /bin/bash -c "envsubst '$VAR1 $VAR2' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" मेरे लिए काम करता है बी / सी मुझे पता है कि उन्हें क्या कहा जाता है ... - pkyeck
ठीक है, बचने के लिए भूल गए $, होना चाहिए command: /bin/bash -c "envsubst '\$VAR1 \$VAR2' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" - pkyeck
अपने कामों से बचने के लिए विचार करें अपने डॉकरफाइल में: CMD ["/bin/sh","-c", "if [ -n \"${SOME_ENV}\" ]; then echo envsubst '${SOME_ENV}' with ${SOME_ENV} && envsubst '${SOME_ENV}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf; fi ; nginx -g 'daemon off;'"] - KCD
यह एक अच्छा समाधान है। धन्यवाद। ऊपर वर्णित लिंक भी github.com/docker-library/docs/issues/496 इस मुद्दे के लिए एक अच्छा समाधान है। - kabirbaidhya


लुआ के साथ ऐसा करने से यह काफी आसान है:

server {
    set_by_lua $server_name 'return os.getenv("NGINX_SERVERNAME")';
}

मैंने पाया कि यहां:

https://docs.apitools.com/blog/2014/07/02/using-environment-variables-in-nginx-conf.html

संपादित करें:

स्पष्ट रूप से इसे लुआ मॉड्यूल स्थापित करने की आवश्यकता है: https://github.com/openresty/lua-nginx-module

2 संपादित करें:

ध्यान दें कि इस दृष्टिकोण के साथ आपको परिभाषित करना होगा env Nginx में चर:

env ENVIRONMENT_VARIABLE_NAME

आपको इसे अपूर्ण संदर्भ में करना है nginx.conf या यह काम नहीं करेगा! सर्वर ब्लॉक में या किसी साइट की कॉन्फ़िगरेशन में नहीं /etc/nginx/sites-available, क्योंकि इसमें शामिल है nginx.conf में http संदर्भ (जो शीर्ष-स्तर संदर्भ नहीं है)।

यह भी ध्यान रखें कि यदि आप रीडायरेक्ट करने की कोशिश करते हैं तो इस दृष्टिकोण के साथ:

server {
    listen 80;
    server_name $server_name;
    return 301 https://$server_name$request_uri;
}

यह भी काम नहीं करेगा:

2016/08/30 14:49:35 [emerg] 1#0: the duplicate "server_name" variable in /etc/nginx/sites-enabled/default:8

और यदि आप इसे एक अलग चर नाम देते हैं:

set_by_lua $server_name_from_env 'return os.getenv("NGINX_SERVERNAME")';

server {
    listen 80;
    server_name $server_name_from_env;
    return 301 https://$server_name$request_uri;
}

nginx इसकी व्याख्या नहीं करेगा और आपको रीडायरेक्ट करेगा https://%24server_name_from_env/


26
2017-12-01 16:26



आप को आवश्यकता हो सकती env NGINX_SERVERNAME कहीं अपने nginx.conf में। - hiroshi
यह मेरे लिए काम नहीं करता है, हालांकि मेरे पास मेरे nginx डॉकर छवि में lua मॉड्यूल है। क्या यह इस तथ्य से संबंधित हो सकता है कि मैं अपने nginx.conf में कॉन्फ़िगरेशन फ़ाइल शामिल करता हूं? मैं कोशिश कर रहा था set_by_luaचर कॉन्फ़िगर फ़ाइल में चर, जबकि env MY_VAR जैसा कि सुझाव दिया गया है, घोषणा मुख्य nginx.conf में थी। क्या शर्म की बात है, यह सबसे साफ समाधान होगा! - pederpansen
क्या कोई इस विधि का उपयोग करने के लिए पेशेवरों / विपक्ष को जानता है envsubst? मुझे लगता है कि समर्थक आपको चलाने की जरूरत नहीं है envsubstr सर्वर शुरू करने से पहले कमांड और कॉन यह है कि आपको lua मॉड्यूल स्थापित करने की आवश्यकता है? मुझे आश्चर्य है कि क्या किसी भी दृष्टिकोण पर कोई सुरक्षा प्रभाव है? - Mark Winterbottom
@MarkWinterbottom ने अभी तक इसका परीक्षण नहीं किया है, लेकिन ऐसा लगता है कि आपको nginx कॉन्फ़िगरेशन फ़ाइलों को लिखने की अनुमति नहीं देनी होगी, जिसे आप उपयोग करना चाहते हैं envsubst और जो मेरे मामले में कोई नहीं है - Griddo


मैंने ऐसा कुछ लिखा जो सहायक हो सकता है या नहीं भी हो सकता है: https://github.com/yawn/envplate

यह इनलाइन कॉन्फ़िगरेशन फ़ाइलों को $ {key} पर्यावरण चर के संदर्भों के साथ संपादित करता है, वैकल्पिक रूप से बैकअप / लॉगिंग करता है जो यह करता है। यह गो में लिखा गया है और परिणामी स्थैतिक बाइनरी को लिनक्स और मैकोज़ के लिए रिलीज टैब से डाउनलोड किया जा सकता है।

यह निष्पादित () प्रक्रियाओं, डिफ़ॉल्ट विकल्प, लॉग और समझदार विफलता semantics भी कर सकते हैं।


14
2017-11-15 16:02





मैंने क्या किया था इसका उपयोग करना था ERB!

cat nginx.conf  | grep -i error_log

error_log <%= ENV["APP_ROOT"] %>/nginx/logs/error.log;

- क्रिया का उपयोग करने के बाद

export APP_ROOT=/tmp

erb nginx.conf  | grep -i error_log

error_log /tmp/nginx/logs/error.log;

इसका उपयोग किया जाता है क्लाउडफाउंड्री staticfile-buildpack

नमूना nginx विन्यास: https://github.com/cloudfoundry/staticfile-buildpack/blob/master/conf/nginx.conf

आपके मामले में

head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;
upstream gunicorn {
    server $APP_HOST_NAME:$APP_HOST_PORT;
}

बनना

head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env <%= ENV["APP_WEB_1_PORT_5000_TCP_ADDR"] %>
upstream gunicorn {
    server <%= ENV["APP_HOST_NAME"] %>:<%= ENV["APP_HOST_PORT"] %>
}

#After applying erb

export APP_WEB_1_PORT_5000_TCP_ADDR=12.12.12.12
export APP_HOST_NAME=test
export APP_HOST_PORT=7089 

erb /etc/nginx/nginx.conf

head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env 12.12.12.12
upstream gunicorn {
    server test: 7089
}

5
2018-02-20 00:11



क्या आप इस उत्तर पर विस्तार कर सकते हैं? यह ध्यान देने योग्य है कि ऊपर दिए गए इस प्रश्न का पहले से ही स्वीकार्य उत्तर है, लेकिन यदि आपको लगता है कि आपका उत्तर इस पर मूल्य जोड़ता है तो कृपया उस पर विस्तार करें। - BE77Y


क्रिया का उपयोग करने के उत्तर का जिक्र करते हुए, इसे नीचे के रूप में किया जा सकता है।

एनजीआईएनएक्स कॉन्फ़िगरेशन फ़ाइल को पर्यावरण चर युक्त एक एआरबी फ़ाइल के रूप में लिखें, और इसे सामान्य कॉन्फ़िगरेशन फ़ाइल में erb कमांड का उपयोग करके मूल्यांकन करें।

erb nginx.conf.erb > nginx.conf

Nginx.conf.erb फ़ाइल के सर्वर ब्लॉक के अंदर हो सकता है

listen <%= ENV["PORT"] %>;

4
2017-08-01 11:39



क्या मुझे कंटेनर के अंदर रूबी स्थापित करने की ज़रूरत है? (यदि नहीं, तो कैसे है erb परिवर्तनीय प्रतिस्थापन करने में सक्षम ... कंटेनर शुरू करने के बाद, सही?) - erb क्या यह रूबी सामान सही है: stuartellis.name/articles/erb - KajMagnus
यह एक कमांड लाइन उपकरण है जो मानक रूबी इंस्टॉलेशन के साथ आता है। यदि आपके पास कंटेनर में नहीं है तो अन्य विकल्पों को आजमाएं। - Ruifeng Ma
ठीक है, समझाओ के लिए धन्यवाद - KajMagnus


मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर किसी ने इस पर ठोकर खाई है (जैसा कि मेरे पास है), तो ऐसा करने का एक बेहतर तरीका है। चूंकि डॉकर / etc / hosts में जुड़े कंटेनर के उपनाम को सम्मिलित करता है, तो आप बस कर सकते हैं

upstream upstream_name {
    server docker_link_alias;
}

मानते हैं कि आपका डॉकर कमांड कुछ ऐसा है docker run --link othercontainer:docker_link_alias nginx_container


3
2018-03-17 05:16



आप मेजबान को इस विधि का उपयोग कर प्राप्त कर सकते हैं लेकिन बंदरगाह नहीं। आपको पोर्ट को हार्ड कोड करना होगा या मान लें कि यह पोर्ट 80 का उपयोग कर रहा है। - Ben Whaley


एक और विकल्प ... मुझे आज यह टूल मिला है: https://github.com/kreuzwerker/envplate ... जाओ में लिखा, इसे बहुत आसानी से स्थापित किया जा सकता है। इसका उपयोग करना काफी सरल है। हालांकि आपको अपने nginx.conf में टेम्पलेट चर डालने की आवश्यकता होगी।

उदाहरण के लिए ${SOME_ENV_VAR} envplate के स्थान पर बदल दिया जाएगा ep फ़ाइल पर कमांड कहा जाता है। तो क्या आपके डॉकरफ़ाइल को उस बाइनरी को पाने में असफल होना चाहिए या इसे किसी कारण से नहीं चलाना चाहिए, यह आपकी कॉन्फ़िगरेशन को अमान्य कर देगा। पर्ल या लुआ एक्सटेंशन का उपयोग करने जैसे अन्य समाधानों की तुलना में बस थोड़ा सा नोट।

मुझे वास्तव में यह पसंद है कि जब आप पर्यावरण चर सेट नहीं करते हैं तो आप डिफ़ॉल्ट मान भी सेट कर सकते हैं। पूर्व। ${SOME_ENV_VAR:default-value} (और आप मूल्यों से बच सकते हैं)। फिर, envplate अभी भी सफलतापूर्वक चलाना चाहिए।

इस तरह के दृष्टिकोण का उपयोग करने का एक लाभ यह है कि आप एक डॉकर छवि के साथ समाप्त नहीं होते हैं जो आवश्यक से बड़ा है क्योंकि आप अन्य मॉड्यूल के सभी प्रकारों को स्थापित करना बंद कर देते हैं जिन्हें आपको अन्यथा आवश्यक नहीं है। अगर चीजें जटिल हो जाती हैं तो यह sed का उपयोग करने से भी आसान हो सकता है और इसमें डिफ़ॉल्ट मान कार्यक्षमता शामिल है।


2
2017-07-20 00:14



मेरी सलाह github.com/gliderlabs/sigil क्योंकि मैं envplate के साथ कई कीड़े और समस्याओं में भाग गया। - Nick


मैं इसे खोल स्क्रिप्ट का उपयोग करके पूरा करता हूं।

यहां nginx टेम्पलेट है:

server {

    listen 80;
    server_name ___MY_DOMAIN_NAME___;
    charset utf-8;

    location /proxy {
        proxy_pass http://___PROXY_IP___:___PROXY_PORT___;
        proxy_set_header Host            $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
    }

    location / {
        return         200;
    }

}

और पर्यावरण चर को बदलने के लिए स्क्रिप्ट यहां है:

echo sleep 3
sleep 3

echo build starting nginx config


echo replacing ___MY_DOMAIN_NAME___/$MY_DOMAIN_NAME
echo replacing ___PROXY_IP___/$LETSENCRYPT_IP
echo replacing ___PROXY_PORT___/$PROXY_PORT

sed -i "s/___MY_DOMAIN_NAME___/$MY_DOMAIN_NAME/g" /etc/nginx/nginx.conf
sed -i "s/___PROXY_IP___/$PROXY_IP/g" /etc/nginx/nginx.conf
sed -i "s/___PROXY_PORT___/$PROXY_PORT/g" /etc/nginx/nginx.conf

cat /etc/nginx/nginx.conf

if [ -z "$MY_DOMAIN_NAME" ]; then
    echo "Need to set MY_DOMAIN_NAME"
    exit 1
fi  
if [ -z "$LETSENCRYPT_IP" ]; then
    echo "Need to set LETSENCRYPT_IP"
    exit 1
fi  
if [ -z "$LETSENCRYPT_PORT" ]; then
    echo "Need to set LETSENCRYPT_PORT"
    exit 1
fi
if [ -z "$LETSENCRYPT_HTTPS_IP" ]; then
    echo "Need to set LETSENCRYPT_HTTPS_IP"
    exit 1
fi 
if [ -z "$LETSENCRYPT_HTTPS_PORT" ]; then
    echo "Need to set LETSENCRYPT_HTTPS_PORT"
    exit 1
fi

nginx -g 'daemon off;'

2
2018-01-20 06:35





आधिकारिक nginx छवि उपयोग करने की सिफारिश करता है envsubst, परंतु जैसा कि दूसरों द्वारा इंगित किया गया है यह भी बदल जाएगा $host और अन्य चर, जो वांछनीय नहीं है। लेकिन सौभाग्यवश envsubst कर सकते हैं प्रतिस्थापन के लिए वैरिएबल के नाम पैरामीटर के रूप में लें

कंटेनर के लिए एक बहुत ही जटिल कमांड पैरामीटर से बचने के लिए (जैसा कि लिंक किए गए उदाहरण में है), आप एक डॉकर एंट्रीपॉइंट स्क्रिप्ट लिख सकते हैं जो कमांड को निष्पादित करने से पहले पर्यावरण चर भर देगा। पैरामीटर को सत्यापित करने और डिफ़ॉल्ट मानों को सेट करने के लिए एंट्रीपॉइंट स्क्रिप्ट भी एक अच्छी जगह है।

यहां एक nginx कंटेनर का एक उदाहरण है जो इसमें आता है API_HOST तथा API_PORT पर्यावरण चर के रूप में पैरामीटर।

nginx-default.conf.template

resolver  127.0.0.11 valid=10s;  # recover from the backend's IP changing

server {
  listen  80;

  location / {
    root  /usr/share/nginx/html;
  }

  location /api {
    proxy_pass  http://${API_HOST}:${API_PORT};
    proxy_set_header  Host $http_host;
  }
}

docker-entrypoint.sh

#!/usr/bin/env sh
set -eu

envsubst '${API_HOST} ${API_PORT}' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf

exec "$@"

Dockerfile

FROM nginx:1.15-alpine

COPY nginx-default.conf.template /etc/nginx/conf.d/default.conf.template

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

1
2017-07-02 17:28