>  기사  >  백엔드 개발  >  여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법

여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법

不言
不言원래의
2018-07-09 09:28:522179검색

이 글은 주로 여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.

# 🎜🎜 #최근에는 Docker 컨테이너를 사용하여 PHP 마이크로서비스 세트를 배포하기 위해 열심히 노력하고 있습니다. 문제 중 하나는 PHP 애플리케이션이 (여기에 설명된 간단한 Apache/PHP[1] 설정이 아닌) PHP-FPM 및 Nginx와 작동하도록 설정되어 있으므로 PHP 마이크로서비스마다 두 개의 컨테이너가 필요하다는 것입니다(또한 동일합니다). 두 개의 Docker 이미지로):

  • PHP-FPM 컨테이너

  • Nginx 컨테이너#🎜🎜 ##🎜 🎜#

    애플리케이션이 개발 및 프로덕션 환경을 포함하여 6개 이상의 PHP 마이크로서비스를 실행한다고 가정하면 결국 30개에 가까운 컨테이너가 있게 됩니다. 각 PHP-FPM 마이크로서비스 이미지에 대해 고유한 Nginx 이미지를 구축하는 대신 별도의 Nginx Docker 이미지를 구축하고 PHP-FPM 호스트 이름을 환경 변수로 이 이미지의 고유 구성 파일에 매핑하기로 결정했습니다.

여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법 이번 블로그 게시물에서는 위의 방법 1부터 방법 2까지의 과정을 간략하게 설명하고 사용 방법 소개로 마무리하겠습니다. 이 블로그는 Nginx Docker 이미지를 사용자 정의하기 위한 새로운 솔루션으로 끝납니다.

GitHub[2]에 이 이미지를 오픈소스로 만들어두었으니, 자주 겪는 문제라면 편하게 확인해 보세요.



왜 Nginx인가요?

PHP-FPM과 Nginx를 함께 사용하면 더 나은 PHP 애플리케이션 성능을 낼 수 있지만[3], 단점은 PHP-FPM Docker 이미지가 그렇지 않다는 것입니다. 기본적으로 PHP Apache 이미지처럼 Nginx와 함께 번들로 제공됩니다. 여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법 Nginx 컨테이너를 PHP-FPM 백엔드에 연결하려면 해당 백엔드에 대한 DNS 레코드를 Nginx 구성에 추가해야 합니다.

예를 들어, PHP-FPM 컨테이너가 php-fpm-api라는 컨테이너로 실행 중인 경우 Nginx 구성 파일은 다음과 같아야 합니다.

nginx
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # This line passes requests through www.dongfan178.com to the PHP-FPM container
        fastcgi_pass php-fpm-api:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param www.huayi1.cn/ www.dongfan178.com SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param www.00534.cn PATH_INFO $fastcgi_path_info;
    }

하나의 PHP-FPM만 제공하는 경우 컨테이너 애플리케이션의 경우 Nginx 컨테이너의 구성 파일에 해당 이름을 하드코딩해도 괜찮습니다. 그러나 위에서 언급했듯이 각 PHP 서비스에는 해당 Nginx 컨테이너가 필요하므로 여러 Nginx 컨테이너를 실행해야 합니다. 새로운 Nginx 이미지(나중에 유지 관리하고 업그레이드해야 함)를 만드는 것은 여러 다른 볼륨을 관리하는 것조차 단일 변수 이름을 변경하는 데 해야 할 많은 작업처럼 보이기 때문에 어려울 것입니다.

첫 번째 해결 방법: envsubst 방법 사용

여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법#🎜🎜 #처음에는 그런 줄 알았습니다. 쉬울 것입니다. Docker 문서에는 envsubst[4] 사용 방법에 대한 멋진 작은 장이 있지만 불행히도 내 Nginx 구성 파일에서는 작동하지 않습니다.

vhost.conf

nginx
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    client_max_body_size 32M;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass ${NGINX_HOST}:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

