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


183

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

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

upstream gunicorn {
    server $APP_HOST_NAME:$APP_HOST_PORT;
}

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

EDIT 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

EDIT 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

8
यह पर्यावरण चर के लिए एक सामान्य समाधान नहीं है, लेकिन यदि आप अपस्ट्रीम सर्वरों के होस्टनाम / आईपी पतों के लिए पर्यावरण चर का उपयोग करना चाहते हैं, तो ध्यान दें कि डॉकर (हाल के संस्करणों में कम से कम) आपके लिए / आदि को होस्ट करता है। Docs.docker.com/userguide/dockerlinks देखें इसका मतलब है, यदि आपके लिंक किए गए कंटेनर को 'app_web_1' कहा जाता है, तो डॉकटर आपके Nginx कंटेनर में / etc / host में एक लाइन बनाएगा। तो आप बस के server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000; साथ बदल सकते हैं server app_web_1:5000;
mozz100

1
धन्यवाद @ mozz100 - यह अविश्वसनीय रूप से उपयोगी है - / आदि / मेजबान प्रविष्टियां इस मामले में एनवी संस्करण की तुलना में बहुत अधिक प्रभावी हैं। अपस्ट्रीम कंटेनर को फिर से शुरू करने और एक नया आईपी प्राप्त करने पर केवल थोड़ा सा गुम होता है। मैं मान रहा हूं कि बच्चे के कंटेनर अभी भी मूल आईपी को इंगित करेंगे, नए को नहीं?
ह्यूगो रॉजर-ब्राउन

1
हां, यदि आपने पुनः आरंभ किया है app_web_1तो उसे एक नया आईपी पता मिलेगा, इसलिए आपको अपने नगीन कंटेनर को भी पुनः आरंभ करना होगा। डॉकर इसे एक अपडेट के साथ फिर से शुरू करेगा /etc/hostsताकि आपको नगीन कॉन्फिग फाइल (एस) को बदलने की जरूरत न पड़े।
मौज़ 100

जवाबों:


100

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

Nginx कॉन्फ़िगरेशन में पर्यावरण चर का उपयोग करना:

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

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

यहाँ docker-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-composeNginx सर्वर के लिए कमांड विकल्प के रूप में फ़ाइल पर उपयोग की जाती है, मैंने इसे नाम दिया है 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नगणक्स के लिए मेरी फ़ाइल की सामग्री ही इस तरह है:

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

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

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

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


2
कि नग्नेक्स को मारता है जैसेproxy_set_header Host $http_host;
श्रेडिंग

22
@ श्रेय आप चर नामों में पास कर सकते हैं जिन्हें प्रतिस्थापित किया जा सकता है - दूसरों को छुआ नहीं गया: command: /bin/bash -c "envsubst '$VAR1 $VAR2' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"मेरे लिए काम करता है b / c मुझे पता है कि उन्हें क्या कहा जाता है ...
pkyeck

4
ठीक है, भागना भूल गया $, होना चाहिएcommand: /bin/bash -c "envsubst '\$VAR1 \$VAR2' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
pkyeck

2
भागने को अपनी स्वयं की Dockerfile में काम करता है के लिए विचार के साथ: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

1
यह एक बेहतरीन उपाय है। धन्यवाद। इसके अलावा github.com/docker-library/docs/issues/496 के ऊपर उल्लिखित लिंक में समस्या का एक शानदार समाधान है।
काबिरबैध्या

34

लग रहा है की तुलना में लू के साथ ऐसा करना काफी आसान है:

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 संपादित करें:

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

env ENVIRONMENT_VARIABLE_NAME

आपको nginx.confइसे toplevel संदर्भ में करना होगा या यह काम नहीं करेगा! सर्वर ब्लॉक में या किसी साइट के कॉन्फ़िगरेशन में नहीं /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/


3
आपको env NGINX_SERVERNAMEअपने nginx.conf में कहीं न कहीं आवश्यकता हो सकती है।
हिरोशी

यह मेरे लिए काम नहीं करता था, हालांकि मेरे नगनेक्स डॉक इमेज में लुआ मॉड्यूल है। क्या यह इस तथ्य से संबंधित हो सकता है कि मैं अपने nginx.conf के भीतर एक कॉन्फ़िगर फ़ाइल शामिल करता हूं? मैं set_by_luaशामिल कॉन्फ़िगर फ़ाइल में चर की कोशिश कर रहा था , जबकि env MY_VARघोषणा मुख्य nginx.conf में थी, जैसा कि सुझाव दिया गया था। क्या शर्म की बात है, यह सबसे साफ समाधान होता!
पैदल यात्रा

किसी को भी इस विधि का उपयोग करने के लिए पेशेवरों / विपक्ष जानता है envsubst? मुझे लगता है कि Pro आपको envsubstrसर्वर शुरू करने से पहले कमांड चलाने की आवश्यकता नहीं है और con है कि आपको lua मॉड्यूल इंस्टॉल करने की आवश्यकता है? मुझे आश्चर्य है कि क्या दोनों दृष्टिकोणों में कोई सुरक्षा निहितार्थ हैं?
मार्क विंटरबॉटम

