LEMP스택 설치: NGINX 웹서버에 PHP 7 설치하기 및 설정 (PHP7.2-FPM)

8

시리즈 연재작의 일환으로 이번글에서는 리눅스 우분투서버에 PHP 7을 설치하면서 아래와 같은 내용을 알아볼 것입니다.

php 웹 프로그래밍을 위해서는 가장 중요한 것이 웹서버가 .php 파일을 해석할 수 있어야합니다. 연재작의 이전 단계에서 설치했던 nginx는 아파치와는 다르게 html 같은 기본적인 마크업 언어의 파일만 해석할 수 있을 뿐 php파일은 해석하지 못하는데요. 이를위해서 nginx + php 조합에서는 php-fpm 이란 것이 대신 해석해준다고 합니다. 그래서 이번에 설치할 것은 php뿐만이 아닌 php-fpm 이라는 것을 설치해야하는데요. php-fpm 설치만으로도 php가 설치됩니다.

 

php는 5.6 에 비해서 7버전이 성능향샹이 크다고하는데요. 제가 이글을 쓰고 있는 시점에서 7.2버전이 정식으로 릴리즈되었습니다. 그래서 7.2버전을 설치하려고합니다. 7.2버전은 7.0을 필요로 하므로 7.0버전도 설치된다고 보시면 됩니다. ( 7.0 설치를 원한다면 아래 내용중에 7.2로 쓰여진 내용은 7.0으로 바꿔 작업하시면 됩니다.)

apt: 현재 서버에 설치가능한 php 버전 정보 살펴보기

php-fpm 설치는 apt 프로그램을 사용해 설치할 건데요. 전에도 언급했듯 apt는 각각의 패키지를 설치할 수 있는 인터넷주소를 리스트로 가지고 있고 우분투 16.04 의 apt는 기본적으로 php 7.0 버전에 대한 설치정보를 가지고 있습니다. 그러므로 apt에 php 7.2버전에대한 설치정보를 먼저 업데이트 해줘야합니다. 그 전에 현재가진 정보를 살펴볼까요?

아래 명령어를 입력함으로써 apt의 리스트에서 php 설치정보만 살펴 볼 수 있습니다.

apt-cache policy php

apt-cahe 명령어로 현재 설치가능한 php 버전 보기

위 그림처럼 Candidate: 1:7.0+… 처럼 정보가 나오면서 php 7.0 버전 설치정보가 나오게 됩니다.

이상태에서는 아래 명령어로 7.0버전의 fpm을 바로 설치할 수 있지만 저는 7.2버전을 원하므로 입력하지 않겠습니다.

sudo apt-get install php7.0-fpm

php 7.2 버전 설치준비를 위해 apt 리스트 업데이트 하기

먼저 apt에 7.2버전 다운로드 저장소를 추가하기위해 아래명령어를 입력합니다. 

sudo add-apt-repository ppa:ondrej/php

apt 레파지토리 업데이트 시작

 

위처럼 Press [ENTER] to continue… 라는 글자가 나올 때 계속하려면 엔터키(리턴키), 취소하려면 control + c 를 누르는데 엔터키를 누르고 설치를 진행합시다.

 

그리고 완료되면 아래 명령어를 입력해서 apt의 패키지 정보를 업데이트합니다.

sudo apt-get update

 

apt의 리스트에서 php 정보를 다시확인해보면 7.2 버전이  추가된 걸 볼 수 있습니다.

sudo apt-cache policy php
apt policy php 보기
candidate 버전이 7.2

php 7.2 fpm과 주요모듈 설치하기

이제 아래 명령어를 통해서 7.2버전을 설치합니다.

sudo apt-get install php7.2-fpm

초반에 Do you want to continue? 라는 질문이 나올때 Y를 입력후 엔터키를 눌러 계속 진행합니다.

php 7.2 fpm 설치 명령어

 

