Nginx.conf හි පරිසර විචල්‍යයන් භාවිතා කරන්නේ කෙසේද?


210

[ Https://stackoverflow.com/questions/21933955 වෙතින් හරස්-පළ කර සංස්කරණය කරන ලදි , එය ස්ටැක් ඕවර්ෆ්ලෝ සඳහා සයිසැඩ්මින් වැනි යැයි සැලකේ.]

මා සතුව ඩොකින් කන්ටේනරයක් එන්ජින්එක්ස් ධාවනය වන අතර එය වෙනත් ඩොකර් කන්ටේනරයකට සම්බන්ධ වේ. දෙවන බහාලුමේ ධාරක නාමය සහ 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
මෙය පරිසර විචල්‍යයන් සඳහා සාමාන්‍ය විසඳුමක් නොවේ, නමුත් ඔබට උඩුමහලේ සේවාදායකයන්ගේ සත්කාරක නාම / අයිපී ලිපින සඳහා පරිසර විචල්‍යයන් භාවිතා කිරීමට අවශ්‍ය නම්, ඩොකර් (අවම වශයෙන් මෑත සංස්කරණ වලදී) ඔබ වෙනුවෙන් / etc / ධාරක වෙනස් කරන බව සලකන්න. 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 - එය ඇදහිය නොහැකි තරම් ප්‍රයෝජනවත් - / etc / ධාරක ඇතුළත් කිරීම් මෙම නඩුවේ env vars වලට වඩා බෙහෙවින් are ලදායී වේ. උඩුමහලේ බහාලුම නැවත අරඹා නව අයිපී එකක් ලබා ගන්නේ නම් කුමක් සිදුවේද යන්න අතුරුදහන් වේ. මම හිතන්නේ ළමා බහාලුම් තවමත් මුල් අයිපී වෙත යොමු කරනු ඇත, නව එකක් නොවේද?
හියුගෝ රොඩ්ජර්-බ්‍රවුන්

1
ඔව්, ඔබ නැවත ආරම්භ app_web_1කළහොත් එයට නව IP ලිපිනයක් ලැබෙනු ඇත, එබැවින් ඔබට ඔබේ nginx බහාලුමද නැවත ආරම්භ කළ යුතුය. ඩොකර් එය යාවත්කාලීන කිරීමකින් නැවත ආරම්භ කරන /etc/hostsබැවින් ඔබට nginx වින්‍යාස ගොනුව වෙනස් කිරීමට අවශ්‍ය නොවේ.
mozz100

Answers:


118

සිට නිල විකිපීඩියා docker ගොනුව:

Nginx වින්‍යාසය තුළ පරිසර විචල්‍යයන් භාවිතා කිරීම:

බොහෝ වින්‍යාස කොටස් තුළ පරිසර විචල්‍යයන් භාවිතා කිරීමට Nginx සහාය නොදක්වයි.

නමුත් envsubstnginx ආරම්භ වීමට පෙර ඔබේ 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-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
එමඟින් nginx confs මරා දමයිproxy_set_header Host $http_host;
ඉරා දැමීම

28
redshredding ඔබට ප්‍රතිස්ථාපනය කළ හැකි විචල්‍ය නම් වලින් සමත් විය හැකිය - අනෙක් ඒවා ස්පර්ශ නොකෙරේ: 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

6
හරි, පැන යාමට අමතක වී $තිබිය යුතුය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
එයින් ගැලවීම සලකා බැලීමේදී ඔබේම ඩොකර්ෆයිල් තුළ: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

2
මෙය විශිෂ්ට විසඳුමකි. ස්තූතියි. ඉහත සඳහන් කළ සබැඳිය github.com/docker-library/docs/issues/496 මෙම ගැටලුවට හොඳ විසඳුමක් ඇත.
kabirbaidhya

37

ලුවා සමඟ මෙය කිරීම ශබ්දයට වඩා සැලකිය යුතු තරම් පහසු ය:

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

මම එය මෙහි සොයාගත්තා:

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

සංස්කරණය කරන්න:

පෙනෙන විදිහට මේ සඳහා lua මොඩියුලය ස්ථාපනය කිරීම අවශ්‍ය වේ: https://github.com/openresty/lua-nginx-module

සංස්කරණය 2:

මෙම ප්‍රවේශය සමඟ ඔබ envNginx හි විචල්‍යය අර්ථ දැක්විය යුතු බව සලකන්න :

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 හි කොතැනක හෝ ඔබට අවශ්‍ය විය හැකිය .
හිරෝෂි

මගේ nginx docker රූපයේ lua මොඩියුලය තිබුණද මෙය මට වැඩ කළේ නැත. මගේ nginx.conf තුළ වින්‍යාස ගොනුවක් ඇතුළත් කිරීම සම්බන්ධව මෙය සම්බන්ධ විය හැකිද? set_by_luaඇතුළත් කළ වින්‍යාස ගොනුවේ විචල්‍යයට මා උත්සාහ කරමින් සිටියදී, env MY_VARප්‍රකාශය ප්‍රධාන nginx.conf හි ඇති අතර, යෝජනා කළ පරිදි. මොනතරම් ලැජ්ජාවක්ද, මෙය පිරිසිදු විසඳුම වනු ඇත!
pederpansen

මෙම ක්‍රමය භාවිතා කිරීමේ වාසි / අවාසි කිසිවෙකු දන්නවාද envsubst? මම හිතන්නේ ප්‍රෝ යනු envsubstrසේවාදායකය ආරම්භ කිරීමට පෙර ඔබට විධානය ක්‍රියාත්මක කිරීමට අවශ්‍ය නොවන අතර කොන් යනු ඔබට ලුවා මොඩියුලය ස්ථාපනය කිරීමට අවශ්‍යද? මෙම ප්‍රවේශයන් දෙකෙහිම ආරක්ෂක ඇඟවුම් තිබේදැයි මම කල්පනා කරමි.
මාර්ක් වින්ටර්බෝටම්

Ark මාර්ක් වින්ටර්බෝටම් මෙය තවම පරීක්‍ෂා කර නැති නමුත් පෙනෙන්නේ ඔබට එන්ජින්එක්ස් වින්‍යාස ලිපිගොනු වෙත ලිඛිත ප්‍රවේශය ලබා දිය යුතු නැති බව පෙනේ, එය ඔබ භාවිතා කළ යුතු envsubstඅතර එය මගේ නඩුවේ
නොයෙදේ

env“Nginx.conf හි ඉහළම සන්දර්භය තුළ” විධානය කළ යුතු යැයි ඔබ කියන විට , “nginx.conf” යනු කුමක්ද? එම ගොනුව තිබිය යුත්තේ කොහේද?
ජැක් එම්

26

නිල nginx රූපය භාවිතා කිරීම නිර්දේශ කරයිenvsubst , නමුත් අනෙක් අය පෙන්වා දෙන පරිදි එය ද $hostවෙනත් විචල්‍යයන් ද ප්‍රතිස්ථාපනය කරනු ඇත . එහෙත් වාසනාවකට මෙන් envsubstහැකි වෙනුවට විචල්ය නම් පරාමිතිය ලෙස ගත .

බහාලුමට ඉතා සංකීර්ණ විධාන පරාමිතියක් වළක්වා ගැනීම සඳහා (සම්බන්ධිත උදාහරණයේ දී මෙන්), ඔබට ඩොකර් එන්ට්‍රොපොයින්ට් ස්ක්‍රිප්ට් එකක් ලිවිය හැකි අතර එය විධානය ක්‍රියාත්මක කිරීමට පෙර පරිසර විචල්‍යයන් පුරවනු ඇත. පරාමිති වලංගු කිරීම සහ පෙරනිමි අගයන් සැකසීම සඳහා ප්‍රවේශ ස්ථාන ස්ක්‍රිප්ට් හොඳ ස්ථානයකි.

මෙතන කාලයක් ගතවේ ක විකිපීඩියා රුවනයකි සඳහා උදාහරණයක් 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 "$@"

ඩොකර්ෆයිල්

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;"]

Conf.d වෙතින් අච්චුව පිරිසිදු කිරීම සඳහා මම ස්ක්‍රිප්ට් තරමක් වෙනස් කළෙමි. අවසාන අනුවාදය: `` `#! conf.d / default.conf rm /etc/nginx/conf.d/default.conf/template exec "$ @" `` `විශිෂ්ට පිටපතක් ස්තූතියි!
ෆිලිපුනිවර්ස්

14

මම ප්‍රයෝජනවත් හෝ ප්‍රයෝජනවත් නොවන දෙයක් ලිව්වෙමි: https://github.com/yawn/envplate

එය පරිසර විචල්‍යයන් සඳහා $ {key} යොමු කිරීම් සහිත වින්‍යාස ගොනු සංස්කරණය කරයි, විකල්පයක් ලෙස උපස්ථ නිර්මාණය කරයි / එය කරන දේ ලොග් කරයි. එය Go හි ලියා ඇති අතර එහි ප්‍රති ing ලයක් ලෙස ස්ථිතික ද්විමය ලිනක්ස් සහ මැකෝස් සඳහා මුදා හැරීමේ පටිත්තෙන් බාගත කළ හැකිය.

එයට ක්‍රියාවලි () ක්‍රියාවලි, ආදේශක පෙරනිමි, ලොග් සහ සංවේදී අසාර්ථක අර්ථකථන ද ඇත.


5

Erb භාවිතා කිරීම පිළිබඳ පිළිතුර සඳහන් කරමින් එය පහත පරිදි කළ හැකිය.

එන්ජීඑන්එක්ස් වින්‍යාස ගොනුව පරිසර විචල්‍යය අඩංගු erb ගොනුවක් ලෙස ලියන්න, එය සාමාන්‍ය වින්‍යාස ගොනුවකට erb විධානය භාවිතා කර තක්සේරු කරන්න.

erb nginx.conf.erb > nginx.conf

Nginx.conf.erb ගොනුවේ සේවාදායක කොටස තුළ තිබිය හැකිය

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

1
මට කන්ටේනරය තුළ රූබි ස්ථාපනය කිරීමට අවශ්‍යද? (කෙතරම්, එසේ නොවේ නම් erb- කන්ටේනර්, ආරම්භ අයිතිය පසු ... විචල්ය ආදේශන කළ හැකි?) erb: මෙම රූබි දේවල් හරි stuartellis.name/articles/erb
KajMagnus

1
එය සම්මත රූබි ස්ථාපනය සමඟ එන විධාන රේඛා මෙවලමකි. ඔබට එය කන්ටේනරයේ නොමැති නම් වෙනත් විකල්ප උත්සාහ කරන්න.
රූයිෆෙන් මා

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
}

