답변:
nginx가 포함 된 PHP는 일반적으로 별도의 프로세스 인 php-fpm을 사용하여 수행됩니다.
컨테이너 당 하나의 프로세스 (이 지점에 대한 자세한 내용은 답변 끝 참조)의 도커에 대한 핵심 아이디어를 유지하면 별도의 컨테이너에 nginx 프로세스와 php-fpm 프로세스가있는 것이 좋습니다.
nginx와 php-fpm 간의 통신이 fastcgi를 통해 발생함에 따라 php-fpm 컨테이너는 분리 된 호스트에있을 수 있으며 이는 nginx 뒤의 php-fpm 컨테이너 클러스터를 사용할 수 있습니다.
여기에 약간의 배경 지식이있는 도커 문서에는 컨테이너에 하나의 관심사가 있어야 한다는 아이디어에 대한 단락 이 있습니다 .
리눅스 컨테이너 ( lxc ) 의 주요 아이디어는 CPU 및 메모리 수준에서 격리 된 네임 스페이스에서 프로세스를 실행하는 것이며, docker는 파일 시스템 수준에서 격리를 추가합니다.
이 네임 스페이스 내에서 프로세스를 승인하면 다른 프로세스의 메모리를 읽을 수 없으므로 호스트에서 다른 허용을 막을 수 있다는 장점이 있습니다.
nginx와 php-fpm에 대해 이야기하는 동안 쌍으로 작동하지만 각각 고유의 관심사를 가지고 있습니다 .nginx는 HTTP 부분, 라우팅, 헤더 유효성 검사 등을 수행하며 php-fpm은 코드 해석을 수행하고 html 부분을 nginx에 반환합니다 . 필수 사항이 아닌 단일 응용 프로그램을 함께 제공하는 것이 일반적입니다.
상황에 따라, 개발자를위한 개발자 워크 스테이션에서 애플리케이션의 전체 스택을 포함하는 컨테이너를 갖는 것이 더 쉬울 수 있습니다. 그러나 생산 용도로 이상적으로는 컨테이너 내부의 적은 상호 작용을 유지하려고 노력하십시오. 관리자와 동일한 컨테이너에서 프로세스를 분리하면 좀비 프로세스 및 로그 처리 측면에서 문제가 발생합니다 ( 예시적인 예시는 여기 에 있습니다).
마지막으로 도커 페이지를 약간 강조하여 인용하겠습니다.
"컨테이너 당 하나의 프로세스"는 일반적으로 좋은 규칙이지만, 어렵고 빠른 규칙은 아닙니다. 용기를 최대한 깨끗하고 모듈 식으로 유지하려면 최선의 판단을하십시오 .
모든 것에 적용되는 "실버 탄환 규칙"은 없으며 항상 컨테이너 내의 복잡성과 컨테이너 자체를 조정하는 복잡성 사이의 균형입니다.
실제로 여기서 누락 된 점은 수평 확장 성입니다. 오래 전에 Jamie Alquiza의 기사 가이 문제를 해결했습니다.
요컨대, 더 높은 성능을 달성하기 위해 php-fpm을 수평으로 확장합니다. Nginx + php-fpm을 함께 확장해도 아무런 이점이 없습니다. 이 기사에서 언급 한 내용을 확인하기 위해 스트레스 테스트 (예 : Tsung, Gatling 등; 아주 오래된 장난감 인 Apache ab를 수행하지 마십시오)를 수행하는 것이 좋습니다. 나는 개인적으로 그 기사가 일반적으로 사실임을 입증하는 몇 가지 실제 경험을 가지고 있습니다.
그러나 베어 메탈 머신 / VM에는 두 가지 단점이 있습니다 (Kubernetes에는 해당되지 않음).
편집 : 이제 2019 년의 거의 절반이되었습니다. 같은 포드에있는 php-fpm + nginx의 이전 모델은 사용법이 다릅니다. 서비스 메시에 익숙한 경우 nginx (또는 Nginmesh)는 동서 경계 트래픽을 처리하는 사이드카 역할을합니다. 동서 경계 트래픽은 주로 서비스 또는 기타 고급 기능 중에서 인증하는 데 사용되었지만 순수한 php-fpm은 그렇게 할 수 없었습니다.
두 컨테이너를 관리해야하는 것보다 중요한 이점은 없습니다. 프로세스간에 1 : 1 관계가 있고 단일 목적으로 사용되는 한 동일한 컨테이너에 넣으십시오.