архитектура для нескольких приложений 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 контейнер php-fpm с несколькими томами внутри и несколькими серверами nginx
- 1 сервер nginx и несколько контейнеров php-fpm?
- имейте по 1 контейнеру на проект и храните nginx/php-fpm внутри этого контейнера
- X nginx containers + X php-fpm containers. X количество приложений.
Любой идеи?
2 ответов:
Вам понадобится только 1 контейнер nginx на хост, и используйте его для балансировки нагрузки между вашими контейнерами php. Если вы правильно настроили политику перезапуска для контейнера nginx, он должен всегда работать, и nginx может обрабатывать много нагрузки, поэтому только один должен быть в порядке.
Также становится сложнее управлять, когда у вас есть более одного nginx, так как только один контейнер может привязываться к портам 80 и 443 одновременно, и вам понадобится что-то перед двумя контейнерами nginx для балансировки нагрузки в таком случае, между ними. Если вы хотите избыточности, вы можете добавить другой хост с той же самой точной настройкой, балансировкой нагрузки между хостами.
1 БД контейнер с томами для данных-это хорошо.
По крайней мере 1 PHP контейнер, в идеале более одного, но зависит от вашей загрузки. Если вы планируете изменять данные (файлы php) в контейнерах (не рекомендуется) во время выполнения, то убедитесь, что вы используете том и разделяете его между всеми контейнерами php.
Имейте баланс нагрузки nginx между контейнеры php и убедитесь, что политика перезапуска для контейнеров php настроена правильно.
Если вам нужно обновить образы контейнеров php, это делает его проще, если у вас есть более одного, то вы можете сделать переходящее обновление без простоев.
- потяните вниз новый образ
- остановить контейнер php1, начать с нового образа
- остановить контейнер 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