3

මෙය පැරණි ප්‍රශ්නයක් බව මම දනිමි, නමුත් යමෙකු මේ පිළිබඳව පැකිලෙන්නේ නම් (මට දැන් ඇති පරිදි), මෙය කිරීමට වඩා හොඳ ක්‍රමයක් තිබේ. සම්බන්ධිත බහාලුම් අන්වර්ථය / etc / ධාරක තුළට ඩොකර් ඇතුළු කරන බැවින් ඔබට එය කළ හැකිය

upstream upstream_name {
    server docker_link_alias;
}

ඔබේ ඩොකර් විධානය උපකල්පනය කිරීම වැනි ය docker run --link othercontainer:docker_link_alias nginx_container.


1
ඔබට මෙම ක්‍රමය භාවිතා කර ධාරකය ලබා ගත හැකි නමුත් වරාය නොවේ. ඔබට වරාය දෘඩ කේත කිරීමට හෝ එය 80 වරාය භාවිතා කරයි යැයි උපකල්පනය කළ යුතුය.
බෙන් වේලි

3

මම මෙය සිදු කරන්නේ ෂෙල් ස්ක්‍රිප්ට් භාවිතයෙන්.

මෙන්න 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

තවත් විකල්පයක් ... මට අද මෙම මෙවලම හමු විය: https://github.com/kreuzwerker/envplate ... යන්නෙහි ලියා ඇත, එය ඉතා පහසුවෙන් ස්ථාපනය කළ හැකිය. එය භාවිතා කිරීම තරමක් සරල ය. ඔබේ nginx.conf හි අච්චු විචල්‍යයන් තැබීමට ඔබට අවශ්‍ය වුවද.

