Ubuntu 서버 16.04에 LEMP 스택 설치하기 (Nginx, MySQL, PHP)

LEMP 소프트웨어 스택은 동적 웹 어플리케이션을 구현하기 위해서 필요한 Linux + Nginx + MySQL + PHP를 모아서 부르는 말이라고 합니다. (LNMP가 아니고 LEMP인게 특이하네요.) Nginx 서버 대신에 Apache 서버로 구성된 LAMP 스택도 있습니다.

이 포스팅에서는 Ubuntu 16.04 서버에 LEMP 스택을 설치하는 방법에 대해서 소개합니다. 이후 작업을 위해서 필요한 기본적인 셋업은 Ubuntu 서버 16.04 초기설정 가이드에서 다루고 있습니다. 서버가 없는 경우 VULTR를 통한 가상서버(VPS) 호스팅를 참고하시기 바랍니다.

이전 버전이 Ubuntu 14.04를 사용하신다면 이곳을 참고하시기 바랍니다.


1단계. Nginx 웹 서버

Apache 서버의 대안으로 떠오르고 있는 Nginx 서버를 설치해보도록 하겠습니다. Apache와의 성능을 비교했을때 확실한 우위를 가지고 있고 많은 관점에서 모던함이 묻어나는 프로젝트입니다.

앞으로 패키지의 설치는 apt 명령어를 통해 이루어집니다. 이전 버전에서 apt-get 등의 여러 명령어로 되어 있던 것이 하나로 합쳐졌습니다. 다음과 같이 패키지 목록 업데이트를 한 후에 Nginx를 설치합니다. 포스팅 시점 기준으로 1.10.0 버전이 설치되게 됩니다.

$ sudo apt update
$ sudo apt install nginx

이전 포스트에서 활성화한 ufw 방화벽에서 허용하려면 다음과 같이 입력합니다.

$ sudo ufw allow 'Nginx HTTP'

이제 Nginx 서버가 동작하게 됩니다. 브라우저에서 서버의 도메인이나 IP 주소를 입력해서 제대로 동작하는지 확인해 봅니다. 외부 IP 주소를 모른다면 다음과 같이 입력합니다.

$ curl -4 icanhazip.com

Welcome to Nginx


2단계. MySQL

이제 웹 서버의 데이터를 저장할 수 있는 MySQL 데이터베이스를 설치해보도록 하겠습니다.

$ sudo apt install mysql-server

포스팅 시점 기준으로 5.7 버전 설치 화면이 진행되고, MySQL root 계정의 비밀번호를 입력하는 화면이 나옵니다. 사용하실 비밀번호를 입력합니다.

다음으로 보안 강화를 위해서 기본값들을 변경해주는 스크립트를 다음과 같이 실행합니다.

$ sudo mysql_secure_installation

처음에 VALIDATE PASSWORD PLUGIN에 대해서 물어보게 되는데, 안전한 비밀번호 사용을 강제화할 것인지를 선택할 수 있습니다. LOW, MEDIUM, HIGH의 총 3단계가 있습니다. STRONG을 선택할 경우 숫자, 대소문자, 특수문자를 모두 포함해야 비밀번호를 지정할 수 있게 됩니다.

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

이제 root 비밀번호를 변경할지 물어봅니다. 변경하지 않을 경우 n을 입력합니다.

Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

이후에 나오는 항목들은 테스트 DB 삭제 등을 물어보는데 모두 y를 선택하시면 됩니다.

root 유저가 아닌 새로운 사용자를 추가하려면 먼저 다음과 같이 입력하여 MySQL에 접속합니다.

$ mysql --user=root mysql -p

MySQL 명령창에서 다음 명령어를 한 줄씩 입력합니다. {유저-아이디}{비밀번호} 부분은 적절한 값으로 입력합니다.

CREATE USER '{유저-아이디}'@'localhost' IDENTIFIED BY '{비밀번호}';
GRANT ALL PRIVILEGES ON *.* TO '{유저-아이디}'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

이제 MySQL을 종료합니다.

exit

3단계. PHP

Nginx 서버와 MySQL 데이터베이스를 연결해주는 스크립팅 런타임이 필요합니다. Nginx는 다른 웹서버와 같이 PHP를 네이티브로 지원하지 않기 때문에 fastCGI process manager(FPM)으로 구현되어 있는 php7.0-fpm을 설치해야 합니다.

Ubuntu 16.04에는 PHP 7.0을 기본적으로 설치할 수 있게 되어 있습니다. PHP 7.0은 5.x 버전대와 비교했을 때, 특정 상황에서 2-3배의 속도 향상이 있다고 합니다.

$ sudo apt install php-fpm php-mysql

이제 설정파일 편집을 위해 다음과 같이 입력합니다.

$ sudo vi /etc/php/7.0/fpm/php.ini

cgi .fix_pathinfo 부분을 찾아 앞에 주석(;)을 삭제하고 값을 1에서 0으로 변경합니다. 1의 경우 PHP 파일을 찾을 수 없을 경우 근접한 파일을 찾아서 실행하게 되므로 보안이 취약하게 됩니다.

cgi.fix_pathinfo=0

저장 후 다음과 같이 입력하여 PHP FPM을 재시작합니다.

sudo systemctl restart php7.0-fpm

4단계. PHP를 위한 Nginx 서버 설정

이제 필요한 모든 컴포넌트는 설치되었습니다. 이제 Nginx 서버 설정에서 .php 파일을 처리해주는 부분만 적용하면 됩니다. /etc/nginx/sites-available/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.html 앞에 index.php를 추가합니다.
  • server_name에 도메인 이름이나 IP 주소를 입력합니다.
  • PHP 경로를 구성합니다.
  • Apache와 폴더를 공유할 경우를 대비해 .ht 관련 설정을 합니다.
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 server_domain_or_IP;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

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

수정된 설정파일에 {가 맞지 않는다던가 사소한 오타가 있으면 Nginx가 실행되지 않으므로 다음과 같이 입력하여 오류 여부를 확인합니다.

$ sudo nginx -t

이상이 없으면 다음과 같이 입력하여 서버를 재시작합니다.

sudo systemctl reload nginx

5단계. PHP 정상동작 테스트

이제 LEMP 스택이 모두 설치되었고 정상 동작하고 있습니다. 확인을 위해서 /var/www/html/info.php 파일에 만들고 다음과 같이 입력합니다.

<?php
    phpinfo();

이제 주소창에 다음과 같이 입력하면 PHP 정보 화면을 볼 수 잇게 됩니다.

http://{서버-IP-또는-도메인}/info.php

정상적으로 표시되는 것이 확인되었다면, 이 파일은 그대로 두면 보안상 좋지 않으므로 다음과 같이 입력하여 파일을 삭제합니다.

$ sudo rm /var/www/html/info.php

이제부터는 사용할 앱 스택에 따라 맞는 환경을 설정하면 됩니다.

comments powered by Disqus