Nginx.conf এ আমি পরিবেশের পরিবর্তনশীলগুলি কীভাবে ব্যবহার করতে পারি


183

[ক্রস পোস্ট এবং এটিকে https://stackoverflow.com/questions/21933955 থেকে সম্পাদিত হিসাবে স্ট্যাকওভারফ্লোয়ের জন্য এটি অত্যন্ত সাসাদমিন-জাতীয় হিসাবে বিবেচিত হয়েছিল]]

আমার কাছে ডিনার কনটেইনার রয়েছে এনগিনেক্স, এটি অন্য ডকারের ধারকটির সাথে লিঙ্ক করে। দ্বিতীয় ধারকটির হোস্টের নাম এবং আইপি ঠিকানা এনগিনেক্স পাত্রে প্রারম্ভকালে পরিবেশের ভেরিয়েবল হিসাবে লোড করা হয়, তবে তার আগে জানা যায় না (এটি গতিশীল)। আমি nginx.confএই মানগুলি ব্যবহার করতে চাই - যেমন

upstream gunicorn {
    server $APP_HOST_NAME:$APP_HOST_PORT;
}

প্রারম্ভকালে আমি এনগিনেক্স কনফিগারেশনে পরিবেশের পরিবর্তনগুলি কীভাবে পেতে পারি?

সম্পাদনা 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;

সাইট এনগিনেক্স কনফিগারেশন:

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
এটি পরিবেশের ভেরিয়েবলগুলির জন্য জেনেরিক সমাধান নয়, তবে আপনি যদি আপস্ট্রিম সার্ভারের হোস্টনাম / আইপি ঠিকানাগুলির জন্য পরিবেশের ভেরিয়েবলগুলি ব্যবহার করতে চান তবে মনে রাখবেন যে ডকার (কমপক্ষে সাম্প্রতিক সংস্করণে) আপনার জন্য / ইত্যাদি / হোস্টগুলি পরিবর্তন করে। ডকস.ডোকার.com/userguide/dockerlinks দেখুন এর অর্থ, যদি আপনার লিঙ্কযুক্ত ধারকটিকে 'app_web_1' বলা হয়, ডকার আপনার Nginx ধারকটিতে / ইত্যাদি / হোস্টগুলিতে একটি লাইন তৈরি করবে। তাই আপনি শুধু প্রতিস্থাপন করতে পারেন server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000; সঙ্গে server app_web_1:5000;
mozz100

1
ধন্যবাদ @ মোজ্জা 100 - এটি অবিশ্বাস্যরূপে কার্যকর - / ইত্যাদি / হোস্ট এন্ট্রি এই ক্ষেত্রে এনভি ওয়ার্সের চেয়ে অনেক বেশি কার্যকর। প্রবাহের ধারকটি পুনরায় চালু করা এবং একটি নতুন আইপি অর্জন করা হলে যা ঘটে তা কেবলমাত্র অনুপস্থিত। আমি অনুমান করছি যে সন্তানের পাত্রে এখনও মূল আইপিকে নির্দেশ করা হবে, নতুনটি নয়?
হুগো রজার-ব্রাউন

1
হ্যাঁ, আপনি যদি পুনরায় চালু করেন তবে app_web_1এটি একটি নতুন আইপি অ্যাড্রেস পাবে, সুতরাং আপনার এনজিঙ্ক্স ধারকটিও আবার চালু করতে হবে। ডকার একটি আপডেট দিয়ে এটি পুনরায় আরম্ভ করবে /etc/hostsযাতে আপনার nginx কনফিগারেশন ফাইল (গুলি) পরিবর্তন করতে হবে না।
mozz100

উত্তর:


100

থেকে সরকারী nginx Docker ফাইল:

এনগিনেক্স কনফিগারেশনে এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করা:

বাক্সের বাইরে, এনগিনেক্স বেশিরভাগ কনফিগারেশন ব্লকের মধ্যে এনভায়রনমেন্ট ভেরিয়েবলগুলি সমর্থন করে না।

তবে envsubstএনজিএনএক্স শুরু হওয়ার আগে আপনার যদি আপনার এনজিএনএক্স কনফিগারেশনটি গতিশীলভাবে জেনারেট করতে হয় তবে এটি কার্যকর হতে পারে।

ডকার-কমপোজ.আইএমএল ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হল:

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};

