본문 바로가기
Linux/APM

한 대의 리눅스 서버에 두 개 이상의 버전이 다른 php(5.3/7.4)설치

by aegypius 2020. 3. 26.
728x90
반응형

  php 5.3 이하 버전에서만 돌아가는 사이트 두 개를 호스팅 해야 할 일이 생겼다. 처음에는 서버 한 대를 더 세팅하려고 했는데... 소규모 홈페이지 두 개를 위해서 별도의 서버를 할당 한다는 것이 영 내키지 않았다. 무엇보다도 이 서버에서는 앞으로도 php 5.4 이상은 사용할 수 없다는 점은 낭비로 느껴졌다.

  이를 해결할 방법을 찾다보니 도커(docker)와 php-fpm이 눈에 띄었다. 먼저 시도한 것은 php-fpm이었는데  php의 컴파일 과정(옵션)에 문제가 있었는지 db와의 커넥션에서 계속 발생하는 오류를 해결하지 못했다. 도커는....인터넷으로 자료를 찾아봤는데 결국에는 서적을 구매해서 시간을 두고 천천히 접근해 보기로 했다. 흥미롭고 유용한 기술인 것은 분명하지만 지금 내게 필요한 것은 멀티 php일뿐...시간이 없다.

  검색을 하다보면 참고할 자료가 많이 발견되는 경우보다는 한 손가락으로 꼽을 수 있을 정도인 경우가 많다. 지금 내게 필요한 하나의 서버에 여러 버전의 php를 설치하고 운영하는 방법이 잘 정리된 웹페이지도 꽤 있다. 하지만 막상 따라 해보면 온갖 에러의 연속이라서 결국은 삽질을 해야한다. 나 또한 그렇지만 이런 포스팅은 나중에 내가 참고할 목적으로 남겨두는 것이기에 시간이 지난 후에라도 내가 알아볼 수 있을 정도면 충분하다. 테스트를 위해서 잠시 서버가 필요할 때엔 vps가 최고다. 이번에도 고민 없이 vultr을 이용했다. 몇 해전에는 conoha도 1년 가까이  이용한 적이 있다.

   1. 테스트의 핵심은  php를 두 개 (7.4와 5.3.29) 설치하는 것이다.
   2. 주로 사용하게될 7.4는 yum으로 설치할 것이고, 5.3.29버전은 소스를 컴파일 할 것이다.
   3. 설치 후 각 버전별로 워드프레스를 구동해서 정상작동 하는것까지 테스트 해야한다.

  기본적인 준비 과정은 아래와 같다.

(01) 일단 vultr에서 월 $5로 가장 저렴한 vps를 두 개 구동시키자. (속도가 느린건 각오하자-_-;)
(02) root로 접속 한 후에 password를 변경하자.
(03) ssh의 포트 변경, 계정추가, sftp 설정을 해두자. 방화벽 설정도 필수.
          - sshd_config에서 포트를 변경한 후에 이를 tcp 포트로 열어주자.
             :  # firewall-cmd --permanent --zone =public --add-port=???/tcp
          - ssh의 기본 포트(22)는 이제 불필요하다. 아마도 방화벽의 service에 올라와있을 것이다. 확인 후 삭제하자. (안해도 된다)
             : # firewall-cmd --permanent --zone=public --remove-service=ssh
          - 사용자 계정을 두 개 추가한 후에 / 비밀번호를 설정하고 / AllowUsers 에 등록하자.
             : AllowUsers의 위치는 PermitRootLogin 아래가 적당하다. ssh의 root 로그인은 막아두자.
             : 추가한 계정1은 root를 대신해서 오로지 ssh 접속을 위한 것이고 계정2는 sftp 접속 전용으로 사용할 것이다.
(04) bind와 httpd(apache)를 설치 후 방화벽을 설정하자.
          - 네임서버는 53포트를 tcp,udp 모두 열어주고
          - 웹서버는 http와 https를 service로 열어주자 (포트로 열어도..?? ..편한대로...-_-;)
(05) 다른 서버에서 운영중인 webpr.kr의 서브도메인을 만들자. 서브도메인의 네임서버를 위임해서 테스트 서버에서 네임서버를 구축해보자.
          - 테스트용으로 53.sunglim.webpr.kr과 74.sunglim.webpr.kr 두 개를 준비했다.
(06) 귀찮아지기 시작하지만 apache의 virtualhost까지 설정하자.
(07) 이제 php와 db를 설치할 차례이다.
          - epel, remi 리포지터리 설치 후 yum으로 php 7.4와 mariadb도 설치하자.