설치가 완료되면 이번엔 자주쓰이는 중요한 php 모듈을 설치합니다. 아래 명령어는 php7.2-cliphp7.2-curlphp7.2-mysql 등 여러가지 모듈을 나열해서 한번에 설치합니다.

sudo apt-get install php7.2-cli php7.2-curl php7.2-gd php7.2-mysql php7.2-mbstring zip unzip

php 모듈을 설치 중

 

설치된 php를 확인하려면 아래 명령어를 통해 설치된 php의 버전을 확인해보면 되겠습니다.

php -v
php 버전확인
PHP 7.2.7 이 설치되어있음을 확인

그리고 php-fpm을 시작해줍니다.

sudo service php7.2-fpm start

PHP해석을 위한 NGINX 설정 및 보안설정

이제 Nginx가  php파일을 해석,처리하도록 적용하기 위해는 설정파일을 수정해줘야합니다. 설정파일은 아래위치 중 하나인데요. apt를 통해 설치했으므로 두 번째 경로에 있을 것입니다.

  • /etc/nginx/conf.d/default.conf
  • /etc/nginx/sites-available/default

리눅스서버의 /etc/nginx/sites-available/위치에서 default  파일을 찾아볼수 있을 것입니다.

ls -l 명령어로 살펴본 sites-available

 

이 파일을 수정해야하는데 소유자는 root이고 사용자그룹또한 root라서 현재로선 SFTP 를 통해 편집할 수 없습니다. sudo 명령어를 통해 nano 나 vim 등 CLI 텍스트 편집기를 이용할 수도 있겠지만 파일내용도 길고 CLI가 익숙하지 않다면 번거로울텐데요. 조금 편해지기위해 아래 명령어를 입력해서 이 파일의 사용자그룹을 ubuntu로 바꾸고 권한도 664 또는 775를 부여해줍니다.

$ sudo chgrp ubuntu /etc/nginx/sites-available/default
$ sudo chmod 664 /etc/nginx/sites-available/default

위처럼 default 파일의 사용자그룹을 ubuntu로 변경하고 그룹에게 편집권한을 주면 SFTP로 접속한 ubuntu 사용자로도 편집할 수 있고 나중에 이 설정파일을 변경할때 자신이 원하는 텍스트편집기를 사용할 수 있어서 편리할 것입니다.

default 파일에 대한 사용자그룹과 사용자권한 변경
SFTP에서도 이파일을 편집하기 위함입니다.

 

아래는 SFTP 클라이언트 Transmit 5에서 확인해본 default 파일입니다. 이제 파일을 열어 편집을 시도해봅시다.

default 파일의 위치를 transmit 에서 확인

 

default 파일 내용
Atom 편집기에서 연 default 파일

이 파일 내용 중에서 앞에 #기호가 붙은건 동작하지 않는 ‘주석’입니다. 주석을 모두 제거하고나면 아래같은 내용입니다.

server {
    listen 80 default_server; 
    listen [::]:80 default_server;
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
    server_name _;

    location / {
      try_files $uri $uri/ =404;
   }

}

이 중에서 index index.html index.htm index.nginx-debian.html; 이라고 쓰여진 부분이 nginx가 처리할 파일 종류를 나열한 것입니다. 우선순위와 같은 것인데요. 이곳에 index.php 를 추가해줍니다.

index index.php index.html index.htm index.nginx-debian.html;

 

그 다음으로 PHP의 설정파일 경로와 보안설정을 지정하여 아래처럼 추가해줍니다. 

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include fastcgi_params;
    fastcgi_read_timeout 300;
}

참고: 위 내용에서 php7.2-fpm.sock 파일 이름은 php7.0을 설치했을 경우엔  php7.0-fpm.sock이 됩니다. 