උදාහරණයක් ලෙස ${SOME_ENV_VAR}ගොනුවට envplate හි epවිධානය කැඳවූ විට ප්‍රතිස්ථාපනය වේ. එබැවින් ඔබේ ඩොකර්ෆයිල් එම ද්විමය ලබා ගැනීමට අපොහොසත් වුවහොත් හෝ එය කිසියම් හේතුවක් නිසා ක්‍රියාත්මක නොවන්නේ නම්, එය ඔබගේ වින්‍යාසය අවලංගු කරයි. පර්ල් හෝ ලුවා දිගු භාවිතා කිරීම වැනි වෙනත් විසඳුම් සමඟ සසඳන විට කුඩා සටහනක්.

පරිසර විචල්‍යය සකසා නොමැති විට පෙරනිමි අගයන් සැකසිය හැකි ආකාරය ගැන මම ඇත්තෙන්ම කැමතියි. උදා. ${SOME_ENV_VAR:default-value}(ඔබට අගයන්ගෙන් ගැලවිය හැක). නැවතත්, envplate තවමත් සාර්ථකව ක්‍රියාත්මක විය යුතුය.

මේ වගේ ප්‍රවේශයක් භාවිතා කිරීමේ එක් වාසියක් නම්, ඔබට අවශ්‍ය ප්‍රමාණයට වඩා විශාල ඩොකර් රූපයක් සමඟ අවසන් නොවීමයි, මන්ද ඔබට වෙනත් ආකාරයකින් අවශ්‍ය නොවන සියලු ආකාරයේ අතිරේක මොඩියුල ස්ථාපනය කිරීමෙන් ඉවත් වූ බැවිනි. දේවල් සංකීර්ණ වීමට පටන් ගනී නම් එය පෙරනිමි අගය ක්‍රියාකාරිත්වය අඩංගු වේ නම් එය sed භාවිතා කිරීමට වඩා පහසු විය හැකිය.


