불금이었지만 지독히도 운이 없는 저는 일에 쫒기어 새벽녁에 집에 들어왓습니다. 너무 늦어서일까 잠이 오질 않아서 그동안 생각만 하고 있었던 PHP를 최신 버젼으로 업데이트 하기로 했습니다.

조금이라도 사이트 속도에 도움이 된다면, 새롭게 공부하는 것을 어찌 두려워하겠습니까? 그래서 2016년 12월 발표된 PHP 7.1가 조금 성능 개선 있다고해서 업그레이드 하기로 했습니다.

PHP 7.1 성능 개선 효과는 어느정도일까?

PHP 7.1이 기존 PHP 7.0에 비해서 어느 정도 성능 개선이 있을까요?
테스트 보고에 따라 다릅니다. 약 6~7% 정도의 약간의 성능 개선이 있다고 한 BM 테스트도 있고, 20%이상 성능 개선이 있다고 보고하는 벤치마킹 보고서도 있습니다.

찾아 본 자료 중에서 가장 긍정적으로 평가했던 자료를 인용해 봅니다.
심리적 위안도 매우 중요하지요.

PHP Performance Comparison 2017 and 2016 – PHP Benchmark Script to Figure How Each PHP Version Compare in Speed Improvements between PHP 5 vs PHP 7.0 vs 7.1 with OpCache vs PHP 8 or PHP 7.2 with a PHP JIT Features

▽ 설치 PHP 버젼별 성능 벤치마크,
이 표대로라면 PHP 7.1은 PHP 7.0에 비해서 18%~27% 성능 개선이 있다.

PHP 7.1로 업그레이드_설치 PHP 버젼별 성능 벤치마크

PHP 7.1로 업그레이드는 아래와 같은 몇가지 포스팅 내용을 참조해서 진행하였고 그 시행착오를 거쳐 나름대로 아래에서 재정리해 보았습니다.

How to upgrade to PHP 7.1 on Ubuntu

How to Install and Configure PHP 7.0 or PHP 7.1 on Ubuntu 16.04

1. PHP 7.1을 설치하기 위한 저장소 등록

PHP 7.1은 아직 공식 저장소가 없으므로 상대적으로 안전하다고 알려진 PHP 7.1용 저장소로 ondrej/php PPA를 등록합니다. 여기는 PHP 7.1을 소개하는 포스팅에서 대부분 소개하는 곳입니다.

apt-get install -y python-software-properties
add-apt-repository -y ppa:ondrej/php
apt-get update -y

2. 현재 설치된 PHP 패키지가 무엇이 있는지 확인

현재 시스템에 설치되어 있는 패키지가 무엇인지 확인합니다.
이 설치되어 있는 패키지 리스트를 PHP 7.1에서도 설치해 줘야 합니다.

dpkg -l | grep php | tee packages.txt

PHP 7.1로 업그레이드_설치 PHP버젼을 보자

3. PHP 7.1 설치

이제 PHP 7.1를 설치하고 이어서 필요한 부가 패키지들을 설치합니다.


apt-get install php7.1  -y  # PHP 7.1 설치
# 부가 패키지 설치
apt-get install  php7.1-common php7.1-fpm php7.1-cli  php7.1-curl  php7.1-mbstring php7.1-gd php7.1-intl php7.1-xml php7.1-mysql php7.1-mcrypt php7.1-zip php-pear php7.1-gmp php7.1-intl php7.1-imap php7.1-json php7.1-ldap  php7.1-ps php7.1-readline php7.1-tidy php7.1-xmlrpc php7.1-xsl

4. nginx를 사용한다면 php 관련 설정 변경

nginx를 사용한다면 nginx 설정 파일에서 PHP handler의 내용을 7.1로 바꿔야 합니다.
(이는 어느분이 댓글로 알려주셨는데요. 댓글을 삭제하셨는지 Disqus에서 보이질 않습니다. 댓글을 달았다고 메일이 왔는데도 disQus에서는 삭제된것 같다는 메세지만 나옵니다.)

변경해야하는 파일은 /etc/nginx/conf.d/default.conf 인데요. 이를 편집 화면으로 들어가서 PHP handler의 내용중
fastcgi_pass unix:/run/php/php7.0-fpm.sock; 을 fastcgi_pass unix:/run/php/php7.1-fpm.sock; 로 바꾸어줘야 합니다. 그래야 php7.1을 인식하고 php7.1로 작동합니다.

