예전 PHP 가 설치된 서버에서 최신 PHP 의 기능을 사용하여 개발한 새로운 app를 구동해야 하는 경우가 있습니다.

예로 PHP 7 이상을 지원하지 않는 워드프레스 플러그인과 테마로 구성한 사이트에 Virtual Host 를 사용하여 라라벨로 개발한 서비스를 같이 구동해야 하는 경우를 들 수 있습니다.


하나의 최신 버전의 PHP 만 설치하고 운영하면 좋겠지만 이 경우 기존의 소스가 안 돌아갈 소지가 있어서 하나의 서버에 여러 버전의 PHP 를 설치하고 각각 app 에 맞는 PHP 를 사용하는게 기존 서비스 영향이 없으므로 권장하는 방식입니다.


하지만 CentOS 의 yum 이나 Ubuntu 의 apt 같은 패키지 매니저는 하나의 서버에 동시에 여러 버전의 PHP 설치를 허용하지 않으며 PHP 에는 Python 의 VirualEnv 나 rails 의 rbenv 처럼 app 에 맞는 PHP 를 선택할 수 있는 신뢰성있는 제품이 없는 문제가 있습니다.


이를 해결하기 위한 좋은 방법중 하나는 docker 를 사용하는 것이지만 OS가 CentOS 7 이상(6으로 서비스하는 H/W 도 많이 있으며 CentOS 7으로 업그레이드같은 큰 변화는 운영 담당자들이 싫어하는 편입니다.)이어야 하며 docker 를 학습해야 한다는 부담이 있습니다.


개인적으로 OS 가 제공하는 패키지 매니저를 통해 설치하는 것을 선호하고 직접 컴파일해서 설치하는 것을 최대한 지양하지만 이런 경우는 여러 버전의 PHP 를 소스에서 빌드해서 사용하는 것이 유용합니다.


기본 PHP 설치

시스템에서 기본으로 사용할 PHP (Ex: 5.6)를 설치합니다.


Source 로 설치

PHP 7.0 기준 라라벨을 구동하기 위한 설정입니다.


  1. 소스 다운로드 및 압축 해제

    curl -L -o php-7.0.17.tar.xz http://kr1.php.net/get/php-7.0.17.tar.xz/from/this/mirror
    tar xJvf php-7.0.17.tar.xz
    cd php-7.0.17
    CODE
  2. 개발 패키지를 설치합니다.

    yum install gcc make openssl-devel libmcrypt-devel libcurl-devel zlib-devel libxml2-devel libcurl-devel
    CODE
    sudo apt install gcc make pkg-config libssl-dev  libmcrypt-devel libcurl4-openssl-dev zlib-devel libxml2-dev libcurl-devel
    CODE
  3. 컴파일 환경을 구성합니다

    ./configure \
    --prefix=/usr/local/php-7.0 \
    --with-config-file-path=/etc/php70 \
    --with-config-file-scan-dir=/etc/php70/php.d \
    --with-zlib-dir \
    --enable-mbstring \
    --with-curl \
    --with-mcrypt \
    --with-zlib \
    --disable-rpath \
    --enable-inline-optimization \
    --enable-sockets \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-pcntl \
    --enable-mbregex \
    --with-mhash \
    --enable-zip \
    --with-pcre-regex \
    --with-pdo-mysql \
    --with-mysqli \
    --with-openssl \
    --with-fpm-user=nginx \
    --with-fpm-group=nginx \
    --enable-fpm \
    --with-pdo-mysql 
    CODE
  4. 컴파일 & 설치합니다.

    make && make install
    CODE

fpm 설정

  1. php 설정 폴더를 생성합니다.

    mkdir /etc/php70
    cp php.ini-production /etc/php70/php.ini
    CODE
  2. fpm 설정은 /usr/local/php-7.0/etc/ 에 있고 기본 설정을 만들어 줍니다.

    cp /usr/local/php-7.0/etc/php-fpm.conf.default /usr/local/php-7.0/etc/php-fpm.conf
    cp /usr/local/php-7.0/etc/php-fpm.d/www.conf.default /usr/local/php-7.0/etc/php-fpm.d/www.conf
    CODE
  3. php-fpm.conf www.conf 설정을 수정합니다.(port 등)

    listen = /run/php/php7.0-fpm.sock
    CODE

    또는 TCP 로 연결할 경우 기본 PHP 와 다른 포트를 적어줍니다.

    listen = 127.0.0.1:9100
    CODE
  4. 부팅시 자동 구동되도록 service 나 systemd 설정을 추가합니다.

    CentOS 6

    cp sapi/fpm/init.d.php-fpm /etc/init.d/php7.0-fpm
    chmod +x /etc/init.d/php7.0-fpm
    chkconfig php7.0-fpm on
    service php7.0-fpm restart
    BASH

    RHEL, CentOS 7+, ubuntu 14+

    cp sapi/fpm/php-fpm.service /etc/systemd/system/php7.0-fpm.service
    systemctl enable php7.0-fpm.service
    systemctl restart php7.0-fpm.service
    BASH
  5. php 테스트 프로그램을 작성하고 정상 동작 여부를 확인합니다.



nginx 설정

location 설정내 fastcgi 의 URL 에 새로 구동한 PHP-FPM 의 주소를 적어주면 됩니다.

location ~ \.php$ {
        ## https://httpoxy.org
        fastcgi_param HTTP_PROXY "";

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
		#fastcgi_pass 127.0.0.1:9100;
CODE


Ref