ডকার - পৃথকভাবে স্কেলিং এনজিনেক্স এবং পিএইচপি-এফএমপি


11

আমি ডকার এবং ডকার-রচনা নিয়ে প্রায় খেলছি এবং একটি প্রশ্ন আছে।

বর্তমানে আমার ডকার-কমপোজ.আইএমএল দেখতে এমন দেখাচ্ছে:

app:
    image: myname/php-app
    volumes:
        - /var/www
    environment:
        <SYMFONY_ENVIRONMENT>: dev

web:
    image: myname/nginx
    ports:
        - 80
    links:
        - app
    volumes_from:
        - app

অ্যাপটিতে 9000 পোর্ট এবং আমার অ্যাপ্লিকেশন কোডটিতে php-fpm রয়েছে pm ওয়েবটি কনফিগারেশনের কয়েকটি বিট সহ এনগিনেক্স।

এই ফাংশনটি আমি কীভাবে এটির প্রত্যাশা করব তবে এনজিঞ্জকে পিএইচপি-এফপিএম-এর সাথে সংযুক্ত করার জন্য আমার এই লাইনটি রয়েছে:

fastcgi_pass    app:9000;

আমি কীভাবে এটি কার্যকরভাবে স্কেল করতে পারি? যদি আমি চাইতাম, উদাহরণস্বরূপ, একটি এনগিনেক্স কনটেইনার চলমান থাকলেও তিনটি অ্যাপ কন্টেইনার চালু রয়েছে তবে অবশ্যই আমি অবশ্যই তিনটি পিএইচপি-এফপিএম এর উদাহরণ পাব 9000 বন্দরে শুনার চেষ্টা করছি।

আমি কীভাবে আলাদা আলাদা বন্দরে প্রতিটি পিএইচপি-এফপিএম ইনস্ট্যান্স রাখতে পারি তবে এখনও জানতে পারি যে তারা যে কোনও সময় আমার এনগিনেক্স কনফিগারেশনে রয়েছে?

আমি কি ভুল পন্থা নিচ্ছি?

ধন্যবাদ!

উত্তর:


5

একটি সমাধান হ'ল আপনার ডকার-কমপোজ ফাইলটিতে অতিরিক্ত পিএইচপি-এফপিএম দৃষ্টান্ত যুক্ত করুন এবং তারপরে লোড-ব্যালেন্সের অন্যান্য উত্তরগুলিতে উল্লিখিত একটি এনগিনেক্স প্রবাহ ব্যবহার করুন। এটি উদাহরণস্বরূপ ডকার-কম্পোজ রেপোতে করা হয়: https://github.com/iamyojimbo/docker-nginx-php-fpm/blob/master/nginx/nginx.conf#L137

upstream php {
    #If there's no directive here, then use round_robin.
    #least_conn;
    server dockernginxphpfpm_php1_1:9000;
    server dockernginxphpfpm_php2_1:9000;
    server dockernginxphpfpm_php3_1:9000;
}

এটি সত্যিই আদর্শ নয় কারণ আপনার স্কেল আপ বা ডাউন করতে চাইলে এর জন্য এনজিনেক্স কনফিগারেশন এবং ডকার-কমপোজ.আইএমএল পরিবর্তন করা দরকার।

মনে রাখবেন যে 9000 পোর্টটি ধারকটির অভ্যন্তরীণ এবং আপনার প্রকৃত হোস্ট নয়, তাই 9000 পোর্টে আপনার একাধিক পিএইচপি-এফপিএম কনটেইনার রয়েছে তা বিবেচ্য নয়।

ডকার এই শরত্কালে টুটুমকে অর্জন করেছিলেন। তাদের এমন একটি সমাধান রয়েছে যা একটি লোড-ব্যালেন্সার কনফিগারেশনটি লোড-ব্যালেন্সিংয়ের সাথে চলমান পাত্রে স্বয়ংক্রিয়ভাবে লোড-ব্যালান্সারের সমন্বয় করতে তাদের এপিআই সহ একটি HAProxy ধারককে একত্রিত করে। এটি একটি দুর্দান্ত সমাধান। তারপরে nginx লোড-ব্যালেন্সারের জন্য নির্ধারিত হোস্টনামে নির্দেশ করে। সম্ভবত ডকার টুটম অধিগ্রহণের পরে এই ধরণের সমাধানটি তাদের সরঞ্জামগুলিতে আরও সংহত করবে। এটি সম্পর্কে এখানে একটি নিবন্ধ রয়েছে: https://web.archive.org/web/20160628133445/https://support.tutum.co/support/solitions/articles/5000050235-load-balancing-a-web-service

টুটুম বর্তমানে একটি প্রদত্ত পরিষেবা। রঞ্চার একটি ওপেন-সোর্স প্রকল্প যা অনুরূপ লোড-ব্যালান্সিং বৈশিষ্ট্য সরবরাহ করে। তাদের একটি "রানার-কমপোজ.আইএমএল" রয়েছে যা ডকার-কমপোজ.আইএমএল-এ সার্ভিস সেটআপের লোড-ব্যালেন্সিং এবং স্কেলিং সংজ্ঞায়িত করতে পারে। http://rancher.com/the-maजिक-- ome-

