php-fpm, mariadb, nginx and laravel 설치 하기 1 updated_at: 2025-06-17 15:50

php-fpm, mariadb, nginx and laravel 설치 하기1

지난번에서는 nginx를 customize 하여 띄우는 간단한 방법에 대해 기술하였습니다.
오늘은 실제 웹서비스를 구현하는 모든 것을 기술하겠습니다.

PHP-FPM, Nginx, Kubernetes, and Docker

쿠버네티스에서 Nginx와 PHP-FPM을 실행하는 방법에 대한 가이드입니다. 환경의 각 구성 요소에 대한 개요와 쿠버네티스에서 PHP-FPM과 Nginx를 사용하여 애플리케이션을 실행하기 위한 전체 소스 코드를 제공합니다.

Overview

PHP-FPM

PHP는 웹 개발에 사용되는 스크립팅 언어입니다. CGI 스크립트는 서버가 HTTP 요청을 받을 때 서버에서 스크립트를 실행하는 방식입니다. Fast-CGI는 CGI를 개선한 것으로, 네, 더 빠릅니다.

PHP-FPM은 프로세스 관리, 로깅, 트래픽이 많은 상황에 대한 기능이 향상된 PHP용 Fast-CGI 구현입니다.

Nginx

Nginx는 트래픽이 많은 애플리케이션에 널리 사용되는 웹 서버이자 역방향 프록시입니다. PHP-FPM과 함께 실행될 경우, Nginx는 .php 경로에 대한 요청을 PHP-FPM으로 전송하여 페이지를 제공하도록 구성됩니다.

Kubernetes and Docker

쿠버네티스와 도커는 쿠버네티스 클러스터에서 Nginx와 PHP-FPM 프로세스를 실행합니다. 애플리케이션 코드를 포함하는 도커 이미지를 생성하고, 쿠버네티스에서 해당 이미지의 컨테이너를 실행하도록 파드를 구성합니다.

Together

Nginx는 웹 페이지를 제공하고 .php 파일 요청을 PHP-FPM으로 전달합니다. PHP-FPM은 Nginx로부터 요청을 받아 PHP의 동적 처리를 수행하고 결과를 반환합니다. Docker는 애플리케이션을 패키징하고, Kubernetes는 애플리케이션이 제대로 실행되도록 보장합니다.

Solution

PHP-FPM과 Nginx는 파일 시스템의 동일한 파일에 접근할 수 있어야 합니다. 쿠버네티스에서는 두 컨테이너가 동일한 포드(Pod)에서 실행되어야 하며, 볼륨을 사용하여 두 컨테이너 간에 파일을 공유합니다.

php-nginx

첫번째로 간단한 php 및 nginx를 구성해 보겠습ㅋ니다.

Step 1: ConfigMap 작성

ngix-conf.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  default.conf: | #키명 = 파일명, |은 밸류가 멀티라인이라는 뜻
    server {
      listen       80;
      listen  [::]:80;
      server_name  localhost;

      access_log  /var/log/nginx/host.access.log;
      error_log  /var/log/nginx/host.error.log;

      root   /usr/share/nginx/html;
      index   index.php index.html index.htm;

      location ~ \.php$ {
        
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
      }
    }

Step 2: nginx 및 phpfpm 설정

  • pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: nginx-phpfpm
spec:
  volumes:
    # Create the shared files volume to be used in both pods
    - name: shared-files
      emptyDir: {}
    - name: nginx-config-volume
      configMap:
        name: nginx-config
  containers:
    # Our PHP-FPM application
    - image: php:8.2-fpm
      name: phpfpm82
      volumeMounts:
        - name: shared-files
          mountPath: /usr/share/nginx/html
    
    # Our nginx container, which uses the configuration declared above,
    # along with the files shared with the PHP-FPM app.
    - image: nginx:1.27.5
      name: nginx
      volumeMounts:
        - name: shared-files
          mountPath: /usr/share/nginx/html
        - name: nginx-config-volume
          mountPath: /etc/nginx/conf.d

Step3 : 작성된 Yaml create

kubectl create -f .\nginx-conf.yaml
kubectl create -f .\pod.yaml

Step4 : portforwarding

아래 명령어를 이용하여 port forwarding 후 브라우저에서 "127.0.0.1:8888"을 입력하면 현재 생성된 nginx로 접속할 수 있습니다.

kubectl port-forward nginx-phpfpm 8888:80

콘솔접근 및 phpinfo.php 파일 만들기

모든 것이 정상적으로 작동되면 이제 콘솔로 접근하여 phpinfo.php파일을 작성해 보겠습니다.

kubectl exec --stdin --tty nginx-phpfpm --container nginx -- /bin/bash

cd /usr/share/nginx/html
vi phpinfo.php // vi 명령이 동작하지 않으면 apt-get update && apt-get install vim 을 이용하여 vim을 설치합니다.
<?php
phpinfo()
?>

브라우저상에서 127.0.0.1:8888/phpinfo.php 를 입력하면 현재 php 정보가 쭈욱 나열됩니다.

mariadb 세팅

yaml file 작성

  • pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mariadb-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/mariadb
  • pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mariadb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  • mariadb-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mariadb-statefulset
spec:
  serviceName: mariadb
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
        - name: mariadb
          image: mariadb:latest
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: your_password_here
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mariadb-storage
  volumeClaimTemplates:
    - metadata:
        name: mariadb-storage
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi

생성

kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
kubectl apply -f mariadb-statefulset.yaml

콘솔 로그인

kubectl exec -it <pod_name> -- /bin/bash
kubectl exec -it mariadb-statefulset-0 -- /bin/bash
mariadb -uroot -p  

create databse [생성할 DB명]; // db 생성
GRANT ALL PRIVILEGES ON [생성한 DB명].* TO [사용자 계정명]@[접근할 IP] IDENTIFIED BY '[사용자 패스워드]'; // 권한부여

오늘은 간단한 nginx, php-fpm, mariadb를 컨테이너로 생성하는 방식에 대해서 간략히 설명드렸습니다.
다음 설명에는 오늘 작성한 것을 좀더 고도화 시키고 원래 목적인 laravel 을 띄우는 것 까지 진행하도록 하겠습니다.

평점을 남겨주세요
평점 : 2.5
총 투표수 : 1

질문 및 답글