මම github.com/gliderlabs/sigil ට උපදෙස් දෙන්නේ envplate සමඟ බොහෝ දෝෂ සහ ගැටළු වලට මුහුණ දුන් නිසාය.
නික්

2

බොහෝ ක්‍රම තිබේ. සමහර පිළිතුරු සමහර පිළිතුරු වලින් දක්වා ඇත.

ඔබ එය භාවිතා ngx_http_js_moduleකරන්නේ නම්, JS සමඟ එය කිරීමට ක්‍රමයක් ද ඇත:

## /etc/nginx/fetch_env.js
function fetch_upstream_host(r) {
  return process.env.UPSTREAM_HOST;
}

function fetch_upstream_port(r) {
  return process.env.UPSTREAM_PORT;
}

හා

## /etc/nginx/nginx.conf
load_module modules/ngx_http_js_module.so;

env UPSTREAM_HOST;
env UPSTREAM_PORT;

http {
  js_include fetch_env.js;
  js_set $upstream_host fetch_upstream_host;
  js_set $upstream_port fetch_upstream_port;

  server {
    ...

    location / {
      ...

      proxy_pass http://$upstream_host:$upstream_port;
    }
  }

කරුණාකර ඔබ njs මොඩියුලය 0.33 හෝ නව භාවිතා කරන බවට වග බලා ගන්න


1

තවත් හැකියාවක් නම් සාමාන්‍ය ප්‍රකාශන සමඟ 'sed' විධානය භාවිතා කිරීමයි, එවිට ඔබට ඔබේ වින්‍යාස ගොනු කිසිසේත් අවුල් කිරීමට සිදු නොවේ! එමගින් ඔබට සාමාන්‍යයෙන් ඔබේ වින්‍යාස ගොනු භාවිතා කළ හැකිය, නමුත් ඔබ ඩොකර් ධාවනය කරන විට, එය env විචල්‍යයන් සමඟ අගයන් මාරු කරයි. මේ කිසිවක් "ඔබ සොයන සහ ප්‍රතිස්ථාපනය කරන වින්‍යාස ගොනු වලට පෙළක් එක් කරන්න."

ඔබේ පරිසර විචල්‍යයන් භාවිතා කරමින් ප්‍රතිස්ථාපන අගයන් සහිත run.sh ගොනුවක් සෑදිය හැකිය.

මෙම පේළියේ "7s" වෙනස් කිරීමට:

client_body_timeout 7s;         #Default 60s

සෙඩ් කමාන්ඩ් සෙවුම් රේඛාවක් ලෙස client_body_timeout සහ ප්‍රතිස්ථාපන env විචල්‍යය ලෙස $ client_body_timeout භාවිතා කරයි:

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

වින්‍යාස විකල්පය සමඟ client_body_timeout සැකසීමට සහ වෙනස් කිරීමට ඔබට අවශ්‍ය සෑම පරාමිතියක් සඳහාම මෙම පේළිය පිටපත් කරන්න / අලවන්න සහ එය සම්බන්ධ වී ඇති env විචල්‍යය සමඟ $ client_body_timeout. පවතින වින්‍යාස ගොනුව සමඟ භාවිතා කරන්න, එය ක්‍රියාත්මක වනු ඇත.


1

sedප්‍රවේශය භාවිතා කිරීම පිළිබඳ උදාහරණයක් මෙන්න , අවශ්‍යයෙන්ම වඩා හොඳ නොවන නමුත් එය සමහරුන්ට ප්‍රයෝජනවත් විය හැකිය. පළමුව, conf ගොනුව තුළ ප්‍රතිස්ථාපනය කිරීමට අභිරුචි යතුරු පදයක් එක් කරන්න. දෙවනුව, යම් ප්රකාශ කරන dockerfile නිර්මාණය 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;
}