참고: php7.2-fpm.sock 파일은 php-fpm 설치후 위에서 php-fpm을 시작하는 명령어를 입력했을 때 만들어진 것인데요.  /etc/php/7.2/fpm/pool.d/www.conf  파일의 내용 중에 listen = /run/php/php7.2-fpm.sock 라는 부분이 쓰여져있습니다. 이 줄이 실행되면서 /run/php/ 디렉토리에 만들어지는 것입니다.

 

그리고 아래내용도 추가합니다.

location ~ /\.ht {
    deny all;
}

참고: 위 내용은 차후 아파치 웹서버와 document root (사이트루트 폴더)를 공유할 것을 대비하여 .htaccess 파일에 접속하지 못하도록 해주는 설정이라고 합니다.

 

그러면 설정파일인 default 파일의 전체내용은 아래와 같습니다. 차후에 도메인과 HTTPS를 추가하게 될텐데요. 그 때 여러분은 이곳에 여러 설정을 또 추가작성하게 될 겁니다.

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 
    root /var/www/html; 
    index index.php index.html index.htm index.nginx-debian.html ; 
    server_name _;

    location / {
      try_files $uri $uri/ =404; 
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
       fastcgi_pass unix:/run/php/php7.2-fpm.sock;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params; 
       fastcgi_read_timeout 300;
    }

   location ~ /\.ht {
     deny all;
   }
}

참고: 위파일은 nginx 라우팅설정용 파일인데요. 더 알고 싶다면 nginx 설정파일에대한 더 상세한 지식 글을 참고할 수 있습니다.

 

이제 파일을 저장해줍니다. CLI 명령어 입력으로 돌아와서 nginx 설정파일들의 문법 에러가 없는지 아래명령어로 확인해주세요.

sudo nginx -t

그러면 아래처럼 syntax is oksuccessful 메시지가 나오면 conf 파일을 포함한 모든 설정파일에 문법 문제는 없는 것입니다.

nginx 설정파일 신텍스 에러가 없는지 확인. syntax is ok 그리고 test is successful 이라고 나왔다.

위 테스트가 성공적이라면 아래 명령어 중 아무거나 하나를 써서 nginx 를 재시작해줍니다.

sudo systemctl reload nginx
sudo service nginx restart

nginx의 PHP 해석 테스트 해보기

이제 도큐멘트 루트 디렉토리(웹사이트 루트)에 .php 파일을 만들어 잘 해석되는지 확인해봅시다. /var/www/html 폴더 안에 index.php 파일을 만들고 텍스트편집기로 열어 그 내용을 아래처럼 작성 후 저장해줍니다.

<?php phpinfo(); ?>

index.php 파일을 만들었다

 

php 코드중 phpinfo() 함수는 설치된 php 정보를 출력해주는 함수입니다. 이제 자신의 서버 IP 주소를 웹브라우저 URL 주소란에 적어 접속해주세요. 아래같은 화면이 나오게 되면 php가 잘 해석되는 것입니다.

php 정보들이 나열되어있는 표
성공!

잘 나오나요? 축하합니다. 

php 타임존 시간대 설정 바꾸기

연재작의 앞단계 글에서 우분투 서버의 시스템 시간을 서울로 설정했었는데요.  php 코딩할때 시간관계된 코딩을 해야할 수도 있습니다. php 설정파일에서 별도 설정을 하지 않으면 컴퓨터시간을 따르긴하지만 안타깝게도 php 7.x 버전에서는 시스템 시간이 서울일경우 php 상에서는 평양으로 나오는 문제가 있습니다. 에러로그 파일도 평양으로 기록됩니다. 북한과의 평화협정으로 평양과 서울의 시간은 같아졌을 지라도 영 찝찝한 기분은 어쩔 수 없을 겁니다. 그래서 php 설정시간도 서울시간으로 바꿔주려합니다. 그러기위해서는 아래 두 파일을 수정해야합니다.

  • /etc/php/7.2/fpm/php.ini
  • /etc/php/7.2/cli/php.ini

