[워드프레스 최적화] PHP 7.4 설치 방법

|

2019년 11월 28일(미국 시간) PHP의 연례 업데이트 버젼인 PHP 7.4가 출시되었습니다. 아마도 7.4버젼을 마지막으로 2020년에는 8.0으로 메이저 업데이트가 이루어질 것으로 보입니다.

오늘은 PHP 7.4가 릴리즈된지 며칠 지나지 않았지만 과감히 업데이트를 해보고 그 결과 및 방법을 공유해 보겠습니다.

제가 사용하는 Uubuntu에서 업데이트 설치는 기존 PHP 7.3버젼 업데이트 방법과 거의 동일합니다.

1. PHP 7.4 변경 내용

뭐 새로운 버젼이 니오면 무엇이 달라졌는지, 무엇이 좋아졌는지를 살퍄보는 것이 좋겠죠.

PHP 7.4는 코드 가독성이 좋아졌 고 성능이 크게 향상되었습니다. 이러한 점은 JIT를 포함하는 등 새로운 혁신 기술이 적용된 PHP 8.0의 진정한 속도 혁신에 대한 기대를 낳게하는 중간 버젼이라고 할 수 있습니다.

PHP 7.4의 새로운점을 정리한 What’s new in PHP 7.4는 이를 아래와 같이 정리하고 있습니다. 아래 번역 내용은

  • 보다 깔끔한 원 라이너 함수를 위한 화살표 함수(arrow functions 2.0)
  • 성능 향상을 위한 사전 로드(Preloading)
  • 클래스의 유형 속성(Typed properties)
  • 유형 분산 개선
  • 속기의 null 유착 할당 연산자(null coalescing assignment operator)
  • PHP에서 더 나은 확장 개발을 위한 FFI
  • 밑줄을 사용하여 숫자 값의 형식을 지정할 수 있습니다.
  • 배열의 확산 연산자(Spread operator)

2. PHP 7.4 업데이트 설치 방법

아래 간단히 PHP 7.4 업데이트 설치 방법을 정리해 봅니다.

2.1. PPA등록

php를 설치하기 위해서는 ppa를 사용해야 합니다. ppa는 Personal Package Archive의 약자로 개인이 관련 자료를 올려놓은 저장소를 말합니다.

아마 이전 버젼의 php 설치 시 등록했을지 모르지만 다시 ppa(Personal Package Archive)를 등록해 줍니다.
php 설치 시 사용하는 ppa는 Ondřej Surý의 개인 저장소 가 가장 유명하고 많이 사용됩니다. 여기서도 Ondřej Surý의 개인 저장소를 이용할 것입니다.

이는 아래와 같은 명령을 사용해 PHP 저장소 추가 및 보안키 등록합니다.

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

2.1. 현재 적용된 PHP 패키지 확인

본격적으로 새로운 버젼을 업데이트하기전에 현재 사용하는 PHP 설치 모듈들을 확인합니다. 아시다시피 PHP는 단 하나의 프로그램이 아니라 여기에는 무수히 많은 모듈들이 있습니다. 이들을 선택적으로 필요한 것암 설치할 수 있습니다.

아래 명령을 사용하면 현재 사용중이 php관련 패키지 모듈 리스트가 주욱 뜹니다. 그리고 packages.txt에 저장이 됩니다. 이 파일은 현재 작업하고 있는 디렉토리에 저장됩니다.

# dpkg -l | grep php | tee packages.txt

2.2. PHP 7.4 설치

php 7.4 설치는 기본 모듈을 먼저 설치하고 이어서 추가로 모듈을 설치할 수도 있고, 아니면 기본 모듈과 추가 모듈을 한꺼번에 설치하도록 명령을 줄 수 있습니다.

먼저 기본 모듈 설치 명령입니다.

# apt -y install php7.4

기본 모듈 설치 후 PHP 버젼을 확인해 봅니다. php -v라는 명령어를 사용하구요. 그러면 아래와 같은 메세지가 뜹니다.

# php -v

PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0, Copyright (c), by Zend Technologies

이어서 필요한 마너지 모듈들을 설치합니다. 저는 예전부터 사용했던 아래 명령을 사용했습니다. 대부분이 모듈을 설치하는 명령어입니다.