(08) 이제 php 5.3.29를 설치해보자. 이게 핵심이다.

 - 참고로
linux는 centos-release-7-7.1908.0.el7.centos.x86_64 이며
mariaDB는 5.5.64 이다. (구동시킬 프로그램과의 호환성 문제로 최신버전으로 업데이트는 안하다.)

  php 5.3.29는 php.net에서 구할 수 있다. 파일명 : php-5.3.29.tar.gz 
/usr/local에 php53 디렉토리를 만들어 압축을 풀어 넣고 compile을 하자. gcc가 없다면 설치해야 할 것이다.

# yum install gcc

  php의 컴파일 옵션은 아래와 같다.

./configure --prefix=/usr/local/php53 \
	--with-config-file-path=/etc/php53 \
	--with-config-file-scan-dir=/etc/php53/php.d \
	--enable-fpm \
	--with-fpm-user=apache \
	--with-fpm-group=apache \
	--with-libdir=lib64 \
	--with-mysql \
	--with-mysqli \
	--enable-mbstring \
	--disable-debug \
	--disable-rpath \
	--with-bz2 \
	--with-curl \
	--with-gettext \
	--with-iconv \
	--with-openssl \
	--with-gd \
	--with-mcrypt \
	--with-pcre-regex \
	--with-zlib 

 

  컴파일 할 때마다 발생하는 오류를 하나하나 해결하다보니 어느새 컴파일이 성공적으로 끝난다. google의 힘은 대단하다!

php 5.3.29 컴파일시 발생한 오류메시지와 해경방법 (for CentOS)
오류01 : configure: error: /usr/bin/ld: cannot file -lltdl
( 해결 : yum install libtool-ltdl-devel )

오류02 : configure: error: XML configuration could not be found.
( 해결 : yum install libxml2-devel )

오류03 : configure: error: xml2-config not found. Please check your libxml2 installation.
( 해결 : yum install libxml2-devel )

오류04 : configure: error: freetype.h not found.
( 해결 : yum install freetype-devel )

오류05 : configure: error: libpng.(a|so) not found.
( 해결 : yum install libpng-devel)

오류06 : configure: error: libjpeg.(a|so) not found.
( 해결 : yum install libjpeg-devel)

오류07 : configure: error: Cannot find OpenSSL's 
( 해결 : yum install openssl-devel )

오류08 : configure: error: Please reinstall the BZip2 distribution
( 해결 : yum install bzip2-devel )

오류09 : configure: error: Please reinstall libmhash - I cannot find mhash.h
( 해결 : yum install libmhash libmhash-devel )

오류10 : configure: error: Please reinstall the libcurl distribution -
    easy.h should be in /include/curl/

( 해결 : yum install curl-devel )

오류11 : configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
( 해결 : yum install libxslt-devel )

오류12 : configure: error: png.h not found.
( 해결 : yum install libpng-devel )

오류13 : configure: error: mcrypt.h not found. Please reinstall libmcrypt.
( 해결 : yum install libmcrypt-devel )
  epel-release가 설치되지 않았다면 yum install epel-release 을 먼저 실행해야 할 것이다.

오류14 : configure: error: Cannot find MySQL header files under yes.
( 해결 : yum install mysql-devel)

오류15 : configure: error: mcrypt.h not found. Please reinstall libmcrypt.configure: error: Cannot find MySQL header files under yes. Note that the MySQL client library is not bundled anymore!
( 해결 : yum --enablerepo=remi install mysql-devel )
make -j4 && make install
*** 작업 디렉토리는 php5.3.29의 소스가 있는 /use/local/php53 이다. ***
mkdir /etc/php53
cp php.ini-production /etc/php53/php.ini
sed -i -e 's#php_fpm_CONF=\${prefix}/etc/php-fpm.conf#php_fpm_CONF=/etc/php53/php-fpm.conf#' sapi/fpm/init.d.php-fpm
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod a+x /etc/init.d/php-fpm
/sbin/chkconfig --add php-fpm
/sbin/chkconfig php-fpm on
cp sapi/fpm/php-fpm.conf /etc/php53


  /etc/php53/php-fpm.conf를 열고 아래의 문자열을 찾아서 수정하자.