@MarkWinterbottom ने अभी तक इसका परीक्षण नहीं किया है, लेकिन ऐसा लग रहा है कि आपको nginx config files को लिखने की अनुमति नहीं देनी होगी, जिसका आपको उपयोग करना है envsubstऔर जो मेरे मामले में एक नहीं है
Griddo

14

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

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

यह निष्पादन () प्रक्रियाओं, स्थानापन्न चूक, लॉग को भी निष्पादित कर सकता है और इसमें समझदार विफलता शब्दार्थ है।


10

आधिकारिक नग्नेक्स छवि का उपयोग करने की अनुशंसा करता है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;"]

5

मैंने क्या किया था एरब का उपयोग करने के लिए !

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;

इसका उपयोग Cloudfoundry 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
}

4

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

एनजीआईएनएक्स कॉन्फिगर फाइल को एरब फाइल को एनवायरनमेंट वैरिएबल के रूप में लिखें, और एर्ब कमांड को सामान्य कॉन्फिगर फाइल का उपयोग करके इसका मूल्यांकन करें।

erb nginx.conf.erb > nginx.conf

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

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

1
क्या मुझे कंटेनर के अंदर रूबी को स्थापित करने की आवश्यकता है? (यदि नहीं, तो कैसे erbपरिवर्तनीय प्रतिस्थापन करने में सक्षम है ... कंटेनर चालू होने के बाद, सही?) - erbक्या यह रूबी सामान सही है: stuartellis.name/articles/erb
KajMagnus

1
यह एक कमांड लाइन टूल है जो मानक रूबी इंस्टॉलेशन के साथ आता है। यदि आपके पास कंटेनर में नहीं है तो अन्य विकल्पों का प्रयास करें।
Ruifeng Ma

3

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

upstream upstream_name {
    server docker_link_alias;
}

अपने कर्ता की आज्ञा मान लेना कुछ इस तरह है docker run --link othercontainer:docker_link_alias nginx_container


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

2

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

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

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

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


मैं github.com/gliderlabs/sigil को सलाह देता हूं क्योंकि मैं envplate के साथ कई बग और समस्याओं में भाग गया था।
निक

2

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

यहाँ 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;'

1

एक और संभावना यह है कि नियमित अभिव्यक्तियों के साथ 'sed' कमांड का उपयोग करें, फिर आपको अपनी कॉन्फिग फाइलों के साथ बिल्कुल भी गड़बड़ नहीं करना पड़ेगा! इस तरह से आप अपनी कॉन्फिगर फाइल को सामान्य रूप से उपयोग कर सकते हैं, लेकिन जब आप डॉक करते हैं, तो यह एनव चर के साथ मूल्यों को स्वैप कर देगा। इसमें से कोई भी "आपके द्वारा कॉन्फ़िगर की गई फ़ाइलों को आपके द्वारा कॉन्फ़िगर और बदलने वाली फ़ाइलों में पाठ की एक स्ट्रिंग नहीं जोड़ता है।"

आप अपने पर्यावरण चर का उपयोग करके प्रतिस्थापन मानों के साथ एक रन.श फ़ाइल बना सकते हैं।

इस पंक्ति पर "7s" को बदलने के लिए:

client_body_timeout 7s;         #Default 60s

एसडब्ल्यू कमांड का उपयोग ग्राहक_बॉडी_टाइमआउट को खोज लाइन के रूप में और $ क्लाइंट_बॉडी_टाइमआउट को प्रतिस्थापन चर के रूप में करता है:

sed -i "s/\(client_body_timeout\).*\?\;/\1 $client_body_timeout;/" /usr/local/nginx/conf/nginx.conf

प्रत्येक पैरामीटर के लिए इस लाइन को कॉपी / पेस्ट करें जिसे आप सेट करना चाहते हैं और config विकल्प के साथ client_body_timeout बदलना और इसके साथ जुड़े env चर के साथ $ client_body_timeout। मौजूदा कॉन्फ़िगरेशन फ़ाइल के साथ उपयोग करें और यह सिर्फ काम करेगा।


0

यहाँ sedदृष्टिकोण का उपयोग करने का एक उदाहरण है , जरूरी नहीं कि बेहतर हो लेकिन यह कुछ के लिए उपयोगी हो सकता है। सबसे पहले, एक कस्टम कीवर्ड जोड़ें, जिसे फ़ाइल फ़ाइल में बदल दिया जाए। दूसरा, एक डॉकफाइल बनाएं जो एक ENVचर घोषित करता है और फिर एक है CMDजो sedस्पष्ट रूप से nginx चलाने से पहले कॉन्फ़िगरेशन को संपादित करने के लिए उपयोग करता है।

तो मान लीजिए कि आपका default.conf कीवर्ड के साथ है docker_host:

location /api { proxy_pass http://docker_host:9000/api; }

और अपनी डॉकरीफाइल को इसी तरह लिखें:

ENV docker_host localhost
ADD default.conf /etc/nginx/conf.d/default.conf
CMD sed -i.bak s/docker_host/$docker_host/g /etc/nginx/conf.d/default.conf &&   nginx -g "daemon off;"

फिर छवि बनाएं और कंटेनर का उपयोग करके चलाएं

docker run -d -p 80:80 -e "docker_host=${env:COMPUTERNAME}" imagename

0

लुआ के साथ ऐसा करने का उचित तरीका, क्योंकि उपरोक्त उत्तर बासी है:

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.