PHP-FPM Installation | 일곱번째 손님
server

PHP 설치 방법을 정리하겠습니다.

기본 디렉토리 생성

mkdir -p /data /data/apps /data/webtmps /data/www /data/log /data/src

의존성 패키지 설치

yum -y install openssl openssl-devel libxml2 libxml2-devel zlib-devel make gcc gcc-c++ wget

유저및그룹 생성

useradd -M -r -s /sbin/nologin webuser

php7 다운로드 및 압축해제

버전은 최신 stable 버전을 설치해주시면 됩니다.

cd /data/src
wget http://kr1.php.net/get/php-7.0.10.tar.gz/from/this/mirror -O php-7.0.10.tar.gz
tar xvzf php-7.0.10.tar.gz

php configure

cd /data/src/php-7.0.10

./configure \
--prefix=/data/apps/php \
--enable-fpm \
--with-openssl \
--with-zlib \
--with-config-file-path=/data/apps/php/etc/ \
--with-mysqli=mysqlnd \
--with-pdo_mysql=mysqlnd

make

make install

php.ini 파일 작성

cp /data/src/php-7.0.10/php.ini-production /data/apps/php/etc/php.ini

vi 편집기로 /data/apps/php/etc/php.ini 연 후 아래 내용 검색 후 수정
expose_php = Off
cgi.fix_pathinfo=0
allow_url_fopen = Off
date.timezone = Asia/Seoul # 국가에 맞게
upload_tmp_dir = /data/webtmps
session.save_path = "/data/webtmps"
soap.wsdl_cache_dir="/data/webtmps"

php-fpm.conf 수정

vi /data/apps/php/etc/php-fpm.conf 아래 내용 추가 (일부 옵션값은 적절히 수정)

[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
emergency_restart_interval = 0s
emergency_restart_threshold = 0
process_control_timeout = 0s
rlimit_files = 102400
rlimit_core = unlimited

[www]
user = webuser
group = webuser

listen.mode = 0660
listen = /data/apps/php/php-fpm.sock
listen.allowed_clients = 127.0.0.1
listen.mode = 0660
listen.owner = webuser
listen.group = webuser

pm = ondemand
pm.max_children = 1000
pm.process_idle_timeout = 10s
pm.status_path = /php-fpm_status

php_value[short_open_tag] = On
php_value[memory_limit] = 512M
php_value[max_execution_time] = 0
php_value[max_input_time] = -1
php_value[post_max_size] = 1024M
php_value[upload_max_filesize] = 1024M

request_terminate_timeout = 120s
catch_workers_output = yes

request_slowlog_timeout = 5s
slowlog = var/log/php-slow.log

자동 시작 스크립트 작성

touch /etc/init.d/php-fpm
chmod 755 /etc/init.d/php-fpm

vi 편집기로 /etc/init.d/php-fpm 파일 연 후 아래 내용 붙여넣기

#! /bin/sh

### BEGIN INIT INFO
# Provides:          php-fpm
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php-fpm
# Description:       starts the PHP FastCGI Process Manager daemon
### END INIT INFO

prefix=/data/apps/php
exec_prefix=${prefix}

php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm.conf
php_fpm_PID=${prefix}/var/run/php-fpm.pid


php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"


wait_for_pid () {
    try=0

    while test $try -lt 35 ; do

            case "$1" in
                    'created')
                    if [ -f "$2" ] ; then
                            try=''
                            break
                    fi
                    ;;

                    'removed')
                    if [ ! -f "$2" ] ; then
                            try=''
                            break
                    fi
                    ;;
            esac

            echo -n .
            try=`expr $try + 1`
            sleep 1

    done

}