내 vhost .conf 파일은 여러 Nginx 내장 환경 변수를 사용합니다. 결과적으로 Docker 설명서에 언급된 다음 명령줄을 실행하면 $uri 및 fastcgi_script_name이 정의되지 않았습니다.

shell
/bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g &#39;daemon off;&#39;"

이러한 변수는 일반적으로 Nginx 자체에 의해 전달되므로 [5] 해당 변수가 무엇인지, 매개변수를 전달하는 방법을 파악하기가 쉽지 않으며 이는 컨테이너의 동적 구성 가능성에 영향을 미칩니다# 🎜🎜#

거의 성공한 또 다른 Docker 이미지

다음으로 다양한 Nginx 기본 이미지를 검색하기 시작했습니다. 두 개를 찾았는데 둘 다 2년 동안 업데이트가 안 됐어요. 나는 martin/nginx[6]로 시작하여 작동하는 프로토타입을 얻을 수 있는지 알아보려고 했습니다.

마틴의 이미지는 특정 파일 디렉터리 구조가 필요하기 때문에 조금 다릅니다. 먼저 Dockerfile에 추가했습니다.

FROM martin/nginx
여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법다음으로 app/empty 디렉터리와 vhost.conf 파일만 포함된 conf/ 디렉터리를 추가했습니다.

vhost.conf

nginx
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    client_max_body_size 32M;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $ENV{"NGINX_HOST"}:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

이것은 내 원래 구성 파일과 유사하며 한 줄만 수정되었습니다: fastcgi_pass $ENV{"NGINX_HOST"}:9000;. 이제 Nginx 컨테이너와 php-fpm-api라는 PHP 컨테이너를 시작하려면 먼저 새 이미지를 컴파일한 다음 실행 시 해당 환경 변수에 전달할 수 있습니다.

shell
docker build -t shiphp/nginx-env:test .
docker run -it --rm -e NGINX_HOST=php-fpm-api shiphp/nginx-env:test

Success! 하지만 이 방법에는 두 가지 문제가 있습니다.

기본 이미지 버전이 오래되어 2년 넘게 업데이트되지 않았습니다. 이로 인해 보안 및 성능 위험이 발생할 수 있습니다.

  1. 앱에 빈 디렉터리를 요구할 필요가 없는 것 같고 내 파일이 다른 디렉터리에 배치됩니다.

  2. 최종 솔루션

마틴의 거울이 좋은 맞춤형 솔루션인 것 같아요. 그래서 저는 그의 저장소를 포크하고 위의 두 가지 문제를 해결하는 새로운 Nginx 기본 이미지를 구축했습니다. 이제 nginx 컨테이너를 사용하여 동적으로 명명된 백엔드 애플리케이션을 실행하려면 다음을 수행하면 됩니다.

shell
# Pull down the latest from Docker Hub
docker pull shiphp/nginx-env:latest
# Run a PHP container named "php-fpm-api"
docker run --name php-fpm-api -v $(pwd):/var/www php:fpm
# Start this NGinx container linked to the PHP-FPM container
docker run --link php-fpm-api -e NGINX_HOST=php-fpm-api shiphp/nginx-env

如果你想自定义这个镜像,添加你自己的文件或者Nginx配置文件,只需要像下面这样扩展你的Dockerfile:

FROM shiphp/nginx-env
ONBUILD ADD <PATH_TO_YOUR_CONFIGS> /etc/nginx/conf.d/

现在我所有的PHP-FPM容器都使用单个Nginx镜像的实例,当我需要升级Nginx、修改权限或者配置一些东西的时候,这让我的生活变得简单多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP缓存区ob的介绍

如何配置php客户端(phpredis)并连接Redis

使用PHPstudy在Windows服务器下部署PHP系统

위 내용은 여러 PHP-FPM 컨테이너에 대해 단일 Nginx 이미지를 조정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.