ฉันจะใช้ตัวแปรสภาพแวดล้อมใน Nginx.conf ได้อย่างไร


183

[ข้ามโพสต์และแก้ไขจากhttps://stackoverflow.com/questions/21933955เนื่องจากถูกพิจารณาว่าเป็นระบบที่เหมือนกันกับ StackOverflow]

ฉันมีตัวเทียบท่าที่ใช้ Nginx ซึ่งเชื่อมโยงไปยังคอนเทนเนอร์ตัวเทียบท่าอื่น ชื่อโฮสต์และที่อยู่ IP ของคอนเทนเนอร์ที่สองถูกโหลดลงในคอนเทนเนอร์ 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

8
นี่ไม่ใช่โซลูชันทั่วไปสำหรับตัวแปรสภาพแวดล้อม แต่ถ้าคุณต้องการใช้ตัวแปรสภาพแวดล้อมสำหรับชื่อโฮสต์ / ที่อยู่ IP ของเซิร์ฟเวอร์ upstream โปรดทราบว่า Docker (อย่างน้อยในรุ่นล่าสุด) จะปรับเปลี่ยน / etc / hosts สำหรับคุณ ดูdocs.docker.com/userguide/dockerlinks ซึ่งหมายความว่าถ้าคอนเทนเนอร์ที่เชื่อมโยงของคุณถูกเรียกว่า 'app_web_1' นักเทียบท่าจะสร้างบรรทัดใน / etc / hosts ในคอนเทนเนอร์ Nginx ของคุณ ดังนั้นคุณสามารถแทนที่ server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000; ด้วย server app_web_1:5000;
mozz100

1
ขอบคุณ @ mozz100 - มันมีประโยชน์อย่างเหลือเชื่อ - / etc / hosts รายการมีประสิทธิภาพมากกว่า env vars ในกรณีนี้ สิ่งที่ขาดหายไปเพียงอย่างเดียวคือสิ่งที่เกิดขึ้นหากมีการรีสตาร์ทคอนเทนเนอร์ขึ้นและได้รับ IP ใหม่ ฉันสมมติว่าคอนเทนเนอร์เด็กจะยังคงชี้ไปที่ IP ดั้งเดิมไม่ใช่อันใหม่ใช่หรือไม่
Hugo Rodger-Brown

1
ใช่ถ้าคุณรีสตาร์ทapp_web_1ก็จะได้รับที่อยู่ IP ใหม่ดังนั้นคุณต้องรีสตาร์ทคอนเทนเนอร์ nginx ของคุณด้วย นักเทียบท่าจะรีสตาร์ทพร้อมการอัปเดต/etc/hostsดังนั้นคุณไม่จำเป็นต้องแก้ไขไฟล์กำหนดค่า nginx
mozz100

คำตอบ:


100

จากไฟล์นักเทียบท่า Nginx อย่างเป็นทางการ:

การใช้ตัวแปรสภาพแวดล้อมในการกำหนดค่า nginx:

นอกกรอบ Nginx ไม่สนับสนุนการใช้ตัวแปรสภาพแวดล้อมในบล็อกการกำหนดค่าส่วนใหญ่

แต่envsubstอาจใช้เป็นวิธีแก้ปัญหาหากคุณต้องการสร้างการกำหนดค่า nginx ของคุณแบบไดนามิกก่อนที่จะเริ่ม nginx

นี่คือตัวอย่างการใช้ 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-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};

นอกจากนี้ที่นี่มีกรณีการใช้งานจริงของฉันสำหรับสิ่งนั้น


2
นั่นฆ่า nginx confs เช่นproxy_set_header Host $http_host;
ทำลาย

22
@Shredding คุณสามารถส่งต่อชื่อตัวแปรที่จะถูกแทนที่ได้ - คนอื่นไม่ได้สัมผัส: 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มีทางออกที่ดีสำหรับปัญหานี้
kabirbaidhya

34

การทำเช่นนี้กับ Lua นั้นง่ายกว่าที่คิด:

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

แก้ไข:

เห็นได้ชัดว่าต้องมีการติดตั้งโมดูล lua: 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/จะไม่ตีความมันและจะนำคุณไปยัง


3
คุณอาจต้องการenv NGINX_SERVERNAMEบางแห่งใน nginx.conf ของคุณ
ฮิโรชิ

สิ่งนี้ไม่ได้ผลสำหรับฉันแม้ว่าฉันจะมีโมดูล lua ในอิมเมจของ nginx docker ของฉัน สิ่งนี้อาจเกี่ยวข้องกับความจริงที่ว่าฉันรวมไฟล์กำหนดค่าไว้ใน nginx.conf ของฉันหรือไม่ ฉันพยายามset_by_luaตัวแปรในไฟล์กำหนดค่าที่รวมขณะที่การenv MY_VARประกาศอยู่ในหลัก nginx.conf ตามที่แนะนำ ช่างน่าละอายนี่น่าจะเป็นทางออกที่สะอาดที่สุด!
pederpansen