vi /etc/nginx/conf.d/default.conf  # /etc/nginx/conf.d/default.conf  편집

PHP handler의 내용은 아래처럼 생겼습니다. 제가 적용하고 있는 내용인데요.
위에서 언급한대로 fastcgi_pass unix:/run/php/php7.0-fpm.sock; 을 fastcgi_pass unix:/run/php/php7.1-fpm.sock; 로 바꾸어줘야 합니다

# Add PHP handler
location ~ [^/]\.php(/|$) {
       fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_pass unix:/run/php/php7.1-fpm.sock;  <---------- 이 부분을 7.1로 변경해야합니다.
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 16k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;

        # This file is present on Debian systems..
        include fastcgi_params;

    }

4. 설치된 PHP 버젼 확인

php -v

이러면 PHP7.0은 아래와 같은 메세지를 출력할 겁니다.

PHP 7.0.19-1+deb.sury.org~xenial+2 (cli) (built: May 22 2017 12:48:42) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.19-1+deb.sury.org~xenial+2, Copyright (c) 1999-2017, by Zend Technologies

PHP 7.1로 업데이 후에는 아래와 같은 메세지를 뿜어냅니다.

PHP 7.1.6-1~ubuntu16.04.1+deb.sury.org+1 (cli) (built: Jun  9 2017 08:26:34) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.6-1~ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2017, by Zend Technologies
root@happist:~# ^C
root@happist:~#

6. PHP 설정 파일 최적화

Nginx에서 PHP 7.1의 설정 파일은 /etc/php/7.1/fpm/php.ini에 위치하고 있습니다.

vi /etc/php/7.1/fpm/php.ini

6.1. phpMyAdmin DB 업로드 용량 확대 세팅

phpMyAdmin에서 DB를 백업 받고 또 필요에 따라 DB 업로드하려면 업로드 용량 확대가 필요합니다.
아마 처음 PHP를 설치하면 2M로 설정되어 있어 금방 용량 부족으로 업로드가 불가능하게 됩니다.
이를 방지하기 위해서 php.ini에서도 용량을 증대합니다.

upload_max_filesize = 2M  → 200M으로 변경
post_max_size = 2M    → 200M으로 변경

phpMyAdmin DB 업로드 용량 확대 세팅에 대해서는 기존에 포스팅한
[워드프레스 Tips] Nginx서버에서 phpMyAdmin DB 업로드 용량 확대 방법 을 참조하세요.

6.2. Enable Zend OPcache

Opcache는 PHP script 를 bytecode로 컴파일한 후에 공유 메모리에 저장하여 성능을 향상시키는 모듈이라고 합니다. Opcache 의 구현물은 다양하지만 Zend Opcache가 PHP 5.5부터 기본 모듈로 내장되었고 지속적으로 개발되고 있는 프로젝트이므로 이것을 사용하는 것이 좋을 것 같다고 하네요. 이는 아래 글에서 인용했습니다.

Zend OPcache 설치 및 설정

OPcache를 활성화하기 위해서는 php.ini파일에서 맨 아래에 아래와 같은 문구를 추가합니다.

zend_extension=opcache.so

6.3. 보안 관련 보완 추가

php.ini파일에서 보안관련 몇가지 사상을 추가하라는 추천이 있습니다.

disable_functions 기능 추가

이는 php.ini 파일 내의 disable_functions을 찾아 여기에 phpinfo,system,mail,exec 항목을 추가하는 것 입니다. phpinfo는 php 정보를 파악하기 위해서 서버에 올려주는 경우가 있는 제 이를 세팅 자체에서 불가능하게 만들는 옵션이네요.

disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, phpinfo, system,mail,exec

file_uploads 기능을 사용하지 않는다.

보안을 위해서 file_uploads 기능을 사용하지 말라고 추천되고 있습니다.
저의 경우 이 file_uploads 기능은 쵝 워드프레스를 세팅 시 phpMySql에 dbㄹㄹ 올리면서 사용했고 그 외는 전혀 사용할 기회가 없었습니다. 그렇다면 보안 위협도 있다는데 굳이 사용할 이유가 없겠지요.

file_uploads = on을 off로 변경

sql.safe_mode 적용

