[PHP] php-fpm, nginx 도커 빌드

natae·2022년 9월 5일
0

PHP

목록 보기
1/1

개요

  • 도커로 php-fpm, nginx를 각각 다른 컨테이너에 세팅할 경우, 어떻게 요청을 전달하는지 확인
  • docker-compose는 사용하지 않음

과정

  1. php-fpm 세팅
    1) php 소스 파일

    // php7.4/src/index.php
    <?php
    echo "php-fpm";
    ?>
    
    // php7.4/src/test_php.php
    <?php
    echo "test php-fpm";
    ?>

    2) 도커 파일

    FROM php:7.4-fpm
    
    COPY src/ /var/www/html/
    
    EXPOSE 9000
    
    ENTRYPOINT ["docker-php-entrypoint", "php-fpm"]
  2. nginx 세팅
    1) nginx 설정 파일

    # nginx/default.conf
    server {
          listen 80;
          root /var/www/html;
          index index.html index.htm index.php;
    
          server_name localhost;
    
      	  error_log  /var/log/nginx/error.log;
    	  access_log /var/log/nginx/access.log;
    
          location ~ \.php$ {
                  try_files $uri =404;
                  fastcgi_split_path_info ^(.+\.php)(/.+)$;
                  fastcgi_pass php:9000; 
                  fastcgi_index index.php;
                  include fastcgi_params;
                  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                  fastcgi_param PATH_INFO $fastcgi_path_info;
          }
    }

    2) php 소스 파일

    // nginx/src/index.php
    <?php
    echo "nginx";
    ?>
    
    // nginx/src/test_nginx.php
    <?php
    echo "test nginx";
    ?>

    3) 도커 파일

    FROM nginx:latest
    
    COPY default.conf /etc/nginx/conf.d/default.conf
    COPY src/ /var/www/html/
    
    EXPOSE 80
    
    ENTRYPOINT ["nginx","-g","daemon off;"]
    
  3. 빌드 및 실행

# 호스트이름으로 통신하기 위한 bridge 네트워크 생성
$ docker network create internal

# php-fpm 빌드
$ cd ~/php7.4
$ docker build -t php:1 .

# nginx 빌드
$ cd ~/nginx
$ docker build -t nginx:1 .

# 실행
$ docker run --network internal --name php -d -it -p 9000:9000 php:1
$ docker run --network internal --name nginx -d -it -p 80:80 nginx:1
  1. 테스트
curl 127.0.0.1/index.php
php-fpm

curl 127.0.0.1/test_php.php
404 Not Found ... nginx/1.23.1

curl 127.0.0.1/test_nginx.php
File not found.

결론

  • nginx가 80 포트로 http 요청을 받아, 호스트이름 "php" 및 9000 포트로 포워딩 (php:9000)
  • nginx, php-fpm 이미지에 각각 동일한 php 소스를 복사해야함
    • 양쪽에 모두 존재할 경우 -> php-fpm 소스 실행
    • php-fpm에만 존재할 경우 -> nginx 404 Not Found 에러
    • nginx에만 존재할 경우 -> "File not found" 출력

참고문헌

profile
서버 프로그래머

0개의 댓글