ไม่มีใครรู้ข้อดีข้อเสียของการใช้วิธีการนี้envsubstหรือไม่? ฉันเดาว่าคุณไม่จำเป็นต้องเรียกใช้envsubstrคำสั่งก่อนที่จะเริ่มเซิร์ฟเวอร์และข้อเสียคือคุณต้องติดตั้งโมดูล lua หรือไม่ ฉันสงสัยว่ามีความเกี่ยวข้องด้านความปลอดภัยหรือไม่ในทั้งสองวิธี?
Mark Winterbottom

@ MarkWinterbottom ยังไม่ได้ทดสอบสิ่งนี้ แต่ดูเหมือนว่าคุณไม่จำเป็นต้องให้สิทธิ์การเขียนเพื่อเข้าถึงไฟล์กำหนดค่า nginx ซึ่งคุณต้องใช้envsubstและสิ่งที่ไม่ต้องทำในกรณีของฉัน
Griddo

14

ฉันเขียนสิ่งที่อาจมีประโยชน์หรือไม่มีประโยชน์: https://github.com/yawn/envplate

มันจะแก้ไขไฟล์การกำหนดค่าแบบอินไลน์พร้อมกับ $ {key} อ้างอิงถึงตัวแปรสภาพแวดล้อมทางเลือกในการสร้างการสำรองข้อมูล / การบันทึกสิ่งที่มันทำ มันเขียนใน Go และไบนารีแบบคงที่ที่เป็นผลลัพธ์สามารถดาวน์โหลดได้จากแท็บ release สำหรับ Linux และ MacOS

นอกจากนี้ยังสามารถดำเนินการ () กระบวนการทดแทนค่าเริ่มต้นบันทึกและมีความหมายความล้มเหลวที่เหมาะสม


10

อิมเมจอย่างเป็นทางการของ nginx แนะนำให้ใช้envsubstแต่อย่างที่คนอื่นเห็นมันจะแทนที่ด้วย$hostและตัวแปรอื่น ๆ ซึ่งไม่เป็นที่ต้องการ แต่โชคดีที่envsubstสามารถใช้เป็นพารามิเตอร์ชื่อของตัวแปรที่จะเปลี่ยน

เพื่อหลีกเลี่ยงพารามิเตอร์คำสั่งที่ซับซ้อนมากไปยังคอนเทนเนอร์ (เช่นในตัวอย่างที่เชื่อมโยง) คุณสามารถเขียนสคริปต์จุดเชื่อมต่อ Docker ซึ่งจะเติมตัวแปรสภาพแวดล้อมก่อนดำเนินการคำสั่ง สคริปต์จุดเข้าใช้งานเป็นจุดที่ดีสำหรับการตรวจสอบความถูกต้องของพารามิเตอร์และการตั้งค่าเริ่มต้น

นี่คือตัวอย่างของคอนเทนเนอร์ 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

สิ่งที่ฉันทำคือการใช้erb !

cat nginx.conf  | grep -i error_log

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

- หลังจากใช้ erb

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 ก็สามารถทำได้ดังนี้

เขียนไฟล์กำหนดค่า NGINX เป็นไฟล์ erb ที่มีตัวแปรสภาพแวดล้อมและประเมินโดยใช้คำสั่ง erb ไปยังไฟล์ปรับแต่งปกติ

erb nginx.conf.erb > nginx.conf

ภายในบล็อกเซิร์ฟเวอร์ของไฟล์ nginx.conf.erb อาจมี

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

1
ฉันต้องติดตั้ง Ruby ภายในคอนเทนเนอร์หรือไม่ (ถ้าไม่ใช่วิธีerbสามารถทำการเปลี่ยนตัวตัวแปร ... หลังจากที่คอนเทนเนอร์เริ่มต้นใช่มั้ย) - erbนี่คือสิ่งทับทิมใช่ไหม
KajMagnus

1
มันเป็นเครื่องมือบรรทัดคำสั่งที่มาพร้อมกับการติดตั้ง Ruby มาตรฐาน ลองใช้ตัวเลือกอื่นถ้าคุณไม่มีในคอนเทนเนอร์
Ruifeng Ma

3

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ในกรณีที่มีคนสะดุดกับเรื่องนี้ (อย่างที่ฉันมี) มีวิธีที่ดีกว่ามากในการทำเช่นนี้ เนื่องจากนักเทียบท่าแทรกนามแฝงของคอนเทนเนอร์ที่เชื่อมโยงใน / etc / hosts คุณสามารถทำได้

upstream upstream_name {
    server docker_link_alias;
}

