PHP-FPM이란 | PHP-FPM 설치 및 설정

PHP-FPM을 시작하기 전에 CGI에 대해 알아야 합니다. CGI(Common Gateway Interface)는 웹 서버와 외부 프로그램 사이의 상호작용을 위한 표준 프로토콜이며, 웹 서버는 사용자 요청에 따라 동적으로 콘텐츠를 생성하거나 데이터를 처리할 수 있습니다. 요청이 들어올 때 마다 각각의 요청으로 CGI가 생성되게 되어 서버의 속도는 느려질 수 밖에 없습니다.

CGI(Common Gateway Interface)의 업그레이드 버전으로 서버의 성능을 올릴 수 있는 다양한 방법이 있는데 Node.js, Django와 같은 프레임워크로 대체되거나, CGI의 단점을 보완한 FastCGI 등 다양한 기능이 있습니다. FastCGI를 사용하기 위해 PHP-FPM((FastCGI Process Manager)을 설치해서 사용하게 되며, PHP-FPM은 PHP 5.3.3 버전부터 PHP에 통합되었습니다.

✅ PHP-FPM의 기능

주요 기능은 CGI가 하나의 요청에 대한 하나의 프로세스를 생성하기 때문에 서버의 부하 및 서버의 퍼포먼스가 안 좋아지는 것을 보완하여 만들어진 프로세스가 계속해서 새로운 요청을 처리해서 서버의 속도를 향상 시킵니다.

✅ PHP-FPM 설치

Nginx 또는 Apache 웹 서버에서 주로 이용하는 PHP 설치는 Apache 서버 기준이며, APM은 이미 설치가 완료된 상태입니다.

dnf로 php 설치 시 같이 설치되었으며,

~]# rpm -qa | grep php-fpm
php-fpm-8.3.7-1.el9.remi.x86_64

PHP는 설치되었지만 설치가 되어 있지 않은 경우 설치를 진행할 수 있습니다.

~]# dnf -y php-fpm 

✅ PHP-FPM 설정(Apache 설치 서버)

설치가 되었다면 두 개의 설정 파일을 확인할 수 있습니다. www.conf 파일의 listen.owner와 그룹의 userid.nobody로 설정했습니다. 현재 운영 중인 서버의 아파치 설정 자체가 이미 nobody이기 때문이며, nobody 설정이 아닌 apache 설절으로 httpd.conf에 잡혀 있는 경우 apahe로 설정해야 합니다.

/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

~]# vi /etc/php-fpm.d/www.conf

listen.owner = userid
listen.group = nobody
listen.mode = 0660

## 기본으로 설정된 값
listen = 127.0.0.1:9000
# 위와 같이 설정되어 있을 수 있는데 로컬에서만 접속이 되는 
# 설정이기 때문에 아래와 같이 변경할 수 있습니다.
# 아래의 설정은 설치한 php-fpm 8.3 버전의 기본 값이었습니다.
listen = /run/php-fpm/www.sock

## 정적 또는 동적 구성 - php-fpm 프로세스는 정적 또는 동적으로 구성할 수 있습니다. ##

🔲 정적 모드 및 동적 모드 설정

PHP_FPM의 핵심이라고 할 수 있는 정적 모드 설정과 동적 모드 설정 방법입니다.

정적 모드에서는 자식 프로세스의 수가 pm.max_children 값에 의해 설정됩니다. 최대 120개의 자식 프로세스를 가지게 되는 설정입니다.

동적 모드가 기본 세팅일 가능성이 큽니다. 동적 모드는 더 많은 옵션을 제공합니다. 최소 6개의 자식 프로세스, 최대 18개의 자식 프로세스를 여분으로 가지는 것으로 설정했습니다.

추가로 php.ini 설정도 같이 한다면 구동하는 서버에 맞게 메모리 설정을 진행해 줍니다.

마지막으로 ondemand 모드라는 세 번째 운영 모드도 있습니다. 이 모드는 요청을 받을 때만 프로세스를 시작합니다. 강력한 영향을 받는 사이트에는 최적의 모드가 아니며, 특정한 필요에 따라서만 사용해야 합니다.

🔲 www.conf 최종 설정(개별 호스팅)

vi /etc/php-fpm.d/myHostID.conf

[myHostID]
user = myHostID
group = nobody
listen = /run/php-fpm/myHostID.sock
listen.owner = myHostID
listen.group = nobody
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
chdir = /home/myHostID/www

🔲 slowlog 설정

slowlog 설정을 체크합니다. 0은 비활성 상태이며, 1,2(초) 숫자로 변경할 수 있습니다.

🔲 Apache 통합하기

# 개별 호스팅 계정 설정 시 roxyPass 둘 중 하나 또는 ProxyPassMatch 설정
<VirtualHost *:80>
    ServerName mydomain.com
    ServerAlias www.mydomain.com
    DocumentRoot /home/호스트/www

   <Directory /home/호스트ID/www>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
  </Directory>
<FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php-fpm/호스트ID.sock|fcgi://localhost"
        </FilesMatch>
</VirtualHost>

🔲 소캣 설정

chown 호스트ID.nobody /run/php-fpm/호스트ID.sock
chmod 660 /run/php-fpm/호스트ID.sock

🔲 상태 확인 및 서버 재시작 시 자동 구동 설정

~]# systemctl enable php-fpm
~]# systemctl status php-fpm
 php-fpm.service - The PHP FastCGI Process Manager
     Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: >
     Active: active (running) since Wed 2024-07-03 10:20:44 UTC; 2 weeks 0 days>
   Main PID: 597 (php-fpm)
     Status: "Processes active: 0, idle: 12, Requests: 6168, slow: 0, Traffic: >
      Tasks: 13 (limit: 11903)
     Memory: 284.3M
        CPU: 3min 29.098s
     CGroup: /system.slice/php-fpm.service
             ├─   597 "php-fpm: master process (/etc/php-fpm.conf)"
             ├─  1086 "php-fpm: pool www"
             ├─  1087 "php-fpm: pool www"
             ├─  1088 "php-fpm: pool www"
             ├─  1089 "php-fpm: pool www"
             ├─  1090 "php-fpm: pool www"
             ├─  1770 "php-fpm: pool www"
             ├─ 81641 "php-fpm: pool www"
             ├─ 86359 "php-fpm: pool www"
             ├─105777 "php-fpm: pool www"
             ├─105815 "php-fpm: pool www"
             ├─153738 "php-fpm: pool www"
             └─167094 "php-fpm: pool www"

Jul 17 00:55:05 ip-172-26-6-43.ap-northeast-2.compute.internal sendmail[278038]>
Jul 17 00:55:05 ip-172-26-6-43.ap-northeast-2.compute.internal sendmail[278038]>
lines 2-25
리눅스 기초(The Linux Foundation)

Similar Posts