pid = run/php-fpm.pid  (이부분은 주석처리 되어있다. #을 제거하자)
listen = 127.0.0.1:9000 (수정할 것이 없다)
pm.start_servers = 10 (10으로 수정하자)
pm.min_spare-servers = 10 (역시 10으로 수정하자)
pm.max_spare-servers = 10 (이것도 10으로 수정)


  php-fpm의 구동은 아래와 같이 하자. systemctl은 7.x버전부터 사용이 가능할 것이다.

service php-fpm start

       [OR]

systemctl start php-fpm


  서버를 자주 리부팅 하지는 않겠지만 놓칠 수 있으니 systemctl enable 을 해두자.

  mariadb는 yum으로 기본설치 했는데 간혹 실행되지 않는 경우가 있었다. 네트워크를 재시작 하거나 서버를 리부팅해도 마찬가지라면 mariadb-server를 재설치 해야 한다. 기존 설치를 제거 한 후에 다시 설치하자.
(php-fpm을 테스트 하느라고 vps에 2회, real-server에 2회 총 4번 서버 셋팅을 했다 -_-; 그 중에서 mariadb가 실행되지 않고 소켓 오류를 발생시킨 건 딱 1번 이었는데 제거 후 다시 설치를 해서 해결했다.)

  혹시 php-fpm을 구동했는데 address가 이미 사용중이라고 나오면 127.0.0.1:9000에 걸려있는 모든 프로세서를 강제 종료 후에 다시 시동해야 한다. 위의 설정대로 했다면 강제 종료를 10번은 해야 할 것이다. -_-;

# service php-fpm start [or] systemctl start php-fpm
Starting php-fpm: ERROR: unable to bind listening socket for address 
'127.0.0.1:9000': Address already in use (98)

  위의 오류가 발생한다면 netstat -tnlp 등을 통해서 php-fpm의 pid를 확인 후에 kill의 -9 옵션으로 강제종료 시키자. 여러번 반복해야 한다.

  php-fpm의 구동이 성공적으로 이루어졌다면 실제로 홈페이지에 적용시켜보자. 쉘 프롬프트에서 php -v를 실행하여 설치되어 있는 php의 버전을 확인할 수 있다. 그리고 php-fpm의 status도 함께 확인하자. 아래와 같다.

php-fpm을 php53-fpm으로 이름을 바꿨다.


  이제 이 서버에서는 php 7.4.4가 기본이며, php 5.3.29로 구동해야 하는 홈페이지가 있다면 해당 도메인의 가상호스트 설정에서 php-fpm을 적용하면 된다. 단 3줄만 추가하자. 아래와 같다.

<VirtualHost *:80>
   DocumentRoot /home/sunglim/web/sunglim.webpr.kr/53
   ServerName 53.sunglim.webpr.kr
   ServerAlias 53.sunglim.webpr.kr
   <IfModule proxy_fcgi_module>
      ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/home/sunglim/web/sunglim.webpr.kr/53
   </IfModule>
   ErrorLog /var/log/httpd/53error.log
   CustomLog /var/log/httpd/53access.log combined
</VirtualHost>

<VirtualHost *:80>
   DocumentRoot /home/sunglim/web/sunglim.webpr.kr/74
   ServerName 74.sunglim.webpr.kr
   ServerAlias 74.sunglim.webpr.kr
   ErrorLog /var/log/httpd/74error.log
   CustomLog /var/log/httpd/74access.log combined
</VirtualHost>

<VirtualHost *:80>
   DocumentRoot /home/sunglim/web/sunglim.webpr.kr/www
   ServerName sunglim.webpr.kr
   ServerAlias www.sunglim.webpr.kr
   ErrorLog /var/log/httpd/www.error.log
   CustomLog /var/log/httpd/www.access.log combined
</VirtualHost>

 

  서브도메인을 포함한 모든 세팅은 임시 설정이라서 곧 삭제할 것이지만...당분간은 보관하려 한다. 이틀간의 삽질이었다. (리얼서버1 실패 - vps1 성공 - vps2 성공 - 리얼서버2 성공)

  참고로 53.sunglim.webpr.kr은 php 5.3에 wordpress 3.2.1이고, 74.sunglim.webpr.kr은 php 7.4에 워드프레스 버전이 5.2.4-ko_KR이다. 워드프레스 3.x 버전은 사용해 본적이 없지만 php 5.3.x을 테스트 하기 위해 설치했다. 테스트 과정에서 db 패스워드에 apostrophe(')가 포함된 경우 w/p 5.x에서는 아무 이상없었지만 3.x에서는 설치중에 오류가 발생했었다. (db 패스워드를 변경해서 해결했다)

728x90
반응형

댓글