2016-04-30 2 views
3

Я использую большинство своих приложений на одной установке nginx/php-fpm непосредственно на vps. Я решил попробовать докеры и играл с ним уже неделю. Я читал все возможное и считаю, что понимаю его концепции.архитектура для нескольких приложений nginx/php с использованием докеров

Но я не могу обмотать голову, имея так много экземпляров nginx, php и db.

Одна вещь, которую я поселился с в том, что я хочу иметь 1 дБ, так что это легко:

mariadb: 
    image: mariadb:latest 
    container_name: mariadb 
    ports: 
    - "127.0.0.1:3306:3306" 
    restart: always 
    environment: 
    MYSQL_ROOT_PASSWORD: xxxxx 
    volumes: 
    - /srv/mysql:/var/lib/mysql 

Я также нашел Nginx прокси вместе с Nginx-сертификаты работать как шарм:

nginx-proxy: 
    image: jwilder/nginx-proxy 
    container_name: nginx-proxy 
    ports: 
    - "80:80" 
    - "443:443" 
    restart: always 
    volumes: 
    - /srv/certs:/etc/nginx/certs:ro 
    - /var/run/docker.sock:/tmp/docker.sock:ro 
    - ./vhost.d:/etc/nginx/vhost.d 
    - /usr/share/nginx/html 


nginx-certs: 
    image: jrcs/letsencrypt-nginx-proxy-companion 
    container_name: nginx-certs 
    volumes: 
    - /srv/certs:/etc/nginx/certs:rw 
    - /var/run/docker.sock:/var/run/docker.sock:ro 
    volumes_from: 
    - nginx-proxy 

Это все денди. Но как я могу обрабатывать реальные контейнеры приложений?

Я хочу, чтобы использование домкрата к минимуму, так что рекомендуется:

  1. 1 PHP-FPM контейнер с несколькими объемами внутри и нескольких серверов Nginx сервер
  2. 1 Nginx и нескольких PHP-FPM контейнеров?
  3. имеют 1 контейнер в проекте и сохраняют nginx/php-fpm внутри этого контейнера
  4. X контейнеры nginx + контейнеры X php-fpm. X количество приложений.

Любые идеи?

ответ

0

Вам нужно только 1 контейнер nginx для каждого хоста и использовать его для загрузки баланса между вашими контейнерами php. Если вы правильно установили политику перезапуска в контейнере nginx, она всегда должна быть запущена, а nginx может обрабатывать большую нагрузку, поэтому только одно должно быть в порядке.

Это также становится сложнее управлять, когда у вас более одного nginx, поскольку только один контейнер может связываться с портами 80 и 443 за раз, и вам понадобится что-то перед двумя контейнерами nginx, чтобы загрузить баланс между ними в таком случае. Если вы хотите избыточность, вы можете добавить еще один хост с той же самой точной настройкой, баланс нагрузки между хостами.

1 контейнер db с томами для данных хорош.

Как минимум 1 контейнер php, в идеале более одного, но зависит от вашей нагрузки. Если вы планируете менять данные (php-файлы) в контейнерах (не рекомендуется) во время работы, то убедитесь, что вы используете тома и делитесь между всеми контейнерами php.

Имейте баланс загрузки nginx между контейнерами php и убедитесь, что политика перезапуска для контейнеров php настроена правильно.

Если вам нужно обновить изображения контейнера php, это упростит, если у вас более одного, то вы можете выполнить скользящее обновление без простоя.

  1. Потяните вниз новое изображение
  2. Стоп php1 контейнер, начните с новым изображением
  3. Стоп php2 контейнер, начните с новым изображением

Done, катящийся обновление без простоев.

Эта настройка работает с одним сайтом или многими. Единственное различие заключается в том, что nginx будет обрабатывать проксирование в правильные контейнеры php на основе имени хоста.

Итак, у вас всегда будет 1 nginx, но контейнеры php будут расти в зависимости от количества сайтов, на которых вы размещаете.

+0

Что касается jwilder/nginx-proxy, насколько я вижу, он не может обращаться напрямую к контейнерам php. поэтому мне нужен другой nginx под jwilder/nginx-proxy правильно? –

+0

Я никогда не использовал этот образ, но я знаю, что официальный nginx поддержит его. Я думаю, они оба могут работать вместе в соответствии с readme, но еще раз я этого никогда не делал. –

+1

Если вы запустите два php-приложения, как предлагает этот ответ, скажите два разных блога WordPress, а затем используя два контейнера 'php-fpm', вы будете иметь два кэша кода операции php с довольно большим количеством дублированных данных (основные файлы Wordpress которые не меняются между приложениями) в ОЗУ (как правило, самый дорогой ресурс в мире VPS). Каков наилучший способ справиться с этим? –

0

Я никогда не пользовался php-fpm, но документ здесь вам поможет: https://hub.docker.com/r/bitnami/php-fpm/ Они объясняют, как настроить nginx в отдельном контейнере на содержимое сервера из «голого» контейнера php-fpm, вам нужно только повторить шаг для каждого контейнера php-fpm, но сохраняющий один и тот же контейнер nginx. Решение 2 похоже на путь, nginx-proxy может быть как прокси, так и интерфейсом (поддерживая conf в одном месте), поэтому nginx-proxy + nginx-certs + N php-fpm.

На стороне записки, вы должны использовать образы, основанные альпийские, они до смешного мало, и приходят только с тем, что вам нужно, например: https://hub.docker.com/r/yavin/alpine-php-fpm/

Редактировать

Я сделал несколько тестов. Вы можете определить собственный conf для виртуального хоста для nginx-proxy. Контейнер php получил запрос, но затем я получил ошибку 502. Обычай конф помещается в /etc/nginx/vhost.d папки с именем myphp.local (myphp.local будучи виртуальным хостом вашего PHP контейнера), он содержит только директиву местоположения:

location ~ \.php$ { 
    fastcgi_pass myphp.local:9000; 
    fastcgi_index index.php; 
} 

автоматически сгенерированное default.conf из Nginx прокси выглядит как:

upstream myphp.local { 
    server 172.17.0.2:9000; 
} 

server { 
    server_name myphp.local; 
    listen 80; 
    include /etc/nginx/vhost.d/myphp.local; 
    location/{ 
     proxy_pass http://myphp.local; 
    } 
} 

Для меня, контейнер PHP должен получать запросы на порт 9000. Но я не знаком с PHP, так что я не знаю, в чем проблема. Мой index.php является простым <?php echo "hello world!" ?>.

+0

Да, я изначально стремился к этому, но я не могу понять, как nginx-proxy можно использовать как интерфейс. Я думаю, что он ничего не может сделать по запросам прокси. –

+0

@salivan Я обновил свой ответ с результатом некоторых тестов. – Shanoor

+0

Я даже не могу дойти до этого. Как вы установили файл .yml? что такое докеры? –

Смежные вопросы