5 min read

LEMP 스택 빠르게 구축하기

LEMP란? Linux + NginX + MySQL(or MariaDB) + PHP.

개발 환경을 빠르게 구축하는 것이 목적이므로, 최대한 기본 저장소에서 제공하는 패키지를 설치한다. 최신 안정 버전으로 잘 깔리더라. MySQL을 사용할지 MariaDB를 사용할지는 본인 선택이다.


우분투 설치 (PC, VM, Cloud)

Ubuntu 설치 과정은 직관적이므로 생략한다.

X11 GUI를 사용하지 않을 예정이라면 부트 타깃을 멀티유저로 바꿔주면 좋다. 한 번만 해 주면 된다.

# systemctl set-default multi-user.target

X11 GUI로 되돌리려면 부트 타깃을 graphic으로 바꿔준다.

# systemctl set-default graphic.target

우분투 패키지 저장소 추가하기

Ondrej Sury라는 저명한 개발자가 운영하는 PPA(Personal Package Archive)를 설정해 준다. 이렇게 하면 apt 명령어를 이용해서 Ondrej가 업로드 하는 최신 빌드의 Nginx와 PHP를 설치할 수 있다. 이 사람이 만든 빌드가 데비안의 공식 저장소에도 올라가니까 믿고 써도 된다.

# add-apt-repository ppa:ondrej/nginx
# add-apt-repository ppa:ondrej/php

Ondrej Sury가 제공하는 다른 패키지를 확인하려면 Ondrej의 Launchpad 웹사이트를 방문하면 된다. Apache2 등 다른 패키지도 빌드하여 제공하고 있다.


데비안 설치 (Raspberry Pi)

Raspberry Pi OS는 Debian 기반으로, Ubuntu 기반 빌드를 제공하는 PPA와 호환되지 않는다. 다행히, Ondrej는 Debian 기반 빌드 또한 제공하고 있다.

전용 이미지 프로그램을 이용하면 간단히 SD카드에 Raspberry Pi OS를 설치할 수 있다. 첫 부팅 완료 후 계정 생성, SSH 접속 설정 등 기본 설정 단계를 수행한다.

데비안 패키지 저장소 추가

아직 Debian에서는 Ubuntu PPA 만큼 편리하게 개인 저장소를 추가하는 기능은 제공하지 않고 있다. 수동으로 추가를 해 줘야 하는데, Ondrej가 제공하는 스크립트를 이용하면 상대적으로 손쉽게 이를 수행할 수 있다.

NginX - https://packages.sury.org/nginx/
PHP - https://packages.sury.org/php/

두 개의 패키지 저장소에서 README.txt 파일을 참고하여 저장소를 설정한다.
#으로 시작하는 주석을 제외한 나머지 내용을 긁어서 쉘에 붙여넣기 하면 된다.


MariaDB

MariaDB의 저장소를 추가해 준다. 공식 저장소 안내 페이지에서 리눅스 배포판과 설치하려는 MariaDB 버전, 그리고 지리적으로 가까운 미러서버를 선택한 다음 지시대로 따르면 된다.


패키지 업데이트

매번 하는 apt update && apt upgrade 과정이다. 커널 업데이트 등으로 재부팅이 필요하면 해 준다.

구형 패키지를 apt autoremove --purge 명령어로 정리해 준다.

VM을 사용한다면 이 정도에서 스냅샷을 하나 떠 두는 것도 좋은 선택지이다.


패키지 설치

PHP 확장 패키지 목록은 Cafe24 호스팅에서 지원하는 확장을 기준으로 설치하였다. 버전이 여러 개라고 오류 나면 php8.2-dba 식으로 버전을 붙여주면 된다.

# apt update
# apt install ssh nginx mariadb-server php-fpm
# php --version
PHP 8.2.9 (cli) (built: Aug 16 2023 19:49:37) (NTS)
...
# apt install php-bcmath php-bz2 php-curl php-dba php-gd php-imagick php-intl php-mbstring php-mysql php-sqlite3 php-soap php-xml php-xmlrpc php-xsl php-zip

MariaDB 초기 설정

초기 설정 스크립트를 이용해서 유닉스 소켓 인증(사용안함 권장), 루트계정 암호 설정(강력한 암호 설정 권장), 루트계정 외부접속 차단(사용 권장), 테스트DB 삭제 등등의 절차를 수행한다.

# mysql_secure_installation
...
Enter current password for root (enter for none):
...
Switch to unix_socket authentication [Y/n] n
...
Change the root password? [Y/n] y
New password: 
Re-enter new password: 
...
Remove anonymous users? [Y/n] y
...
Disallow root login remotely? [Y/n] y
...
Remove test database and access to it? [Y/n] y
...
Reload privilege tables now? [Y/n] y

사용자와 DB를 추가하고 권한을 할당해 준다. 나중에 Adminer 같은거로 해도 된다.

# mysql -u root -p
Password:
MariaDB[]> create user `username`@`%` identified by `password`;
MariaDB[]> create database `userdb`;
MariaDB[]> grant all privileges on `userdb`.* to `username`@`%`;
MariaDB[]> flush privileges;
MariaDB[]> exit;

NginX - php-fpm 연동

# nano /etc/nginx/sites-enabled/default

해당 파일에서 index 로 시작하는 구문을 찾는다. 디렉터리 주소만 요청을 받았을 때 기본적으로 보여줄 파일명을 지정하는 구문이다. index.php 를 적당히 추가해 준다.

다음으로 location ~ \.php$ { 로 시작하는 블럭을 찾아서 주석을 풀어준다.

fastcgi_pass 구문이 두 개가 있을 건데, 우리는 php-fpm을 사용한다. TCP 소켓으로 되어 있는 줄은 다시 주석처리 해 준다.

마지막으로 php7.4-fpm.socks 로 되어 있는 것을 php8.2-fpm.socks 식으로 PHP 버전에 맞게 바꿔 준다. 경로는 건들지 않아도 된다.

nginx를 재시작한다.

# systemctl restart nginx

테스트

/var/www/html 디렉터리에 다음 내용으로 phpinfo.php 파일을 만들어 준다.

<?php
phpinfo();
?>

다른 컴퓨터에서 접속해 본다. It should work!