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

 

시리즈 연재작의 일환으로 이번글에서는 리눅스 우분투서버에 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;
}

참고: 위 내용에서 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; 
    }

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

참고: 위파일은 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를 추가로 설치하도록 하겠습니다. 다음으로 넘어가기전 지금이 서버를 임시로 백업 해두기 좋은 시점입니다. 아마존 라이트세일을 사용한다면 스냅샷 기능 사용방법을 참고해보세요.

Post Author: 스위프트

코딩과 글쓰기는 객체 지향적으로. 새로운 댓글을 기다립니다. 주저말고 댓글을 다십시오.

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

    Elly Han

    (2018-08-16 - 07:14)

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

댓글을 남겨주세요.