php-fpm, mariadb, nginx and laravel 설치 하기 1
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 을 띄우는 것 까지 진행하도록 하겠습니다.