이 가이드는 Amazon EC2 인스턴스에서 LEMP 스택(Linux, Nginx, MySQL, PHP)을 설치하고 워드프레스를 구축하는 전체 과정을 단계별로 설명합니다. Nginx는 Apache보다 메모리 사용량이 적고 동시 접속 처리 성능이 뛰어나다는 장점이 있습니다.
1. EC2 인스턴스 준비
1.1 EC2 인스턴스 생성
- AWS 콘솔에 로그인하여 EC2 서비스로 이동
- Launch Instance 클릭
- AMI 선택: Ubuntu 20.04 LTS 또는 Amazon Linux 2 권장
- 인스턴스 타입: t2.micro (프리티어) 또는 t3.small 선택
- 키 페어 생성 또는 기존 키 페어 선택
- 보안 그룹 설정:
- SSH (포트 22): 내 IP 또는 필요한 IP 범위
- HTTP (포트 80): 0.0.0.0/0
- HTTPS (포트 443): 0.0.0.0/0
1.2 EC2 인스턴스 접속
# SSH를 통해 인스턴스 접속
ssh -i "your-key.pem" ubuntu@your-ec2-public-ip
# Amazon Linux 2의 경우
ssh -i "your-key.pem" ec2-user@your-ec2-public-ip
2. 시스템 업데이트
# Ubuntu
sudo apt update && sudo apt upgrade -y
# Amazon Linux 2
sudo yum update -y
3. Nginx 웹 서버 설치
3.1 Nginx 설치
# Ubuntu
sudo apt install -y nginx
# Amazon Linux 2
sudo amazon-linux-extras enable nginx1
sudo yum install -y nginx
3.2 Nginx 서비스 시작 및 활성화
sudo systemctl start nginx
sudo systemctl enable nginx
3.3 Nginx 방화벽 설정 (Ubuntu)
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable
3.4 Nginx 설치 확인
웹 브라우저에서 http://your-ec2-public-ip
로 접속하여 Nginx 기본 페이지가 나타나는지 확인합니다.
4. MySQL 데이터베이스 설치
4.1 MySQL 설치
# Ubuntu
sudo apt install -y mysql-server
# Amazon Linux 2
sudo yum install -y mysql-server
4.2 MySQL 서비스 시작 및 활성화
sudo systemctl start mysql # Ubuntu
sudo systemctl start mysqld # Amazon Linux 2
sudo systemctl enable mysql # Ubuntu
sudo systemctl enable mysqld # Amazon Linux 2
4.3 MySQL 보안 설정
sudo mysql_secure_installation
설정 과정에서 다음과 같이 진행:
- 루트 패스워드 설정
- 익명 사용자 제거: Y
- 루트 원격 로그인 비활성화: Y
- 테스트 데이터베이스 제거: Y
- 권한 테이블 재로드: Y
4.4 워드프레스용 데이터베이스 생성
sudo mysql -u root -p
MySQL 프롬프트에서:
CREATE DATABASE wordpress;
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'strong_password_here';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
5. PHP 및 PHP-FPM 설치
5.1 PHP 및 필수 모듈 설치
# Ubuntu
sudo apt install -y php-fpm php-mysql php-gd php-xml php-mbstring php-curl php-zip php-intl
# Amazon Linux 2
sudo yum install -y php php-fpm php-mysql php-gd php-xml php-mbstring php-curl php-zip php-intl
5.2 PHP-FPM 서비스 시작 및 활성화
# Ubuntu (PHP 버전에 따라 숫자가 다를 수 있음)
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm
# 또는 더 일반적인 방법
sudo systemctl start php*-fpm
sudo systemctl enable php*-fpm
# Amazon Linux 2
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
5.3 PHP-FPM 설정 확인
# PHP-FPM 소켓 위치 확인
sudo find /var/run -name "php*fpm.sock" 2>/dev/null
6. Nginx와 PHP 연동 설정
6.1 기본 Nginx 설정 백업
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak # Ubuntu
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak # Amazon Linux 2
6.2 워드프레스용 Nginx 설정 파일 생성
# Ubuntu
sudo vim /etc/nginx/sites-available/wordpress
# Amazon Linux 2
sudo vim /etc/nginx/conf.d/wordpress.conf
설정 파일 내용:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
root /var/www/html;
index index.php index.html index.htm;
# 로그 파일 설정
access_log /var/log/nginx/wordpress_access.log;
error_log /var/log/nginx/wordpress_error.log;
# 기본 위치 설정
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP 파일 처리
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Ubuntu (PHP 버전에 맞게 수정)
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# Amazon Linux 2
# fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 정적 파일 캐싱
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 보안을 위한 파일 접근 차단
location ~ /\.ht {
deny all;
}
location ~ /\.user.ini {
deny all;
}
location ~ /wp-config.php {
deny all;
}
# 워드프레스 보안 강화
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
allow all;
}
# 업로드된 파일의 PHP 실행 방지
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
}
6.3 사이트 활성화 (Ubuntu)
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
6.4 Nginx 설정 테스트 및 재시작
sudo nginx -t
sudo systemctl restart nginx
7. 워드프레스 다운로드 및 설치
7.1 웹 디렉토리 준비
sudo mkdir -p /var/www/html
sudo chown -R www-data:www-data /var/www/html # Ubuntu
sudo chown -R nginx:nginx /var/www/html # Amazon Linux 2
7.2 워드프레스 다운로드
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz
7.3 워드프레스 파일을 웹 디렉토리로 복사
sudo cp -R wordpress/* /var/www/html/
sudo chown -R www-data:www-data /var/www/html/ # Ubuntu
sudo chown -R nginx:nginx /var/www/html/ # Amazon Linux 2
sudo chmod -R 755 /var/www/html/
7.4 워드프레스 설정 파일 생성
cd /var/www/html
sudo cp wp-config-sample.php wp-config.php
sudo vim wp-config.php
wp-config.php 파일에서 다음 부분을 수정:
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wordpressuser' );
define( 'DB_PASSWORD', 'strong_password_here' );
define( 'DB_HOST', 'localhost' );
// Nginx 특화 설정 추가
define('FS_METHOD', 'direct');
7.5 보안 키 설정
WordPress 보안 키 생성기에서 생성된 키를 wp-config.php 파일의 해당 부분에 붙여넣습니다.
8. 파일 권한 최적화
# 소유권 설정
sudo chown -R www-data:www-data /var/www/html/ # Ubuntu
sudo chown -R nginx:nginx /var/www/html/ # Amazon Linux 2
# 권한 설정
sudo find /var/www/html/ -type d -exec chmod 755 {} \;
sudo find /var/www/html/ -type f -exec chmod 644 {} \;
sudo chmod 600 /var/www/html/wp-config.php
# wp-content 디렉토리 쓰기 권한
sudo chmod -R 775 /var/www/html/wp-content/
9. PHP 설정 최적화
9.1 PHP 설정 파일 수정
# PHP 설정 파일 위치 확인
php --ini
# 설정 파일 편집
sudo vim /etc/php/7.4/fpm/php.ini # Ubuntu
sudo vim /etc/php.ini # Amazon Linux 2
다음 설정들을 수정:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_vars = 3000
9.2 PHP-FPM 풀 설정 최적화
# Ubuntu
sudo vim /etc/php/7.4/fpm/pool.d/www.conf
# Amazon Linux 2
sudo vim /etc/php-fpm.d/www.conf
중요한 설정들:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.process_idle_timeout = 10s
9.3 서비스 재시작
sudo systemctl restart php7.4-fpm # Ubuntu
sudo systemctl restart php-fpm # Amazon Linux 2
sudo systemctl restart nginx
10. 워드프레스 설치 완료
10.1 웹 설치 마법사 실행
웹 브라우저에서 http://your-ec2-public-ip
또는 도메인으로 접속합니다.
10.2 워드프레스 설치 정보 입력
- 사이트 제목
- 관리자 사용자명
- 관리자 비밀번호
- 관리자 이메일 주소
11. SSL 인증서 설치 (Let’s Encrypt)
11.1 Certbot 설치
# Ubuntu
sudo apt install -y certbot python3-certbot-nginx
# Amazon Linux 2
sudo yum install -y certbot python3-certbot-nginx
11.2 SSL 인증서 발급 및 자동 설정
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
11.3 자동 갱신 설정
sudo crontab -e
다음 라인 추가:
0 12 * * * /usr/bin/certbot renew --quiet
12. 성능 최적화
12.1 Nginx 캐싱 설정
sudo vim /etc/nginx/conf.d/cache.conf
캐싱 설정:
# 캐시 존 정의
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# 임시 파일 경로
fastcgi_temp_path /var/cache/nginx/temp;
12.2 캐시 디렉토리 생성
sudo mkdir -p /var/cache/nginx/temp
sudo chown -R www-data:www-data /var/cache/nginx/ # Ubuntu
sudo chown -R nginx:nginx /var/cache/nginx/ # Amazon Linux 2
12.3 워드프레스 사이트 설정에 캐싱 추가
기존 워드프레스 설정 파일에 다음 내용 추가:
# FastCGI 캐싱 설정
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# 캐시 제외 조건
set $skip_cache 0;
# POST 요청은 캐시하지 않음
if ($request_method = POST) {
set $skip_cache 1;
}
# 쿼리 문자열이 있으면 캐시하지 않음
if ($query_string != "") {
set $skip_cache 1;
}
# 관리자, 로그인 페이지는 캐시하지 않음
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# 로그인된 사용자는 캐시하지 않음
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
13. 보안 강화
13.1 불필요한 파일 제거
sudo rm /tmp/latest.tar.gz
sudo rm -rf /tmp/wordpress
13.2 fail2ban 설치 (브루트포스 공격 방지)
# Ubuntu
sudo apt install -y fail2ban
# Amazon Linux 2
sudo yum install -y epel-release
sudo yum install -y fail2ban
13.3 fail2ban 워드프레스 설정
sudo vim /etc/fail2ban/filter.d/wordpress.conf
필터 설정:
[Definition]
failregex = ^<HOST> .* "POST .*wp-login\.php
^<HOST> .* "POST .*xmlrpc\.php
ignoreregex =
jail 설정:
sudo vim /etc/fail2ban/jail.local
[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/nginx/wordpress_access.log
maxretry = 3
bantime = 1800
findtime = 600
13.4 서비스 재시작
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
14. 백업 스크립트 설정
14.1 백업 스크립트 생성
sudo vim /home/ubuntu/wordpress-backup.sh
백업 스크립트:
#!/bin/bash
# 변수 설정
BACKUP_DIR="/home/ubuntu/backups"
DATE=$(date +%Y%m%d_%H%M%S)
WP_DIR="/var/www/html"
DB_NAME="wordpress"
DB_USER="wordpressuser"
DB_PASS="strong_password_here"
# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR
# 파일 백업
tar -czf $BACKUP_DIR/wordpress_files_$DATE.tar.gz $WP_DIR
# 데이터베이스 백업
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/wordpress_db_$DATE.sql
# 30일 이상 된 백업 파일 삭제
find $BACKUP_DIR -name "wordpress_*" -mtime +30 -delete
echo "백업 완료: $DATE"
14.2 실행 권한 부여 및 크론 작업 설정
chmod +x /home/ubuntu/wordpress-backup.sh
# 크론 작업 추가 (매일 새벽 2시에 백업)
sudo crontab -e
크론 설정:
0 2 * * * /home/ubuntu/wordpress-backup.sh
15. 모니터링 설정
15.1 Nginx 상태 모니터링 설정
sudo vim /etc/nginx/conf.d/status.conf
상태 모니터링 설정:
server {
listen 127.0.0.1:80;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location /php_status {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Ubuntu
# fastcgi_pass unix:/var/run/php-fpm/www.sock; # Amazon Linux 2
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
}
마무리
이제 EC2에서 LEMP 스택과 워드프레스가 성공적으로 설치되었습니다. LEMP 스택의 주요 장점:
성능상 이점:
- 메모리 효율성: Nginx는 Apache보다 적은 메모리 사용
- 동시 접속 처리: 높은 동시 접속자 처리 능력
- 정적 파일 서빙: 빠른 정적 파일 전송 속도
추가 권장사항:
- CDN 연동: CloudFront와 같은 CDN 서비스 활용
- 데이터베이스 최적화: MySQL 성능 튜닝
- 모니터링: CloudWatch 및 로그 분석 도구 활용
- 정기 업데이트: 보안 패치 및 소프트웨어 업데이트
성능 체크포인트:
# Nginx 상태 확인
curl http://localhost/nginx_status
# PHP-FPM 프로세스 확인
sudo systemctl status php7.4-fpm
# 메모리 사용량 확인
free -h
# 디스크 사용량 확인
df -h
웹사이트가 정상적으로 동작하는지 확인하고, 필요에 따라 플러그인과 테마를 설치하여 사이트를 완성하세요!