У меня возникли некоторые концептуальные проблемы с конфигурацией Nginx. Начиная с nginx
SSL-terminator reverse-proxy, я использую docker-compose.yml
настройку с несколькими контейнерами, каждый из которых предоставляет виртуальную службу. Эти службы предоставляются как подкаталоги под одним именем хоста:
net --443--> nginx
| | `--- ContainerA "https://example.com/serviceA/"
| `----- ContainerB "https://example.com/serviceB/"
`------- ContainerC "https://example.com/serviceC/"
Фрагменты списков процессов:
nginx:~$ ps fax
127285 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf -g daemon off;
127419 ? S 0:00 \_ nginx: worker process
127420 ? S 0:00 \_ nginx: worker process
127421 ? S 0:00 \_ nginx: worker process
ContainerA:~$ ps fax
127132 ? Ss 0:09 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
234053 ? S 8:27 \_ php-fpm: pool www
236952 ? S 8:12 \_ php-fpm: pool www
259123 ? S 6:42 \_ php-fpm: pool www
Я думал, что эффективность возрастет, если запустить один экземпляр nginx
и использовать его php-fpm
в каждом из контейнеров.
ядуматьчто предпосылка php-fpm
такова, что контейнерам не нужны собственные nginx
процессы; nginx
процессы взаимодействуют с каждым контейнером через порт 9000 (сетевая часть работает). На практике, однако, у меня возникают проблемы, поэтому мне нужно проверить, что моя предпосылка верна:
Верна ли эта базовая предпосылка nginx
и php-fpm
архитектура?Или же предполагается ли использовать надлежащую инфраструктуру nginx
в прямом взаимодействии (один и тот же хост и файловая система) или разумно и эффективно использовать несколько хостингов/несколько файловых систем?php-fpm
php-fpm
(Недавно я обратился за помощью, и их первым ответом было «вам нужно запустить nginx
в каждом контейнере», что, с моей точки зрения, было бессмыслицей php-fpm
.)
(Здесь много вопросов, которые задают конкретные nginx.conf
вопросы, а не об этой, безусловно, высокоуровневой архитектуре.)
решение1
Это слабый ответ, но я считаю:
Да, это в целом правильная философия, но с некоторыми оговорками. php-fpm
существует для обработки .php
файлов, но я думаю, что не для обслуживания всех (не php) файлов. Для этого фронтальный nginx
процесс должен видеть все файлы, даже если он не выполняет фактическую обработку PHP.
Чтобы это произошло разумно с помощью docker, файлы в php-fpm
контейнере должны быть явно предоставлены в общий доступ к nginx
контейнеру. Предпочтительный способ сделать это в docker — предоставить именованный том и использовать его для обоих контейнеров. Например, файл docker-compose.yml
:
version: '2'
services:
serviceA:
image: ... # something served with php-fpm
volumes:
- tmpvolA:/path/to/serviceA
serviceB:
image: ... # something served with php-fpm
volumes:
- tmpvolB:/path/to/serviceB
nginx:
image: ...
volumes:
- tmpvolA:/var/www/serviceA
- tmpvolB:/var/www/serviceB
volumes:
tmpvolA:
tmpvolB:
(Многие поля не включены...) Два тома, перечисленные в конце, являются «именованными томами», о которых говорит docker, и они пусты по определенной причине: они должны быть пустыми при запуске скрипта и будут заполнены одним из контейнеров. (На самом деле, он может быть заполнен обоими или ни одним из них, в зависимости от нескольких факторов.)
Одним из побочных эффектов этого является то, что объемысопротивляться.
- «Это хорошо» для эффективности, поскольку не создается заново без необходимости.
- "Это плохо", потому что одно из преимуществ виртуализации сервисов заключается в том, что вы можете перезапустить его и гарантированно получить чистый лист. С постоянными именованными томами вы не получаете (автоматически) чистый лист, поскольку файлы, использованные в предыдущем экземпляре, будут использоваться вместо строгой версии в нижнем слое fs.
Обойти это "плохо" можно, очистив тома вручную. Это можно сделать либо при выключении с помощью docker-compose down -v
, что согласно справке:
-v, --volumes Remove named volumes declared in the `volumes` section
of the Compose file and anonymous volumes
attached to containers.
Это также можно сделать вручную с помощью docker volume rm <volume-id>
или docker volume prune
(что удалит все неиспользуемые в данный момент тома, будь то временные, именованные или какие-либо еще).