이는 php.ini 파일에서 sql.safe_mode 항목을 찾아 on으로 변경합니다.

sql.safe_mode=off를 on으로 변경

allow_url_fopen 비적용

allow_url_fopen=off로 변경

register_globals = Off 추가

php.ini 파일 맨 마지막에 register_globals = Off 항목을 추가합니다.

PHP 7.1에서는 Memcache나 APCu extension가 설치될 수 없습니다.

7. php7.1-fpm 재시동

systemctl restart nginx.service php7.1-fpm.service

8. PHP 7.0 삭제하기

기본 버젼을 삭제하는 것은 누구는 옵션이라고 합니다. 또 누구는 엉킬 수 있으니 삭제하라고 하기도 합니다.

apt-get -y --purge autoremove

저의 경우는 PHP 7.0을 삭제하니 워드프레스가 작동하지 않아서 삭제하지 않고 남겨두었습니다.
(지금 생각해보니 PHP handler를 7.1로 변경하지 않아서 발생한 문제라는 생각입니다. 정상적으로 PHP handler를 7.1로 변경 적용했다면 문제가 없을 것으로 보입니다.)

서버 내용을 보니 PHP 5.6, PHP 7.0, PHP 7.1이 공존하고 있기는 합니다. 기존 버젼 삭제 시 문제도 생기고, 서버 용량이 남아돌고 있으므로 그냥 유지하기로 했습니다.

철저히 비교 대상을 제한해서 비교한것은 아니지만 php 7.1로 업그레이드 한 후 속도가 3.1초~2.9초대였다면 보통 2.7초대로 좋아졌습니다. 심리적으로 좋아졌다고 스스로 위안해 봅니다.

Featured_고속도로_야경_highway-216090

처음부터 PHP7.1을 설치하는 경우 아래 글을 참조해 보세요

우분투(Ubuntu) 16.04에서 PHP 7.1 설치 및 세팅 방법

사이트 운영을 위한 안내 – 웹서버 세팅에서 워드프레스 설치까지(우분투 17.10, NGINX 1.13.6, Marian DB 10.2, PHP7.1)

7 COMMENTS

  1. 이 글이 많은 도움이 되었습니다.

    저는 Vultr에서 제공하는 WordPress App을 사용하여 서버를 설치하고 PHP 버전을 7.0으로 업그레이드했습니다. 호환성 때문에 우선 PHP 7.0으로 업그레이드했는데, PHP 7.1로의 업그레이드도 조만간 한 번 시도해볼 생각입니다.

    WordPress App에 포함된 Linux가 CentOs라서 조금 차이는 있지만 기본적인 방식은 동일한 것 같습니다.
    (http://www.thewordcracker.com/?p=34551 에서 정리해보았습니다).

    • 감사합니다.

      서버 세팅 후 PHP관련해 이것 저젓 변경한듯 싶은데 나중에는 뭘 건들었는지를 모르겠더군요.
      그러다보니 7.1로 업그레이든 한 후 7.0을 삭제하닌 에러가 나던데요.
      아마 처음 처치 후 큰 세팅 변동없이 7.1로 업그레이드하면 구번젼 삭제해도 문제가 없을 것으로 생각합니다.

    • 네 도움이 되었다니 다행입니다.

      지금 PHP7.1.10이 최신 버젼이고 오는 11월에 PHP7.2버젼이 일리즈 된다고 합니다.
      이 버젼은 성능개선 버젼은 아니지만 지금까지흘러 나오는 정보로는 7.1에 비해서도 10%이상 성능 개선이 있다고하니 7.0과 비교해서는 20%이상 개선되어 변경할 가치 충분히 힜다고 보여집니다.

  2. 그리고 만약 우분투에 nginx를 사용하고 계시다면
    # vi /etc/nginx/conf.d/default.conf

    ===================================================

    server {
    listen 80 default_server;
    server_name localhost;
    root /usr/share/nginx/html;

    location / {
    index index.php index.html;
    }

    location ~ [^/].php(/|$) {
    fastcgi_split_path_info ^(.+?.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
    return 404;
    }

    fastcgi_pass unix:/run/php/php7.1-fpm.sock; <———- 이 부분을 7.1로 변경해야합니다.
    fastcgi_index index.php;
    include fastcgi_params;
    }
    }

LEAVE A REPLY

Please enter your comment!
Please enter your name here