리눅스에 여러 버전의 php 설치하기(php multiple version)
예전 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)를 설치합니다.
- RHEL/CentOS 5,6,7 에 EPEL 과 Remi Repository 설치하기
- PHP installation and Web Server Integration(PHP 설치 및 웹 서버 연동)
Source 로 설치
PHP 7.0 기준 라라벨을 구동하기 위한 설정입니다.
소스 다운로드 및 압축 해제
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
개발 패키지를 설치합니다.
yum install gcc make openssl-devel libmcrypt-devel libcurl-devel zlib-devel libxml2-devel libcurl-devel
sudo apt install gcc make pkg-config libssl-dev libmcrypt-devel libcurl4-openssl-dev zlib-devel libxml2-dev libcurl-devel
컴파일 환경을 구성합니다
./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
컴파일 & 설치합니다.
make && make install
fpm 설정
php 설정 폴더를 생성합니다.
mkdir /etc/php70 cp php.ini-production /etc/php70/php.ini
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
php-fpm.conf 와 www.conf 설정을 수정합니다.(port 등)
listen = /run/php/php7.0-fpm.sock
또는 TCP 로 연결할 경우 기본 PHP 와 다른 포트를 적어줍니다.
listen = 127.0.0.1:9100
부팅시 자동 구동되도록 service 나 systemd 설정을 추가합니다.
CentOS 6cp 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
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
- 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;