আপডেট 2017/03/06: আমি ইন্টারলক নামক একটি প্রকল্প ব্যবহার করেছি যা ডকারের সাথে কাজ করে স্বয়ংক্রিয়ভাবে nginx কনফিগারেশন আপডেট করে আবার চালু করতে। এছাড়াও @ আইওয়াসেটেনবিগ্রুয়ের উত্তর দেখুন যাতে অতিরিক্ত পন্থা রয়েছে।


1

আপনি এখানে বর্ণিত হিসাবে একাধিক ব্যাকেন্ডের সংজ্ঞা দিতে একটি প্রবাহ ব্যবহার করতে পারেন:

/programming/5467921/how-to-use-fastcgi-next-upstream-in-nginx

আপনি যখনই নতুন ব্যাক-এন্ড ডাইস / সার্ভিসে এ জাতীয় কিছু নিয়ে আসতে পারেন তখন আপনি কনফিগারটি আপডেট করতে চান:

https://github.com/kelseyhightower/confd


0

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

এটি করার জন্য আমি একটি ছোট স্ক্রিপ্ট লিখেছি (নীচে আটকানো), যা স্বয়ংক্রিয়ভাবে ডিএনএস রেকর্ড আপডেট করে যার পাত্রে নাম হিসাবে একই নাম রয়েছে এবং সেগুলি পাত্রে আইপি ঠিকানার দিকে নির্দেশ করে:

#!/bin/bash

# 10 seconds interval time by default
INTERVAL=${INTERVAL:-10}

# dnsmasq config directory
DNSMASQ_CONFIG=${DNSMASQ_CONFIG:-.}

# commands used in this script
DOCKER=${DOCKER:-docker}
SLEEP=${SLEEP:-sleep}
TAIL=${TAIL:-tail}

declare -A service_map

while true
do
    changed=false
    while read line
    do
        name=${line##* }
        ip=$(${DOCKER} inspect --format '{{.NetworkSettings.IPAddress}}' $name)
        if [ -z ${service_map[$name]} ] || [ ${service_map[$name]} != $ip ] # IP addr changed
        then
            service_map[$name]=$ip
            # write to file
            echo $name has a new IP Address $ip >&2
            echo "host-record=$name,$ip"  > "${DNSMASQ_CONFIG}/docker-$name"
            changed=true
        fi
    done < <(${DOCKER} ps | ${TAIL} -n +2)

    # a change of IP address occured, restart dnsmasq
    if [ $changed = true ]
    then
        systemctl restart dnsmasq
    fi

    ${SLEEP} $INTERVAL
done

তারপরে, ইন্টারফেসে হোস্টের আইপি ঠিকানাটি --dns host-ip-addressকোথায় রয়েছে তা দিয়ে আপনার এনগিনেক্স ধারকটি শুরু করুন ।host-ip-addressdocker0

আপনার এনগিনেক্স কনফিগারেশনের নামগুলি গতিময়ভাবে সমাধান করা উচিত:

server {
  resolver host-ip-address;
  listen 80;
  server_name @server_name@;
  root /var/www/@root@;
  index index.html index.htm index.php;

  location ~ ^(.+?\.php)(/.*)?$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$1;
    set $backend "@fastcgi_server@";
    fastcgi_pass $backend;
  }
}

তথ্যসূত্র:

যদি আপনার এনজিনেক্স এবং পিএইচপি-এফপিএম বিভিন্ন হোস্টে থাকে তবে আপনি @ স্মাজের উত্তর চেষ্টা করতে পারেন।


0

আর একটি উপায় হতে পারে কনসাল-টেমপ্লেটের মতো কোনও কিছু অনুসন্ধান করা ।

এবং অবশ্যই, এক পর্যায়ে, কুবারনেটস উল্লেখ করার প্রয়োজন হতে পারে।

তবে, ডকার ইভেন্টগুলি আপনার জন্য কী কী উপকার করতে পারে তা দেখে (আপনি docker events --since 0একটি দ্রুত নমুনার জন্য দৌড়াতে পারেন ) আপনি আরও কিছুটা 'স্ট্রিং এবং নালী টেপের বিট' বিবেচনা করতে পারেন ।

এই ঘটনাগুলি দেখার জন্য একটি স্ক্রিপ্ট পাওয়া যুক্তিসঙ্গত হবে (মনে রাখবেন, পাইথন, গো, ইত্যাদি সহ কয়েকটি ক্লায়েন্ট প্যাকেজ উপলব্ধ রয়েছে), একটি কনফিগার ফাইল সংশোধন করে, এবং এনজিনেক্স পুনরায় লোড করা (যেমন কনসাল-টেম্পলেট পদ্ধতির ব্যবহার করে, তবে কনসাল প্রয়োজন ছাড়াই)।

