Docker - nginx ve php-fpm'yi ayrı ayrı ölçekleme


11

Docker ve docker-compose ile oynuyorum ve bir sorum var.

Şu anda benim docker-compose.yml şöyle görünüyor:

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

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

Uygulama port 9000 ve uygulama kodumda php-fpm içerir. Web birkaç bit yapılandırma ile nginx.

Bu nasıl ben ancak php-fpm için nginx bağlamak için beklenir bu fonksiyonları var:

fastcgi_pass    app:9000;

Bunu nasıl etkili bir şekilde ölçekleyebilirim? Örneğin, bir nginx konteynerinin çalışmasını ancak üç uygulama kapsayıcısının çalışmasını istiyorsanız, o zaman mutlaka hepsi 9000 numaralı bağlantı noktasını dinlemeye çalışan üç php-fpm örneğine sahip olacağım.

Nasıl her php-fpm örneği farklı bir bağlantı noktasında olabilir ama yine de herhangi bir zamanda nginx yapılandırma nerede olduklarını biliyorum?

Yanlış yaklaşımı mı kullanıyorum?

Teşekkürler!

Yanıtlar:


5

Bir çözüm, docker-compose dosyanıza ek php-fpm örnekleri eklemek ve daha sonra aralarındaki yük dengesini sağlamak için diğer yanıtlarda belirtildiği gibi bir nginx yukarı akışını kullanmaktır. Bu, bu docker-compose repo örneğinde yapılır: 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;
}

Bu gerçekten ideal değildir, çünkü ölçeklendirmek veya küçültmek istediğinizde nginx config ve docker-compose.yml öğelerini değiştirmeniz gerekir.

9000 bağlantı noktasının kapsayıcıda olduğunu ve gerçek ana makinenizi değil, bu nedenle 9000 bağlantı noktasında birden çok php-fpm kapınızın olması önemli değildir.

Docker bu sonbaharda Tutum'u satın aldı. Yük dengeleyici yapılandırmasını yük dengeleyici olan çalışan konteynerlere otomatik olarak ayarlamak için bir HAProxy kabını api'leriyle birleştiren bir çözüme sahiptirler. Bu güzel bir çözüm. Ardından nginx, yük dengeleyiciye atanan ana bilgisayar adını gösterir. Belki de Docker, Tutum alımını takiben bu tür bir çözümü kendi araçlarına entegre edecektir. Burada bir makale var: https://web.archive.org/web/20160628133445/https://support.tutum.co/support/solutions/articles/5000050235-load-balancing-a-web-service

Tutum şu anda ücretli bir hizmettir. Rancher, benzer bir yük dengeleme özelliği sağlayan açık kaynaklı bir projedir. Ayrıca, docker-compose.yml'deki hizmetler kurulumunun yük dengeleme ve ölçeklendirmesini tanımlayabilen bir "rancher-compose.yml" de vardır. http://rancher.com/the-magical-moment-when-container-load-balancing-meets-service-discovery/ http://docs.rancher.com/rancher/concepts/#load-balancer

GÜNCELLEME 2017/03/06: nginx yapılandırmasını otomatik olarak güncellemek ve yeniden başlatmak için Docker ile birlikte çalışan interlock adlı bir proje kullandım . Ayrıca iwaseatenbyagrue en @ bkz cevap ek yaklaşımlar vardır.



0

Nginx ve php-fpm kapsayıcılarınızın aynı ana bilgisayarda olması durumunda, ana bilgisayarda Nginx kapsayıcısı tarafından kullanılacak küçük bir dnsmasq örneği yapılandırabilir ve kabın IP adresi olduğunda DNS kaydını otomatik olarak güncelleştirmek için bir komut dosyası çalıştırabilirsiniz. değişti.

Kapsayıcı adıyla aynı ada sahip DNS kaydını otomatik olarak güncelleyen ve bunları kapsayıcıların IP adreslerine yönlendiren küçük bir komut dosyası yazdım (aşağıda yapıştırıldı):

#!/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

Ardından, ile nginx konteyner başlatmak --dns host-ip-address, host-ip-addressarabirimde ana bilgisayarın IP adresidir docker0.

Kişisel Nginx yapılandırma dinamik isimleri çözmelidir:

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

Referanslar:

