обратный прокси-сервер nginx к php-fpm

0

У меня возникли некоторые проблемы с конфигурацией Nginx. Начиная с nginx SSL-завершение обратного прокси, я использую 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 вопросы, а не об этой заведомо высокоуровневой архитектуре.)

r2evans
источник

Ответы:

0

Это слабый ответ, но я верю:

да Это в целом правильная философия, но с некоторыми оговорками. php-fpm там для обработки .php файлы, но я думаю, что не для обслуживания всех (не php) файлов. Для этого фронтальная nginx Процесс должен видеть все файлы, даже если он не выполняет фактическую обработку PHP.

Чтобы это происходило с помощью докера, файлы в 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:

(Многие многие поля не включены ...) Два тома, перечисленные в конце, являются «именованными томами», о которых говорит докер, и по какой-то причине они пусты: они должны быть пустыми при запуске сценария и будут быть заполненным одним из контейнеров. (На самом деле, он может быть заполнен обоими или ни одним, в зависимости от нескольких факторов.)

Одним из побочных эффектов этого является то, что объемы упорствовать ,

  • «Это хорошо» для эффективности, потому что оно не воссоздается без необходимости.
  • «Это плохо», потому что одним из преимуществ виртуализированных сервисов является то, что вы можете перезапустить его и получить гарантию на чистую доску. С постоянными именованными томами вы (автоматически) не получите чистый лист, поскольку файлы, использованные в предыдущем примере, будут использоваться вместо строгой версии на нижнем слое 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 (который удаляет все в настоящее время неиспользуемые тома, временные или именованные или что-либо еще).

r2evans
источник