apt-get install php7.4-bcmath php7.4-bz2 php7.4-cgi php7.4-cli php7.4-common php7.4-curl php7.4-dba php7.4-dev php7.4-enchant php7.4-fpm php7.4-gd php7.4-gmp php7.4-imap php7.4-interbase php7.4-intl php7.4-json php7.4-ldap php7.4-mbstring php7.4-mysql php7.4-odbc php7.4-opcache php7.4-pgsql php7.4-phpdbg php7.4-pspell php7.4-readline php7.4-snmp php7.4-soap php7.4-sqlite3 php7.4-sybase php7.4-tidy php7.4-xml php7.4-xmlrpc php7.4-zip  php7.4-xsl  -y

3. 세팅 수정

PHP 업데이트 버젼을 설치했으면 몇가지 설정을 바꾸어야 합니다.

3.1. php.ini 설정 변경

가장 기본적인 몇가지 php.ini를 변경합니다.

먼저 PHP Default timezone 설정할 필요가 있습니다. 이것을 하지 않으면 시스템 타임존을 사용합니다. 이를 한국 시간으로 변경합니다.

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Seoul

다음으로는 DB 용량 등등 수정합니다.

DB 용량을 수정하는 phpMyAdmin에서 DB를 백업 받고 또 필요에 따라 DB 업로드하려면 업로드 용량 확대가 필요합니다.

아마 처음 PHP를 설치하면 upload_max_filesize는 2M, post_max_size는 8M으로 설정되어 있어 금방 용량 부족으로 업로드가 불가능하게 됩니다.

또한 메모리 한계 용량도 256M 정도로 늘려줍니다.

일반적으로 DB 및 메모리 등 설정은 아래와 같은 값이 추천됩니다. 각자 형편에 따라 적절히 사용하도록 합니다.

이러한 php.ini 변경은 아래 경로 및 파일을 수정합니다. 아래는 nano 편집기를 이용해 수정하는 명령을 보여줍니다.

nano /etc/php/7.4/fpm/php.ini
upload_max_filesize = 32M 
post_max_size = 48M 
memory_limit = 256M 
max_execution_time = 600 
max_input_vars = 3000 
max_input_time = 1000

3.2. PHP 7.4 FPM Pools 수정

다음으로는 PHP 7.4 FPM 설정을 수정합니다.

마찬가지로 nano 편집기를 이용해서 www.conf 파일을 편집합니다.

nano /etc/php/7.4/fpm/pool.d/www.conf

사용자 및 그룹은 기본으로 www-data로 설정되어 있지만 사용자 이름으로 변경할 수 있습니다. 저는 그냥 www-data를 사용하기에 Pass

user = www-data  --> 필요 시 username로 변경
group =  www-data  --> 필요 시 username로 변경
listen.owner = www-data  --> 필요 시 username로 변경
listen.group = www-data  --> 필요 시 username로 변경

3.3. php handler 수정

NGINX를 사용하는 커다란 이득중의 하나이 FAST CGI를 사용한다면 php handler에서 성정하게 되어 있는데요.

PHP 업데이트 버젼을 설치했다면 php block session에서 php handler를 수정해 주어야 실제로 워드프레스는 새로운 버젼으로 작동합니다.

nginx 기준으로 변경해야하는 파일은 /etc/nginx/conf.d/default.conf 인데요. 사람에 따라선 이를 다른 이름으로 사용하는 분도 있습니다. 여러 개의 사이트를 운영하는 경우 사이트명을 변경하는 경우도 있습니다. 저도 이를 happist.com.conf라는 이름으로 사용하고 있습니다.

여 파일에서 fastcgi_pass unix:/run/php/php7.3-fpm.sock; 을 fastcgi_pass unix:/run/php/php7.4-fpm.sock; 로 바꾸어줘야 합니다. 그래야 php7.4을 인식하고 php7.4로 작동합니다

# Add PHP handler
    location ~ \.php$ {

    try_files $uri =404; # comment out this line if php-fpm is hosted on a remote machine
    include /etc/nginx/fastcgi.conf;
    fastcgi_cache WORDPRESS;
    #add_header X-Cache $upstream_cache_status;
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    --> fastcgi_pass unix:/run/php/php7.4-fpm.sock; 변경
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
        }
    }

3.4. php7.4-fpm 재시동

이러한 php.ini 설정이 끝났으면 php7.4-fpm를 재시동합니다. 그러면 변경된 옵션으로 작동할 것입니다.

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

또는 NGINX와 php7.4-fpm을 동시에 구동시킵니다.