0

ඔබට එය සරළව තබා ගැනීමට අවශ්‍ය නම්: bash eval sed
සරල නීති දෙකක් අනුගමනය කරන්න: ${ENV_IN_PARENTHESIS}සහ සෑම විටම 'අච්චුවේ උපුටා දැක්වීම් භාවිතා කරන්න
ඔබට සියලු පරිසර විචල්‍යයන් එක් සාමාන්‍ය ඇමතුමකින් මාරු කළ හැකිය.

 eval "echo \"$(sed 's/\$/##/g; s/\##{/${/g;' some.template)\"" | sed 's/\##/$/g' > some.conf


සිද්ධවන්නේ කුමක් ද:

පිළිතුර - $(sed 's/\$/##/g; s/\##{/${/g;' some.template)

අච්චුව හරහා ධාවනය කරන්න sedසහ:
1. සියලු $අක්ෂර ##
ආදේශ කරන්න 2. සියල්ල ##{නැවත ප්‍රතිස්ථාපනය කරන්න${

බී. eval "echo \"$(sed 's/\$/##/g; s/\##{/${/g;' some.template)\""

evalදෘශ්‍ය ප්‍රතිස්ථාපනය කරන නවීකරණය කරන ලද අච්චුව ධාවනය කරයි${ENV_IN_PARENTHESIS}

සී. ... | sed 's/\##/$/g' > some.conf

evalවෙනත් sedඇමතුමක ප්‍රති result ලය සියලු මුල් පිටපත් $ආපසු ලබා ##දෙන අතර අවසාන ප්‍රති result ලය ඔබේ දිලිසෙන නව කොන් ගොනුවට ප්‍රතිදානය කරයි.


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.