그런데 이 파일들에 대한 수정권한이 또 root만 가지고 있습니다(644). 간단한 수정이니 이번엔 CLI에서 root로 수정하겠습니다. 아래 명령어를 입력해 nano 편집기로 해당파일을 엽니다.

sudo nano /etc/php/7.2/fpm/php.ini

아래처럼 그 내용이 나올겁니다. 

수많은 주석으로 시작하는 앞부분. 전체내용은 2천줄에 달한다
php.ini 파일내용의 앞부분

위 파일의 전체내용은 약 2천줄이므로 찾기를 통해 수정할 부분을 빠르게 찾아봅시다. control + w 키를 누르면 아래처럼 검색할 수 있습니다.

검색 입력란에 ;date.timezone = 을 입력했다

위 그림의 아래처럼 Search: 상자가 나오면 위 처럼 ;date.timezone =를 입력후 엔터키를 눌러주면 아래 그림 처럼 해당 텍스트가 위치한 곳으로 커서가 이동합니다.

;date.timezone = 이라고 써진 라인으로 이동된 모습

 

세미콜론(;) 이 앞에 붙은건 주석으로써 해당 설정이 아무 기능도 못하게되는데요. 아래 그림처럼 주석처리를 제거하고 date.timezone = Asia/Seoul으로 수정해줍니다.

date.timezone = Asia/Seoul 이라고 수정됨

이제 저장하고 나가야겠죠? 연속해서 control + x 키를 누르고, Y키를 누른다음 엔터키를 누르면 저장된뒤 nano 편집기를 빠져나갑니다.

다음으로 아래명령어를 이용해 두번째 파일도 수정해줍니다.

sudo nano /etc/php/7.2/cli/php.ini

파일이 열리면 위 파일과 마찬가지로  control + w 를 누르고  ;date.timezone =를 입력후 엔터키를 입력해 해당 줄을 찾아 그 줄의 주석을 해제하고 date.timezone = Asia/Seoul로 바꾼뒤 연속해서 control + x 키를 누르고, Y키를 누른다음 엔터키를 눌러 저장하고 끝냅니다.

두 파일을 모두 수정했다면 그런 다음 아래 명령어로 PHP-FPM을 재시작 해줍니다. 

sudo systemctl restart php7.2-fpm

 

이제 다시 웹브라우저에서 접속해서 새로고침해보면 php 정보 내용중 timezone 항목이 아래처럼 서울로 바뀌어있을 것입니다.

표에서 디폴트 타임존이 서울로 되어있다

마무리로 현재 /var/www/html 디렉토리(웹 루트폴더)에 있는 두파일은 아래와 같을 겁니다. phpinfo() 등으로인해 서버정보가노출되므로 이 두 파일은 삭제해주세요.

  • index.nginx-debian.html (nginx 설치하면 기본으로 있는 것)
  • index.php (위에서 phpinfo() 정보를 출력하기위해 잠시 만들었던 것)

그 뒤 /var/www/html 폴더에 아무것도 없다면 웹브라우저에서 접속했을 때 403 Forbidden 메시지가 나오는 건 정상입니다. 이제 이곳에 index.php 파일을 만들어 php 코딩을 시작할 수 있습니다.

다음단계

 다음단계에서는 Maria DB를 추가로 설치하도록 하겠습니다. 다음으로 넘어가기전 지금이 서버를 임시로 백업 해두기 좋은 시점입니다. 아마존 라이트세일을 사용한다면 스냅샷 기능 사용방법을 참고해보세요.