হালনাগাদ:

তবে আপনি জানেন যে এটি এর এনগিনেক্স ভেরিয়েবলের কারণে ঘটেছে:

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.templateNginx নিজেই ভেরিয়েবলের জন্য আমার ফাইলের বিষয়বস্তু এই জাতীয়:

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
@ শ্যাটারডিংয়ের পরিবর্তে আপনি পরিবর্তকের নাম পরিবর্তন করতে পারবেন - অন্যদের স্পর্শ করা হয় না: command: /bin/bash -c "envsubst '$VAR1 $VAR2' < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"আমার জন্য কাজ করে বি / সি আমি জানি তারা কী বলে ...
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;'"
পিকেইক

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;'"]
কেসিডি

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:

নোট করুন যে এই পদ্ধতির সাথে আপনাকে envএনগিনেক্সে ভেরিয়েবল সংজ্ঞা দিতে হবে :

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.conf এর মধ্যে একটি কনফিগার ফাইল অন্তর্ভুক্ত করার সাথে সম্পর্কিত হতে পারে? আমি set_by_luaঅন্তর্ভুক্ত কনফিগার ফাইলে ভেরিয়েবলটির চেষ্টা করছিলাম , যখন env MY_VARঘোষণাটি মূল nginx.conf তে ছিল, যেমনটি প্রস্তাবিত হয়েছিল। কী লজ্জাজনক, এটাই সবচেয়ে পরিষ্কার সমাধান হত!
pederpansen

এই পদ্ধতিটি ব্যবহার করার পক্ষে কেউ কি কুফর / বুদ্ধি জানে envsubst? আমি অনুমান করি যে envsubstrসার্ভারটি শুরু করার আগে আপনার কমান্ডটি চালানোর দরকার নেই এবং লুয়া মডিউলটি ইনস্টল করার দরকার কি? আমি ভাবছি যদি উভয় পদ্ধতির কোনও সুরক্ষা জড়িত থাকে?
মার্ক উইন্টারবটম

@ মার্কউইনটারবটম এটি এখনও পরীক্ষা করেন নি তবে দেখে মনে হচ্ছে আপনাকে এনজিএনএক্স কনফিগারেশন ফাইলগুলিতে লেখার অ্যাক্সেস দিতে হবে না, যা আপনার ব্যবহার করতে হবে envsubstএবং যা আমার ক্ষেত্রে
অবধারিত

14

আমি এমন কিছু লিখেছি যা সহায়ক বা নাও হতে পারে: https://github.com/yawn/envplate