docker run --link othercontainer:docker_link_alias nginx_containerสมมติว่าคำสั่งนักเทียบท่าของคุณเป็นสิ่งที่ต้องการ


1
คุณสามารถรับโฮสต์โดยใช้วิธีนี้ แต่ไม่ใช่พอร์ต คุณต้องใช้รหัสฮาร์พอร์ตหรือสมมติว่าใช้พอร์ต 80
เบ็น Whaley

2

ตัวเลือกอื่น ... ฉันเพิ่งพบเครื่องมือนี้ในวันนี้: https://github.com/kreuzwerker/envplate ... เขียนใน Go สามารถติดตั้งได้อย่างง่ายดายมาก ใช้มันค่อนข้างง่าย แม้ว่าคุณจะต้องวางตัวแปรเทมเพลตใน nginx.conf ของคุณ

ตัวอย่างเช่น${SOME_ENV_VAR}จะถูกแทนที่เมื่อepคำสั่งenvplate ถูกเรียกบนไฟล์ ดังนั้นหาก Dockerfile ของคุณล้มเหลวในการรับไบนารีนั้นหรือไม่ควรทำงานด้วยเหตุผลบางอย่างมันจะทำให้การกำหนดค่าของคุณไม่ถูกต้อง เพียงเล็กน้อยเมื่อเทียบกับโซลูชันอื่น ๆ เช่นการใช้ส่วนขยาย perl หรือ lua

ฉันชอบวิธีที่คุณสามารถตั้งค่าเริ่มต้นด้วยเช่นกันเมื่อไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม อดีต ${SOME_ENV_VAR:default-value}(และคุณสามารถหลบหนีค่า) อีกครั้ง envplate ต้องยังคงทำงานได้สำเร็จ

ข้อดีอย่างหนึ่งของการใช้วิธีการเช่นนี้คือคุณไม่ได้ลงเอยด้วยภาพ Docker ที่ใหญ่เกินความจำเป็นเพราะคุณออกไปติดตั้งโมดูลพิเศษทุกประเภทที่คุณไม่ต้องการ มันอาจจะง่ายกว่าการใช้ sed หากสิ่งต่าง ๆ เริ่มมีความซับซ้อนและมีฟังก์ชันการทำงานที่เป็นค่าเริ่มต้น


ฉันแนะนำให้github.com/gliderlabs/sigilขณะที่ฉันพบข้อบกพร่องและปัญหามากมายเกี่ยวกับ envplate
Nick

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' กับนิพจน์ทั่วไปจากนั้นคุณไม่ต้องยุ่งกับไฟล์ปรับแต่งของคุณเลย! ด้วยวิธีนี้คุณสามารถใช้ไฟล์กำหนดค่าของคุณตามปกติ แต่เมื่อคุณเรียกใช้นักเทียบท่ามันจะสลับค่าออกมาพร้อมกับตัวแปร env ไม่มีสิ่งนี้ "เพิ่มสตริงข้อความในไฟล์ปรับแต่งที่คุณค้นหาและแทนที่ด้วย"

คุณสามารถสร้างไฟล์ run.sh ด้วยค่าการแทนที่โดยใช้ตัวแปรสภาพแวดล้อมของคุณ

วิธีเปลี่ยน "7s" ในบรรทัดนี้:

client_body_timeout 7s;         #Default 60s

Sed command โดยใช้client_body_timeoutเป็นบรรทัดค้นหาและ$ client_body_timeoutเป็นตัวแปร env ทดแทน:

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

คัดลอก / วางบรรทัดนี้สำหรับทุกพารามิเตอร์ที่คุณต้องการตั้งค่าและเปลี่ยน client_body_timeout ด้วยตัวเลือกการกำหนดค่าและ $ client_body_timeout พร้อมตัวแปร env ที่เกี่ยวข้อง ใช้กับไฟล์ปรับแต่งที่มีอยู่และมันจะใช้งานได้


0

นี่คือตัวอย่างของการใช้sedวิธีการที่ไม่จำเป็นต้องดีกว่า แต่อาจมีประโยชน์สำหรับบางคน ขั้นแรกให้เพิ่มคำหลักที่กำหนดเองเพื่อแทนที่ภายในไฟล์ conf ขั้นที่สองสร้างไฟล์ dockerfile ที่ประกาศENVตัวแปรจากนั้น a CMDที่ใช้sedเพื่อแก้ไขการกำหนดค่าก่อนเรียกใช้ nginx อย่างชัดเจน

ดังนั้นสมมติว่าdefault.confของคุณมีคำหลักนี้docker_host:

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

และเขียน Dockerfile ของคุณคล้ายกับ:

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

วิธีที่เหมาะสมในการทำเช่นนี้กับ lua เนื่องจากคำตอบข้างต้นเก่า:

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.