8 댓글

  1. “apt: 현재 서버에 설치가능한 php 버전 정보 살펴보기” 하단 명령어에서 policy가 polcy로 i가 도망갔어요… ㅎㅎ 🙂 저처럼 카피앤페이스트 하다가 당황하는 초보자들을 위하여…

  2. 안녕하세요.
    홈페이지 리뉴얼하셨군요.
    훨신 깔끔하고 보기 좋습니다.

    다름이아니라 PHP 관련 에러가 발생해서 PHP글을 찾다가 여기에 글을 남기네요.
    오늘 로코 트랜스레이트 플러그인 번역 작업 중에 아래와 같은 문구가 발생했습니다.

    Loco requires the “dom” PHP extension. Ask your hosting provider to install it.

    검색을 해보니 php xml이라는 것을 설치하면 될 것 같은데요

    발견한 명령어는 apt-cache search php-dom 입니다.

    올바른 명령어인가요?

    혹시 우분투 16.04 + LEMP 스택이 설치된 서버에는 명령어의 어떤 부분이 달라야하는지 궁금합니다.

  3. 안녕하세요. 쓰신 글들을 보고 많은 도움을 받고 있습니다.
    저는 얼마전 아마존라이트세일에 가입하고 워드프레스를 설치하고 있는데요.
    php 업데이트를 하려고 하는데, 어떻게 하는지 잘 모르겠더라고요. (왕초보입니다 ㅠㅠ)
    위 글을 보고 시도하고 싶어도, 혹시 잘못하면 어쩌나 걱정도 되고 해서 이러지도 저러지도 못하고 있는 상황입니다. ㅠㅠ
    최신 버전으로 업데이트하려면 어떻게 하면 될지요?

    • 소프트웨어 버전은 업그레이드와 업데이트를 구분해서 생각할 필요가 있습니다

      php5, php7 처럼 뒷숫자는 메이저 버전 넘버링입니다.
      마이너 버전은 소수점 뒤에 따라오는 번호인데 보통
      php 7.2.0 과 같은 형태죠.

      php 5, php 7 처럼 메이저 넘버링이 바뀌는 경우 ‘업그레이드’, 마이너 버전 넘버링이 올라가는 경우 ‘업데이트’로 볼 수 있습니다.

      메이저 넘버링이 올라가는 ‘업그레이드’는 리스크가 큽니다. 이전 버전과 호환이 안되는 부분이 많기 때문에 메이저 넘버링을 올리는 거거든요.

      웹서버나 DB, 워드프레스등의 버전도 호환되는 버전으로 맞춰주지 않으면 서버가 제대로 동작하지 않습니다. 그러므로 업그레이드를 할 것이라면 반드시 백업후 복원 방법을 모색해놓고 하거나 새로운 서버에서 테스트를 해봐야합니다.

      마이너 버전이 올라가는 업데이트는 상대적으로 리스크가 크진 않지만 그래도 여전히 문제는 있을 수 있습니다.

      새로운 버전을 설치하는 건 본문의 내용과 별다르진 않습니다.

      PPA에서 apt 레파지토리로 설치가능한 php 리스트 받기
      sudo add-apt-repository ppa:ondrej/php
      참고: PPA는 인터넷 다른곳의 저장소인데 공식은 아니지만 믿을만 하고 자주쓰이는 곳입니다.

      apt 레파지토리의 패키지 정보를 업데이트
      sudo apt-get update

      apt 레파지토리 리스트에서 php 정보 확인: 설치된 것, 설치 할 수 있는 것
      sudo apt-cache policy php

      그리고 버전 번호에 맞춰서 삭제, 설치하면 됩니다.

      설치된 버전(여기서는 7.0) 삭제 (선택사항. 여러 버전이 설치되어있다면 nginx 설정으로 바꿀 수 있음)
      sudo apt-get remove php7.0-fpm

      그리고 php 7.2 버전 설치 및 주요 모듈 설치 부터 따라하시면 되겠네요.
      https://swiftcoding.org/installing-php7-2-fpm#install

      그리고 본문에 나온 것처럼 nginx 설정을 해당 버전으로 바꾸면 됩니다.

댓글은 익명이나 SNS, wordpress.com 로그인 지원). 마크다운 문법 사용가능(Shift+~ 키로 특정문구 혹은 위아래 ~~~으로감싸서 여러줄을 코드블락으로 작성)