case "$1" in
    start)
            echo -n "Starting php-fpm "

            $php_fpm_BIN --daemonize $php_opts

            if [ "$?" != 0 ] ; then
                    echo " failed"
                    exit 1
            fi

            wait_for_pid created $php_fpm_PID

            if [ -n "$try" ] ; then
                    echo " failed"
                    exit 1
            else
                    echo " done"
            fi
    ;;

    stop)
            echo -n "Gracefully shutting down php-fpm "

            if [ ! -r $php_fpm_PID ] ; then
                    echo "warning, no pid file found - php-fpm is not running ?"
                    exit 1
            fi

            kill -QUIT `cat $php_fpm_PID`

            wait_for_pid removed $php_fpm_PID

            if [ -n "$try" ] ; then
                    echo " failed. Use force-quit"
                    exit 1
            else
                    echo " done"
            fi
    ;;

    status)
            if [ ! -r $php_fpm_PID ] ; then
                    echo "php-fpm is stopped"
                    exit 0
            fi

            PID=`cat $php_fpm_PID`
            if ps -p $PID | grep -q $PID; then
                    echo "php-fpm (pid $PID) is running..."
            else
                    echo "php-fpm dead but pid file exists"
            fi
    ;;

    force-quit)
            echo -n "Terminating php-fpm "

            if [ ! -r $php_fpm_PID ] ; then
                    echo "warning, no pid file found - php-fpm is not running ?"
                    exit 1
            fi

            kill -TERM `cat $php_fpm_PID`

            wait_for_pid removed $php_fpm_PID

            if [ -n "$try" ] ; then
                    echo " failed"
                    exit 1
            else
                    echo " done"
            fi
    ;;

    restart)
            $0 stop
            $0 start
    ;;

    reload)

            echo -n "Reload service php-fpm "

            if [ ! -r $php_fpm_PID ] ; then
                    echo "warning, no pid file found - php-fpm is not running ?"
                    exit 1
            fi

            kill -USR2 `cat $php_fpm_PID`

            echo " done"
    ;;

    *)
            echo "Usage: $0 {start|stop|force-quit|restart|reload|status}"
            exit 1
    ;;

esac

자동시작 스크립트 등록

chkconfig php-fpm on

로그 설정

ln -s /data/apps/php/var/log /data/log/php

#vi 편집기로 /etc/logrotate.d/php-fpm 파일 연 후 아래 내용 붙여넣기

/data/apps/php/var/log/*.log {
    daily
    missingok
    rotate 31
    compress
    notifempty
    sharedscripts
    postrotate
        [ ! -f /data/apps/php/var/run/php-fpm.pid ] || kill -USR1 `cat /data/apps/php/var/run/php-fpm.pid`
    endscript
    copytruncate
}

실행

service php-fpm start
service php-fpm stop
/etc/init.d/php-fpm start
/etc/init.d/php-fpm stop

Extenstions

curl

cd /data/src/php-7.0.10/ext/curl #해당 폴더에 기본적인 extension파일이 존재함.
/data/apps/php/bin/phpize
./configure --with-php-config=/data/apps/php/bin/php-config
make
make install

#vi 편집기로 /data/apps/php/etc/php.ini 연 후 맨 아래에 아래내용 추가
extension=curl.so

service php-fpm reload (php를 재구동 해줘야 적용됨)

igbinary

wget https://github.com/igbinary/igbinary7/archive/master.zip
unzip master.zip
cd igbinary7-master

/data/apps/php/bin/phpize
./configure --with-php-config=/data/apps/php/bin/php-config

make
make install

#vi 편집기로 /data/apps/php/etc/php.ini 연 후 맨 아래에 아래내용 추가
extension=igbinary.so

service php-fpm reload (php를 재구동 해줘야 적용됨)

mbstring

cd /data/src/php-7.0.10/ext/mbstring #해당 폴더에 기본적인 extension파일이 존재함.

/data/apps/php/bin/phpize
./configure --with-php-config=/data/apps/php/bin/php-config

make
make install

#vi 편집기로 /data/apps/php/etc/php.ini 연 후 맨 아래에 아래내용 추가
extension=mbstring.so

service php-fpm reload (php를 재구동 해줘야 적용됨)

mcrypt

cd /data/src/php-7.0.10/ext/mcrypt #해당 폴더에 기본적인 extension파일이 존재함.

yum -y install epel-release
yum -y install php-mcrypt
yum -y install libmcrypt-devel

/data/apps/php/bin/phpize
./configure --with-php-config=/data/apps/php/bin/php-config

make
make install

#vi 편집기로 /data/apps/php/etc/php.ini 연 후 맨 아래에 아래내용 추가
extension=mcrypt.so

service php-fpm reload (php를 재구동 해줘야 적용됨)

redis

wget https://github.com/phpredis/phpredis/archive/php7.zip
unzip php7.zip
cd phpredis-php7

/data/apps/php/bin/phpize
./configure --with-php-config=/data/apps/php/bin/php-config

make
make install

#vi 편집기로 /data/apps/php/etc/php.ini 연 후 맨 아래에 아래내용 추가
extension=mcrypt.so

service php-fpm reload (php를 재구동 해줘야 적용됨)