# systemctl status php7.4-fpm nginx
● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-12-01 04:34:29 KST; 18min ago
     Docs: man:php-fpm7.4(8)
 Main PID: 15032 (php-fpm7.4)
   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
    Tasks: 3 (limit: 2318)
   CGroup: /system.slice/php7.4-fpm.service
           ├─15032 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
           ├─15048 php-fpm: pool www
           └─15050 php-fpm: pool www

Dec 01 04:34:29 vultr.guest systemd[1]: Started The PHP 7.4 FastCGI Process Manager.

● nginx.service - nginx - high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-12-01 04:34:45 KST; 18min ago
     Docs: http://nginx.org/en/docs/
  Process: 15060 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 15061 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 15072 (nginx)
    Tasks: 3 (limit: 2318)
   CGroup: /system.slice/nginx.service
           ├─15072 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─15073 nginx: worker process
           └─15074 nginx: cache manager process

Dec 01 04:34:45 vultr.guest systemd[1]: Stopped nginx - high performance web server.
Dec 01 04:34:45 vultr.guest systemd[1]: Starting nginx - high performance web server...
Dec 01 04:34:45 vultr.guest systemd[1]: nginx.service: Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory
Dec 01 04:34:45 vultr.guest systemd[1]: Started nginx - high performance web server.

4. 기존 버젼 php 삭제하기

php 버젼 업데이트 후 어느정도 안정적으로 운영되면 기존 버젼은 삭제합니다. 업그레이드 되었으면 기본 버젼은 불필요한 것은 사실이므로..

apt-get purge `dpkg -l | grep php7.3| awk '{print $2}' |tr "\n" " "`

[참고] Cannot adopt OID in UCD-SNMP-MIB 오류

PHP 업데이트 버젼을 설치 후 php7.4-fpm 궁동 상태를 체크해보면 “Cannot adopt OID in UCD-SNMP-MIB” 오류가 나타나는 경우가 있습니다.

Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in NET-SNMP-AGENT-MIB: nsNotifyRestart ::= { netSnmpNotifications 3 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laErrMessage ::= { laEntry 101 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laErrorFlag ::= { laEntry 100 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laLoadFloat ::= { laEntry 6 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laLoadInt ::= { laEntry 5 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laConfig ::= { laEntry 4 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laLoad ::= { laEntry 3 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laNames ::= { laEntry 2 }
Dec 01 04:34:29 vultr.guest php-fpm7.4[15032]: Cannot adopt OID in UCD-SNMP-MIB: laIndex ::= { laEntry 1 }

이 경우는 아래 명령어로 이런 에러가 나타나지 않토록하면 된다고 합니다.

Ubuntu typing ‘php’ in terminal shows a lot of errors

apt-get remove php7.4-snmp

그러면 아래와 같이 이런 에러메세지없는 깔끔한 결과가 출력됩니다.

# systemctl status php7.4-fpm nginx
● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-12-01 05:08:19 KST; 6s ago
     Docs: man:php-fpm7.4(8)
 Main PID: 18544 (php-fpm7.4)
   Status: "Ready to handle connections"
    Tasks: 3 (limit: 2318)
   CGroup: /system.slice/php7.4-fpm.service
           ├─18544 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
           ├─18563 php-fpm: pool www
           └─18564 php-fpm: pool www

Dec 01 05:08:19 vultr.guest systemd[1]: Stopped The PHP 7.4 FastCGI Process Manager.
Dec 01 05:08:19 vultr.guest systemd[1]: Starting The PHP 7.4 FastCGI Process Manager...
Dec 01 05:08:19 vultr.guest systemd[1]: Started The PHP 7.4 FastCGI Process Manager.

● nginx.service - nginx - high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-12-01 04:34:45 KST; 33min ago
     Docs: http://nginx.org/en/docs/
 Main PID: 15072 (nginx)
    Tasks: 3 (limit: 2318)
   CGroup: /system.slice/nginx.service
           ├─15072 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           ├─15073 nginx: worker process
           └─15074 nginx: cache manager process

Dec 01 04:34:45 vultr.guest systemd[1]: Stopped nginx - high performance web server.
Dec 01 04:34:45 vultr.guest systemd[1]: Starting nginx - high performance web server...
Dec 01 04:34:45 vultr.guest systemd[1]: nginx.service: Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory
Dec 01 04:34:45 vultr.guest systemd[1]: Started nginx - high performance web server.