서버 설치 · 8 min read · Oct 12, 2025

Ubuntu 22.04에 Nginx, PHP 및 MySQL (LEMP 스택) 설치하는 방법

LEMP 소프트웨어 스택은 서버가 PHP로 작성된 동적 웹사이트 및 앱을 호스팅할 수 있도록 하는 오픈 소스 소프트웨어 그룹입니다. 이는 Linux, Nginx (발음은 Engine-X), MySQL 및 PHP의 약어입니다.

이 가이드는 Ubuntu 22.04 서버에 LEMP 스택을 설치하는 방법을 보여줍니다. 또한 phpMyAdmin과 같은 애플리케이션을 설치하는 방법도 배울 수 있습니다.

전제 조건

  • Ubuntu 22.04를 실행하는 서버.
  • sudo 권한이 있는 비루트 사용자.
  • 간단한 방화벽(UFW)이 활성화되어 실행 중입니다.
  • 모든 것이 업데이트되었습니다. $ sudo apt update && sudo apt upgrade

1단계 - 방화벽 구성

패키지를 설치하기 전에 첫 번째 단계는 방화벽을 구성하여 HTTP 및 HTTPS 연결을 허용하는 것입니다.

방화벽 상태를 확인하세요.

$ sudo ufw status

다음과 같은 내용을 볼 수 있어야 합니다.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

HTTP 및 HTTPS 포트를 허용합니다.

$ sudo ufw allow http
$ sudo ufw allow https

확인을 위해 상태를 다시 확인하세요.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

2단계 - PHP 설치

Ubuntu 22.04는 기본적으로 PHP 8.1을 포함하고 있습니다. 다음 명령어를 실행하여 설치할 수 있습니다.

$ sudo apt install php-fpm php-cli php-mysqlnd php-mbstring php-xml php-gd

PHP의 MySQL, CLI, GD, Mbstring 및 XML 확장을 설치했습니다. 필요에 따라 추가 확장을 설치할 수 있습니다.

최신 버전의 PHP를 항상 유지하거나 여러 버전의 PHP를 설치하려면 Ondrej의 PHP 저장소를 추가하세요.

Ondrej의 PHP 저장소를 추가합니다.

$ sudo add-apt-repository ppa:ondrej/php

이제 원하는 PHP 버전을 설치할 수 있습니다.

$ sudo apt install php8.0-fpm php8.0-cli

설치된 PHP 버전을 확인하세요.

$ php --version
PHP 8.1.2 (cli) (built: Jun 13 2022 13:52:54) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies

3단계 - MySQL 설치

Ubuntu 22.04는 최신 버전의 MySQL을 포함하고 있습니다. 단일 명령어로 설치할 수 있습니다.

$ sudo apt install mysql-server

MySQL 버전을 확인하세요.

$ mysql --version
mysql  Ver 8.0.29-0ubuntu0.22.04.2 for Linux on x86_64 ((Ubuntu))

이 단계는 MySQL 버전 8.0.28 이상에 필요합니다. MySQL 셸에 들어갑니다.

$ sudo mysql

루트 사용자에 대한 비밀번호를 설정하는 다음 명령어를 실행하세요. 숫자, 대문자, 소문자 및 특수 문자가 혼합되어 있는지 확인하세요.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';

셸을 종료합니다.

mysql> exit

MySQL 보안 설치 스크립트를 실행합니다.

$ sudo mysql_secure_installation

비밀번호 유효성 검사 구성 요소를 설치할 것인지 묻는 메시지가 표시됩니다. MySQL에서 사용되는 비밀번호의 강도를 확인합니다. 설치하려면 Y를 누르세요.

다음으로 비밀번호 유효성 검사 정책의 수준을 설정하라는 메시지가 표시됩니다. 가장 강력한 2를 선택하세요.

다음으로 루트 비밀번호를 입력하세요. 변경을 거부하려면 N을 누르세요.

익명 사용자를 제거하고 원격 루트 로그인을 허용하지 않으며 테스트 데이터베이스를 제거하고 권한 테이블을 다시 로드하려면 Y를 누르세요.

4단계 - MySQL 구성

MySQL 셸에 로그인합니다. 프롬프트가 표시되면 루트 비밀번호를 입력하세요.

$ sudo mysql -u root -p

샘플 데이터베이스를 생성합니다.

mysql> CREATE DATABASE exampledb;

SQL 사용자 계정을 생성합니다.

mysql> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';

사용자에게 데이터베이스에 대한 모든 권한을 부여합니다.