এটি ইনলাইন কনফিগারেশন ফাইলগুলিকে vari {কী environment এনভায়রনমেন্ট ভেরিয়েবলের রেফারেন্স সহ সম্পাদনা করে optionচ্ছিকভাবে ব্যাকআপ তৈরি করে / এটি যা করে তা লগিং করে। এটি গোয়ে লেখা হয়েছে এবং ফলস্বরূপ স্থির বাইনারিগুলি লিনাক্স এবং ম্যাকোসের জন্য মুক্তির ট্যাব থেকে সহজেই ডাউনলোড করা যায়।

এটি () প্রক্রিয়াগুলি সম্পাদন করতে পারে, ডিফল্টের পরিবর্তে, লগগুলি প্রয়োগ করে এবং বোধগম্য ব্যর্থতা শব্দার্থক পদার্থ থাকতে পারে।


10

অফিসিয়াল এনজিনেক্স ইমেজটি ব্যবহারের পরামর্শ দিচ্ছেenvsubst , তবে অন্যের নির্দেশিত হিসাবে এটি $hostএবং অন্যান্য ভেরিয়েবলগুলি প্রতিস্থাপন করবে , যা কাম্য নয়। কিন্তু ভাগ্যক্রমে envsubstকরতে একটি প্যারামিটার ভেরিয়েবল নামগুলি আমরা প্রতিস্থাপন হিসেবে নেওয়া

ধারকটিতে একটি জটিল কমান্ড প্যারামিটার এড়াতে (সংযুক্ত উদাহরণ হিসাবে), আপনি একটি ডকার এন্ট্রিপয়েন্ট স্ক্রিপ্ট লিখতে পারেন যা কমান্ডটি কার্যকর করার আগে পরিবেশের ভেরিয়েবল পূরণ করবে। পরামিতিগুলির বৈধতা এবং ডিফল্ট মান নির্ধারণের জন্য এন্ট্রিপয়েন্ট স্ক্রিপ্টটিও ভাল জায়গা is

এখানে একটি 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;

- এরব ব্যবহারের পরে

export APP_ROOT=/tmp

erb nginx.conf  | grep -i error_log

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

এটি ক্লাউডফাউন্ড্রি স্ট্যাটিকফিল-বিল্ডপ্যাকে ব্যবহৃত হয়

নমুনা এনজিনেক্স কনফিগারেশন: 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এই রুবি জিনিসটি কি
KajMagnus

1
এটি একটি কমান্ড লাইন সরঞ্জাম যা স্ট্যান্ডার্ড রুবি ইনস্টলেশন সহ আসে। পাত্রে না থাকলে অন্য বিকল্পগুলি ব্যবহার করে দেখুন।
রুইফেং মা

3

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে কেবল কেউ যদি এ নিয়ে হোঁচট খায় (যেমন এখন আমার কাছে রয়েছে), এটি করার আরও অনেক ভাল উপায় আছে। যেহেতু ডকার লিঙ্কযুক্ত ধারকটির নাম / ইত্যাদি / হোস্টগুলিতে সন্নিবেশ করায় আপনি কেবল এটি করতে পারেন

upstream upstream_name {
    server docker_link_alias;
}

আপনার ডকার কমান্ড ধরে নেওয়া এমন কিছু docker run --link othercontainer:docker_link_alias nginx_container


1
আপনি পোর্টটি নয় তবে এই পদ্ধতিটি ব্যবহার করে হোস্টটি পেতে পারেন। আপনাকে বন্দরটি হার্ড কোড করতে হবে বা ধরে নিতে হবে এটি 80 বন্দরটি ব্যবহার করছে।
বেন হোয়ালি

2

অন্য বিকল্প ... আমি এই সরঞ্জামটি আজই সন্ধান করেছি: https://github.com/kreuzwerker/envplate ... Go এ লিখিত, এটি খুব সহজেই ইনস্টল করা যায়। এটি ব্যবহার করা বেশ সহজ। যদিও আপনাকে আপনার nginx.conf এ টেম্পলেট ভেরিয়েবলগুলি রাখতে হবে।

উদাহরণস্বরূপ ${SOME_ENV_VAR}প্রতিস্থাপন করা হবে যখন ফাইলটিতে envplate এর epকমান্ড কল করা হবে। সুতরাং আপনার ডকফাইফিল যদি সেই বাইনারি পেতে ব্যর্থ হয় বা এটি কোনও কারণে চালিত না হয় তবে এটি আপনার কনফিগারটিকে অবৈধ রাখবে। পার্ল বা লুয়া এক্সটেনশান ব্যবহারের মতো অন্যান্য সমাধানের সাথে তুলনায় কেবলমাত্র একটি সামান্য নোট।

পরিবেশগত পরিবর্তনশীল সেট না করা অবস্থায় আপনি কীভাবে ডিফল্ট মানগুলি সেট করতে পারেন তা আমি সত্যিই পছন্দ করি। যাত্রা। ${SOME_ENV_VAR:default-value}(এবং আপনি মানগুলি থেকে বাঁচতে পারেন)। আবার, এনভ্লেট অবশ্যই সফলভাবে চালানো উচিত।

এর মতো পদ্ধতির ব্যবহারের একটি সুবিধা হ'ল আপনি প্রয়োজনের চেয়ে বড় কোনও ডকার ইমেজটি শেষ করবেন না কারণ আপনি যে সমস্ত ধরণের অতিরিক্ত মডিউলগুলির প্রয়োজন নেই যা আপনি ইনস্টল করে গেছেন। জিনিসগুলি জটিল হয়ে উঠতে শুরু করে এবং এতে ডিফল্ট মান কার্যকারিতা থাকলে সেড ব্যবহার করা আরও সহজ হতে পারে।


আমি github.com/gliderlabs/sigil কে পরামর্শ দিচ্ছি কারণ আমি এনভপ্লেট নিয়ে অনেকগুলি বাগ এবং সমস্যার মধ্যে পড়েছি।
নিক

2

আমি এটি শেল স্ক্রিপ্ট ব্যবহার করে সম্পন্ন করি।

এখানে এনগিনেক্স টেমপ্লেট রয়েছে:

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

আর একটি সম্ভাবনা হ'ল নিয়মিত এক্সপ্রেশন সহ 'সেড' কমান্ডটি ব্যবহার করা, তারপরে আপনাকে আপনার কনফিগারেশন ফাইলগুলিতে কোনও ঝামেলা করতে হবে না! এইভাবে আপনি আপনার কনফিগার ফাইলগুলি সাধারণত ব্যবহার করতে পারেন তবে আপনি যখন ডকার চালাবেন তখন এটি এনভির ভেরিয়েবলগুলির সাথে মানগুলি স্যুপ আউট করবে। এর কোনওটিই "আপনার কনফিগারেশন ফাইলগুলিতে পাঠ্যের একটি স্ট্রিং যুক্ত করে যা আপনি অনুসন্ধান এবং প্রতিস্থাপন করেছেন।"

আপনি আপনার পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে প্রতিস্থাপনের মানগুলির সাথে একটি রান.শ ফাইল তৈরি করতে পারেন।

এই লাইনে "7s" পরিবর্তন করতে:

client_body_timeout 7s;         #Default 60s

সেড কমান্ড ক্লায়েন্ট_বডি_টাইমআউটকে সন্ধান লাইন হিসাবে এবং $ ক্লায়েন্ট_বডি_টাইমআউট প্রতিস্থাপন এনভ ভেরিয়েবল হিসাবে ব্যবহার করে :

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

আপনি কনফিগার বিকল্পের সাথে ক্লায়েন্ট_বডি_টাইমআউট সেট করতে এবং পরিবর্তিত করতে চান এমন প্রতিটি প্যারামিটারের জন্য এই লাইনটি অনুলিপি / আটকান এবং with client_body_Timeout এর সাথে সম্পর্কিত এনভির সাথে পরিবর্তনশীল। বিদ্যমান কনফিগারেশন ফাইল ব্যবহার করুন এবং এটি ঠিক কাজ করবে।


0

এখানে sedপদ্ধতির ব্যবহারের উদাহরণ রয়েছে , অগত্যা আরও ভাল নয় তবে এটি কারওর পক্ষে কার্যকর হতে পারে। প্রথমে কনফ ফাইলের মধ্যে প্রতিস্থাপনের জন্য একটি কাস্টম কীওয়ার্ড যুক্ত করুন। দ্বিতীয়ত, একটি ডকফায়াইল তৈরি করুন যা একটি ENVভেরিয়েবল ঘোষণা করে এবং তারপরে এনজিনেক্স স্পষ্টভাবে চালানোর আগে কনফিগারেশন সম্পাদনা CMDকরতে ব্যবহার sedকরে।

সুতরাং ধরুন আপনার ডিফল্ট.কনফে এতে কীওয়ার্ডটি রয়েছে 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;
}


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.