আপনার মূল ভিত্তিতে ফিরে যেতে, যদিও: যতক্ষণ না আপনার পিএইচপি-এইচপিএম কনটেইনারগুলি তাদের নিজস্ব নেটওয়ার্ক দিয়ে শুরু করা হয় (যেমন অন্য কনটেইনারটি ভাগ করবেন না, যেমন এনগিনেক্স এক), তারপরে আপনি পোর্টে যতগুলি পাত্রে শুনতে পাচ্ছেন 9000 যেমন আপনি চান - যেমন প্রতি কন্টেইনার আইপি রয়েছে, পোর্টগুলি 'সংঘর্ষ' নিয়ে কোনও সমস্যা নেই।

আপনি কীভাবে এটি স্কেল করবেন তা নির্ভর করে আপনার চূড়ান্ত লক্ষ্য / ব্যবহার-কেসের ক্ষেত্রে নির্ভর করবে তবে আপনি যে বিষয়টিকে বিবেচনা করতে পারেন তা হ'ল এনজিনেক্স এবং আপনার পিএইচপি-এফএমপি নোডের মধ্যে এইচআরসি স্থাপন করা। এটি আপনাকে অনুমতি দিতে পারে এমন একটি জিনিস হ'ল কেবল docker networkআপনার পিএইচপি-এফএমপি সার্ভারের জন্য (এবং সম্ভবত একটি তৈরি করতে ) একটি মনোনীত করুন এবং এই রেঞ্জের মধ্যে কোনও আইপি ব্যাকএন্ড হিসাবে ব্যবহার করার জন্য এইচআরপক্সি কনফিগার করা হয়েছে । যেহেতু এইএএপ্রসিটির স্বাস্থ্য পরীক্ষা রয়েছে, এটি দ্রুত কোন ঠিকানাগুলি লাইভ রয়েছে তা সনাক্ত করতে পারে এবং সেগুলি ব্যবহার করতে পারে।

এনজিএনএক্স বনাম হ্যাপ্রোক্সি কীভাবে আপস্ট্রিমগুলি নিয়ে কাজ করে সে সম্পর্কে আলোচনার জন্য /programming/1358198/nginx-removing-upstream-servers-from-pool দেখুন ।

যতক্ষণ না আপনি এই জন্য একটি ডেডিকেটেড Docker নেটওয়ার্ক ব্যবহার করা হয়েছে, আপনি পারে আপনার পিএইচপি-FPM নোড জন্য কিছু ম্যানুয়াল আইপি ব্যবস্থাপনা করতে হবে।


0

যদিও এই পোস্টটি ২০১৫ সালের এবং আমি অনুভব করছি যে আমি নেক্রোইং করছি (দুঃখিত সম্প্রদায়), সময় মতো এই মুহুর্তে যোগ করা মূল্যবান বলে মনে করি:

আজকাল (এবং যেহেতু কুবারনেটস উল্লেখ করা হয়েছিল) আপনি যখন ডকারের সাথে কাজ করছেন আপনি এই সমস্যা সমাধানের জন্য খুব সহজেই কুবেরনেটস বা ডকার সোর্ম ব্যবহার করতে পারেন। উভয় অর্কেস্টেটর আপনার ডকার নোডগুলি নেবে (এতে ডকার সহ একটি নোড = একটি সার্ভার) এবং আপনি তাদের পরিষেবাগুলি স্থাপন করতে পারেন এবং তারা ওভারলে নেটওয়ার্কগুলি ব্যবহার করে আপনার জন্য পোর্ট চ্যালেঞ্জ পরিচালনা করবে।

যেহেতু আমি ডকার জলাভূমিতে আরও পারদর্শী, আপনি এই সমস্যার সাথে যোগাযোগ করার জন্য এটি কীভাবে করবেন (ধরে নিবেন যে আপনার কাছে একটি একক ডকার নোড রয়েছে):

জলা শুরু করুন:

docker swarm init

আপনার প্রকল্পের মূল সিডি

cd some/project/root

আপনার ডকার-কমপোজ.আইএমএল থেকে একটি জলাবদ্ধ স্ট্যাক তৈরি করুন (ডকার-রচনা ব্যবহারের পরিবর্তে):

docker stack deploy -c docker-compose.yml myApp

এটি "মাই অ্যাপ" নামে একটি ডকার সুইর্ম সার্ভিস স্ট্যাক তৈরি করবে এবং আপনার জন্য পোর্টগুলি পরিচালনা করবে। এর অর্থ: আপনার ডকার-কমপোজ ফাইলটিতে আপনার পিএইচপি-এফএমপি সার্ভিসে আপনাকে কেবল একটি "পোর্ট: 9000: 9000" সংজ্ঞা যুক্ত করতে হবে এবং তারপরে আপনি পিএইচপি-এফপিএম পরিষেবাটি স্কেল করতে পারবেন, 3 টি উদাহরণ বলুন, যখন জলাবদ্ধতাটি হবে আর কোনও কাজের প্রয়োজন ছাড়াই অটো-ম্যাজিকালি তিনটি দৃষ্টান্তের মধ্যে অনুরোধগুলি লোড-ব্যালেন্স করে।

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