mysql> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';

사용자 권한을 플러시합니다.

mysql> FLUSH PRIVILEGES;

셸을 종료합니다.

mysql> exit

새로 생성된 사용자로 MySQL 셸에 다시 로그인합니다.

$ sudo mysql -u exampleuser -p

테스트 테이블을 생성합니다.

mysql> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );

테스트 데이터를 삽입합니다.

mysql> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");

더 많은 항목을 추가하려면 위 명령을 별도로 반복하세요. 테이블의 내용을 확인하려면 다음 명령을 실행하세요.

mysql> SELECT * FROM exampledb.name_list;

다음과 같은 출력을 받게 됩니다.

+-----+---------+
| sno | content |
+-----+---------+
|   1 | Navjot  |
|   2 | Adam    |
|   3 | Josh    |
|   4 | Peter   |
+-----+---------+
4 rows in set (0.00 sec)

MySQL 셸을 종료합니다.

mysql> exit

5단계 - Nginx 설치

Ubuntu 22.04는 이전 버전의 Nginx를 포함하고 있습니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

Nginx의 서명 키를 가져옵니다.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginx의 안정적인 버전 저장소를 추가합니다.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

시스템 저장소를 업데이트합니다.

$ sudo apt update

Nginx를 설치합니다.

$ sudo apt install nginx

설치를 확인합니다.

$ nginx -v
nginx version: nginx/1.22.0

6단계 - PHP-FPM 구성

php.ini를 열어 편집합니다.

$ sudo nano /etc/php/8.1/fpm/php.ini

파일 업로드 크기를 설정하려면 upload_max_filesizepost_max_size 변수의 값을 변경하세요.

upload_max_filesize = 50M
...
post_max_size = 50M

서버 리소스 및 요구 사항에 따라 PHP의 메모리 제한을 구성하세요.

memory_limit = 256M

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

파일 /etc/php/8.0/fpm/pool.d/www.conf를 엽니다.

$ sudo nano /etc/php/8.0/fpm/pool.d/www.conf

PHP 프로세스의 Unix 사용자/그룹을 nginx로 설정해야 합니다. 파일에서 user=www-datagroup=www-data 줄을 찾아 nginx로 변경하세요.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = nginx
group = nginx
...

또한 파일에서 listen.owner=www-datalisten.group=www-data 줄을 찾아 nginx로 변경하세요.

listen.owner = nginx
listen.group = nginx

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

PHP-fpm 프로세스를 재시작합니다.

$ sudo systemctl restart php8.1-fpm

7단계 - phpMyAdmin 설치

영어 버전의 phpMyAdmin 아카이브 파일을 다운로드합니다.

$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-english.tar.gz

사이트를 위한 공개 디렉토리를 생성합니다.

$ sudo mkdir /var/www/html/example.com -p

아카이브를 공개 디렉토리에 추출합니다.

$ sudo tar -xzvf phpMyAdmin-5.2.0-english.tar.gz -C /var/www/example.com

공개 디렉토리로 전환합니다.

$ cd /var/www/html/example.com

추출된 디렉토리의 이름을 보안을 강화하기 위해 불분명한 것으로 변경합니다.

$ sudo mv phpMyAdmin-5.2.0-english sm175

8단계 - phpMyAdmin 구성

샘플 구성 파일을 복사합니다.

$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php

구성 파일을 열어 편집합니다.

$ sudo nano sm175/config.inc.php

$cfg['blowfish_secret'] = ''; 줄을 찾아 쿠키 기반 인증을 위한 32자 랜덤 문자열을 입력하세요.

phpSolved의 온라인 블로우피시 생성기를 사용하거나 명령줄을 통해 생성할 수 있습니다.

값을 복사하여 다음과 같이 붙여넣습니다.

$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

사이트와 phpMyAdmin의 소유권을 Nginx 서버로 변경합니다.

$ sudo chown -R nginx:nginx /var/www/html/example.com

phpMyAdmin의 설정 디렉토리를 삭제합니다.

$ sudo rm -rf /var/www/html/example.com/sm175/setup

9단계 - Opcache 구성

Opcache는 PHP의 캐싱 시스템입니다. 미리 컴파일된 스크립트 바이트코드를 메모리에 저장하여 사용자가 페이지를 방문할 때마다 더 빠르게 로드됩니다. Opcache는 기본적으로 설치되어 있습니다. 확인하려면 PHP 버전을 확인하세요.

$ php --version
PHP 8.1.2 (cli) (built: Jun 13 2022 13:52:54) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies

이것은 Opcache가 설치되어 있고 사용 가능하다는 것을 알려줍니다. 여기에서 표시되지 않으면 다음 명령어를 실행하여 수동으로 설치할 수 있습니다.

$ sudo apt install php-opcache

Opcache 설정을 변경하려면 /etc/php/8.1/fpm/conf.d/10-opcache.ini 파일을 열어 편집합니다.

$ sudo nano /etc/php/8.1/fpm/conf.d/10-opcache.ini

다음 설정은 Opcache 사용을 시작하는 데 도움이 되며 일반적으로 좋은 성능을 위해 권장됩니다. 세미콜론을 제거하여 주석을 해제하여 구성을 활성화할 수 있습니다.

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

10단계 - SSL을 위한 Certbot 설치

Let’s Encrypt에서 제공하는 무료 SSL 인증서를 생성하기 위해 Certbot을 설치해야 합니다.

Ubuntu의 저장소를 사용하여 Certbot을 설치하거나 Snapd 도구를 사용하여 최신 버전을 가져올 수 있습니다. 우리는 Snapd 버전을 사용할 것입니다.

Ubuntu 22.04는 기본적으로 Snapd가 설치되어 있습니다. 다음 명령어를 실행하여 Snapd 버전이 최신인지 확인하세요.

$ sudo snap install core
$ sudo snap refresh core

Certbot을 설치합니다.

$ sudo snap install --classic certbot

다음 명령어를 사용하여 Certbot 명령이 /usr/bin 디렉토리에서 실행될 수 있도록 심볼릭 링크를 생성합니다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

11단계 - 데모 사이트 테스트

사이트 생성

테스트 페이지를 생성하고 편집을 위해 엽니다.

$ sudo nano /var/www/html/example.com/index.php

다음 코드를 붙여넣습니다.

Members List
    "; foreach($db->query("SELECT content FROM $table") as $row) { echo "
  1. " . $row['content'] . "
  2. "; } echo "
"; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
"; die(); }

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

SSL 인증서 생성

다음 명령어를 실행하여 SSL 인증서를 생성합니다.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com

위 명령어는 서버의 /etc/letsencrypt/live/example.com 디렉토리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

파일 /etc/letsencrypt/renewal/example.com.conf를 열어 편집합니다.

$ sudo nano /etc/letsencrypt/renewal/example.com.conf

맨 아래에 다음 코드를 붙여넣습니다.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

우리는 Certbot의 독립 실행형 옵션을 사용하여 SSL 인증서를 생성했습니다. 인증서를 생성하기 위해 웹 서버를 실행하므로 갱신 중에는 Nginx를 종료해야 합니다. pre_hookpost_hook 명령은 갱신 전후에 실행되어 Nginx 서버를 자동으로 종료하고 다시 시작하므로 수동 개입이 필요하지 않습니다.

SSL 갱신이 잘 작동하는지 확인하려면 프로세스를 드라이 실행하세요.

$ sudo certbot renew --dry-run

오류가 없으면 모든 준비가 완료된 것입니다. 인증서는 자동으로 갱신됩니다.

Nginx 구성

파일 /etc/nginx/conf.d/example.conf를 생성하고 열어 편집합니다.

$ sudo nano /etc/nginx/conf.d/example.conf

다음 코드를 붙여넣습니다.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  example.com;

    access_log  /var/log/nginx/example.com.access.log;
    error_log   /var/log/nginx/example.com.error.log;

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    root /var/www/html/example.com;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Pass PHP Scripts To FastCGI Server
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  example.com;
    return 301   https://$host$request_uri;
}

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

파일 /etc/nginx/nginx.conf를 열어 편집합니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하세요.

Nginx 구성을 확인합니다.

$ sudo nginx -t

오류가 없으면 준비가 완료된 것입니다. Nginx 서버를 시작합니다.

$ sudo systemctl start nginx

브라우저에서 https://example.com을 방문하여 웹사이트를 로드하면 다음 페이지를 볼 수 있습니다.

LEMP 테스트 사이트 출력

브라우저에서 URL https://example.com/sm175를 방문하여 phpMyAdmin 설치에 접근할 수 있습니다. 루트 사용자 또는 이전에 생성한 사용자로 로그인할 수 있습니다.

결론

이로써 Ubuntu 22.04 서버에 LEMP 스택을 설정하고 데모 사이트를 만드는 방법을 배운 튜토리얼이 끝났습니다. 질문이 있으면 아래 댓글에 남겨주세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.