архитектура для нескольких приложений nginx / php с помощью docker



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



Но я не могу поверить, что у меня так много экземпляров 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-proxy вместе с nginx-certs работают следующим образом очарование:



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 containers + X php-fpm containers. X количество приложений.


Любой идеи?

639   2  

2 ответов:

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

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

1 БД контейнер с томами для данных-это хорошо.

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

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

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

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

Готово, переходное обновление без простоев.

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

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

Я никогда не использовал php-fpm, но doc здесь поможет вам, я думаю: https://hub.docker.com/r/bitnami/php-fpm/ они объясняют, как настроить nginx в отдельном контейнере для содержимого сервера из "голого" контейнера php-fpm, вам нужно только повторить этот шаг для каждого контейнера php-fpm, но сохранить тот же контейнер nginx. Решение 2, кажется, способ пойти, то nginx-прокси может быть как на прокси-сервере и работы с ним (сохраняя Conf в одном месте), поэтому , что nginx-прокси + nginx, и сертификаты + Н php-fpm .

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

Edit

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

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

Автоматически сгенерированный дефолт.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, поэтому не знаю, в чем может быть проблема. Мой индекс.php-это простой <?php echo "hello world!" ?>.

Comments

    Ничего не найдено.