Nginx ve php-fpm'niz farklı ana bilgisayarlardaysa @ smaj'ın yanıtını deneyebilirsiniz.


0

Başka bir yaklaşım konsül şablon gibi bir şeye bakmak olabilir .

Ve elbette, bir noktada Kubernetes'ten bahsetmek gerekebilir.

Bununla birlikte, docker olaylarının sizin için neler yapabileceğini inceleyerek biraz daha 'dize ve koli bandı' yaklaşımını düşünebilirsiniz ( docker events --since 0hızlı bir örnek için çalıştırın ).

Bu olaylara bakan bir komut dosyasının olması (python, go, vb. Dahil olmak üzere birçok istemci paketi bulunduğunu aklınızda bulundurmak), bir yapılandırma dosyasını değiştirmek ve nginx'i yeniden yüklemek (yani konsül şablonu şablonu, ancak konsüllere ihtiyaç duymadan).

Orijinal tesisinize geri dönmek için: php-fpm konteynırlarınız kendi ağlarıyla başlatıldığı sürece (yani nginx olanı gibi başka bir konteynerin paylaşımını paylaşmadığı sürece), bağlantı noktasında dinlediğiniz kadar çok kabınız olabilir İstediğiniz gibi 9000 - kapsayıcı başına IP'leri olduğu için, bağlantı noktalarında 'çakışma' sorunu yoktur.

Bunu nasıl ölçeklendireceğiniz büyük olasılıkla nihai hedefinizin / kullanım durumunuzun ne olduğuna bağlı olacaktır, ancak düşünebileceğiniz bir şey, nginx ile php-fpm düğümlerinizin arasına HAproxy yerleştirmektir. Bunun yapmanıza izin verebileceği bir şey docker network, php-fpm sunucularınız (örneğin 172.18.0.0/24) için bir aralık atamak (ve muhtemelen a oluşturmak ) ve HAproxy'nin bu aralıktaki herhangi bir IP'yi arka uç olarak kullanacak şekilde yapılandırmaktır . HAproxy'nin sağlık kontrolleri olduğundan, hangi adreslerin canlı olduğunu hızlı bir şekilde belirleyebilir ve bunlardan faydalanabilir.

Nginx ve haproxy'nin yukarı akışlarla nasıl başa çıktığıyla ilgili bir tartışma için /programming/1358198/nginx-removing-upstream-servers-from-pool adresine bakın .

Bunun için özel bir liman işçisi ağı kullanmadığınız sürece , php-fpm düğümleriniz için bazı manuel IP yönetimi yapmanız gerekebilir .


0

Bu yazı 2015 yılından beri ve necroing olduğumu hissediyorum (üzgünüm topluluk), bu zamanda eklemenin değerli olduğunu hissediyorum:

Günümüzde (ve Kubernetes'ten bahsedildiği için) Docker ile çalışırken bu sorunu çözmek için Kubernetes veya Docker Swarm'ı çok kolay bir şekilde kullanabilirsiniz. Her iki orkestratör de docker düğümlerinizi alacaktır (bir düğüm = üzerinde Docker bulunan bir sunucu) ve onlara hizmet dağıtabilirsiniz ve bunlar yer paylaşım ağlarını kullanarak bağlantı noktası zorluklarını yönetecektir.

Docker Swarm'da daha tecrübeli olduğum için, bu soruna (tek bir Docker düğümüne sahip olduğunuzu varsayarak) yaklaşmak için bunu nasıl yapacaksınız:

Sürüyü başlatın:

docker swarm init

proje köküne cd

cd some/project/root

docker-compose.yml dosyasından bir sürü yığını oluşturun (docker-compose kullanmak yerine):

docker stack deploy -c docker-compose.yml myApp

Bu, "myApp" adlı bir liman işçiliği sürüsü hizmet yığını oluşturur ve bağlantı noktalarını sizin için yönetir. Bu şu anlama gelir: docker-compose dosyanızdaki php-fpm hizmetinize yalnızca bir "port: 9000: 9000" tanımı eklemeniz gerekir ve daha sonra php-fpm hizmetini, örneğin 3 örneğe kadar ölçeklendirebilirsiniz. herhangi bir ek çalışmaya gerek kalmadan üç örnek arasındaki istekleri otomatik olarak yük dengeleme.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.