서버 설치 · 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_filesize 및 post_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-data 및 group=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-data 및 listen.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 "- " . $row['content'] . "
";
}
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_hook 및 post_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을 방문하여 웹사이트를 로드하면 다음 페이지를 볼 수 있습니다.

브라우저에서 URL https://example.com/sm175를 방문하여 phpMyAdmin 설치에 접근할 수 있습니다. 루트 사용자 또는 이전에 생성한 사용자로 로그인할 수 있습니다.
결론
이로써 Ubuntu 22.04 서버에 LEMP 스택을 설정하고 데모 사이트를 만드는 방법을 배운 튜토리얼이 끝났습니다. 질문이 있으면 아래 댓글에 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.