웹 개발을 시작하거나 웹서버를 구축할 때 가장 많이 사용되는 것이 바로 LAMP와 LEMP 스택입니다.
- LAMP: Linux + Apache + MySQL + PHP
- LEMP: Linux + Nginx (Engine-X) + MySQL + PHP
둘 다 강력한 웹 개발 환경을 제공하지만, Apache는 설정이 쉽고 모듈이 풍부한 반면, Nginx는 더 빠르고 메모리 효율적입니다. 오늘은 두 스택 모두를 설치하는 방법을 단계별로 알아보겠습니다.
어떤 스택을 선택해야 할까요?
LAMP (Apache) 선택 기준
- WordPress, Drupal 등 CMS 사용
- .htaccess 파일 기반 설정이 필요한 경우
- 다양한 Apache 모듈 활용이 필요한 경우
- 초보자도 설정하기 쉬운 환경을 원하는 경우
LEMP (Nginx) 선택 기준
- 높은 트래픽을 처리해야 하는 경우
- 메모리 사용량을 최소화하고 싶은 경우
- API 서버나 마이크로서비스 환경
- 정적 파일 서빙이 많은 웹사이트
사전 준비
두 스택 모두 설치하기 전에 시스템을 최신 상태로 업데이트합니다.
# 시스템 패키지 업데이트
sudo apt update
sudo apt upgrade -y
# 필수 도구 설치
sudo apt install software-properties-common curl wget -y
LAMP 스택 설치 (Apache + MySQL + PHP)
1단계: Apache 웹서버 설치
# Apache 설치
sudo apt install apache2 -y
# Apache 서비스 시작 및 부팅 시 자동 시작 설정
sudo systemctl start apache2
sudo systemctl enable apache2
# 방화벽 설정 (필요한 경우)
sudo ufw allow 'Apache Full'
설치 확인:
# Apache 상태 확인
sudo systemctl status apache2
# 웹 브라우저에서 확인
# http://your-server-ip 접속하여 Apache 기본 페이지 확인
curl -I http://localhost
2단계: MySQL 데이터베이스 설치
# MySQL 서버 설치
sudo apt install mysql-server -y
# MySQL 서비스 시작 및 활성화
sudo systemctl start mysql
sudo systemctl enable mysql
보안 설정:
# MySQL 보안 설정 실행
sudo mysql_secure_installation
보안 설정 과정에서 다음 질문들이 나옵니다:
- VALIDATE PASSWORD 플러그인 설정:
Y
(권장) - 패스워드 복잡도 레벨:
2
(STRONG 권장) - root 비밀번호 설정: 강력한 비밀번호 입력
- 익명 사용자 제거:
Y
- root 원격 로그인 비활성화:
Y
- test 데이터베이스 제거:
Y
- 권한 테이블 다시 로드:
Y
MySQL 접속 테스트:
# MySQL 접속 (비밀번호 입력 필요)
sudo mysql -u root -p
# MySQL 콘솔에서 버전 확인
mysql> SELECT VERSION();
mysql> EXIT;
3단계: PHP 설치
# PHP와 필수 모듈 설치
sudo apt install php libapache2-mod-php php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip -y
# Apache 재시작 (PHP 모듈 적용)
sudo systemctl restart apache2
PHP 버전 확인:
php -v
PHP 테스트 파일 생성:
# PHP 정보 페이지 생성
sudo tee /var/www/html/info.php > /dev/null <<EOF
<?php
phpinfo();
?>
EOF
브라우저에서 http://your-server-ip/info.php
에 접속하여 PHP 정보가 표시되는지 확인하세요.
4단계: LAMP 스택 테스트
데이터베이스 연동 테스트:
# 테스트용 데이터베이스 생성
sudo mysql -u root -p -e "
CREATE DATABASE testdb;
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'secure_password123!';
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
FLUSH PRIVILEGES;
"
PHP-MySQL 연동 테스트 파일:
sudo tee /var/www/html/dbtest.php > /dev/null <<'EOF'
<?php
$servername = "localhost";
$username = "testuser";
$password = "secure_password123!";
$dbname = "testdb";
try {
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "<h2>LAMP 스택이 성공적으로 설치되었습니다!</h2>";
echo "<p>PHP 버전: " . phpversion() . "</p>";
echo "<p>MySQL 연결: 성공</p>";
echo "<p>Apache 웹서버: 정상 작동</p>";
} catch(PDOException $e) {
echo "연결 실패: " . $e->getMessage();
}
?>
EOF
LEMP 스택 설치 (Nginx + MySQL + PHP)
1단계: Nginx 웹서버 설치
# Nginx 설치
sudo apt install nginx -y
# Nginx 서비스 시작 및 부팅 시 자동 시작 설정
sudo systemctl start nginx
sudo systemctl enable nginx
# 방화벽 설정
sudo ufw allow 'Nginx Full'
설치 확인:
# Nginx 상태 확인
sudo systemctl status nginx
# 웹 브라우저 테스트
curl -I http://localhost
2단계: MySQL 설치 (LAMP와 동일)
# MySQL 서버 설치
sudo apt install mysql-server -y
# 서비스 시작 및 활성화
sudo systemctl start mysql
sudo systemctl enable mysql
# 보안 설정
sudo mysql_secure_installation
3단계: PHP-FPM 설치
Nginx는 PHP를 직접 처리하지 못하므로 PHP-FPM(FastCGI Process Manager)이 필요합니다.
# PHP-FPM과 필수 모듈 설치
sudo apt install php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip -y
# PHP-FPM 서비스 시작 및 활성화
sudo systemctl start php8.1-fpm # 우분투 22.04 기준 (버전 확인 필요)
sudo systemctl enable php8.1-fpm
PHP-FPM 버전 확인:
# 설치된 PHP 버전 확인
php -v
# PHP-FPM 소켓 파일 위치 확인
sudo find /run/php/ -name "*.sock"
4단계: Nginx PHP 설정
기본 Nginx 사이트 설정을 수정하여 PHP를 처리할 수 있도록 설정합니다.
# 기본 설정 파일 백업
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
# 새로운 설정 작성
sudo tee /etc/nginx/sites-available/default > /dev/null <<'EOF'
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 _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP 버전에 맞게 수정
}
location ~ /\.ht {
deny all;
}
}
EOF
설정 테스트 및 적용:
# Nginx 설정 문법 검사
sudo nginx -t
# Nginx 재시작
sudo systemctl restart nginx
# PHP-FPM 재시작
sudo systemctl restart php8.1-fpm
5단계: LEMP 스택 테스트
PHP 정보 페이지 생성:
sudo tee /var/www/html/info.php > /dev/null <<EOF
<?php
phpinfo();
?>
EOF
데이터베이스 연동 테스트:
# 테스트 데이터베이스 생성 (LAMP와 동일)
sudo mysql -u root -p -e "
CREATE DATABASE testdb_lemp;
CREATE USER 'lempuser'@'localhost' IDENTIFIED BY 'secure_password123!';
GRANT ALL PRIVILEGES ON testdb_lemp.* TO 'lempuser'@'localhost';
FLUSH PRIVILEGES;
"
LEMP 테스트 파일:
sudo tee /var/www/html/lemptest.php > /dev/null <<'EOF'
<?php
$servername = "localhost";
$username = "lempuser";
$password = "secure_password123!";
$dbname = "testdb_lemp";
try {
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "<h2>LEMP 스택이 성공적으로 설치되었습니다!</h2>";
echo "<p>PHP 버전: " . phpversion() . "</p>";
echo "<p>MySQL 연결: 성공</p>";
echo "<p>Nginx 웹서버: 정상 작동</p>";
echo "<p>PHP-FPM: 정상 작동</p>";
} catch(PDOException $e) {
echo "연결 실패: " . $e->getMessage();
}
?>
EOF
추가 설정 및 보안 강화
PHP 보안 설정
# PHP 설정 파일 편집
sudo nano /etc/php/8.1/apache2/php.ini # LAMP용
sudo nano /etc/php/8.1/fpm/php.ini # LEMP용
권장 보안 설정:
# 중요한 보안 설정들
expose_php = Off
display_errors = Off
log_errors = On
allow_url_fopen = Off
allow_url_include = Off
max_execution_time = 30
max_input_time = 30
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 2M
MySQL 추가 보안 설정
# MySQL 설정 파일 편집
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
권장 보안 설정:
[mysqld]
# 외부 접속 차단 (로컬만 허용)
bind-address = 127.0.0.1
# 쿼리 로그 활성화
general_log = 1
general_log_file = /var/log/mysql/mysql.log
# 느린 쿼리 로그
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
방화벽 설정
# UFW 방화벽 활성화
sudo ufw enable
# 필요한 포트만 열기
sudo ufw allow ssh
sudo ufw allow 'Apache Full' # LAMP 사용 시
sudo ufw allow 'Nginx Full' # LEMP 사용 시
# 방화벽 상태 확인
sudo ufw status
파일 권한 설정
# 웹 디렉토리 소유권 설정
sudo chown -R www-data:www-data /var/www/html
# 적절한 권한 설정
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
성능 최적화 팁
Apache 최적화 (LAMP)
# Apache 성능 모듈 활성화
sudo a2enmod rewrite
sudo a2enmod deflate
sudo a2enmod expires
sudo a2enmod headers
# Apache 재시작
sudo systemctl restart apache2
Nginx 최적화 (LEMP)
# Nginx 설정 최적화
sudo nano /etc/nginx/nginx.conf
권장 최적화 설정:
worker_processes auto;
worker_connections 1024;
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
client_max_body_size 64M;
문제 해결 가이드
자주 발생하는 문제들
1. PHP 페이지가 다운로드되는 경우
# LAMP: Apache PHP 모듈 확인
sudo a2enmod php8.1
sudo systemctl restart apache2
# LEMP: PHP-FPM 소켓 경로 확인
sudo systemctl status php8.1-fpm
2. MySQL 접속 거부
# MySQL 서비스 상태 확인
sudo systemctl status mysql
# MySQL 로그 확인
sudo tail -f /var/log/mysql/error.log
3. 권한 오류
# 웹 디렉토리 권한 재설정
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
4. 서비스 상태 확인 명령어
# 모든 서비스 상태 한 번에 확인
sudo systemctl status apache2 mysql # LAMP
sudo systemctl status nginx mysql php8.1-fpm # LEMP
일반적인 관리 명령어
서비스 관리
# 서비스 시작/중지/재시작
sudo systemctl start/stop/restart apache2 # 또는 nginx
sudo systemctl start/stop/restart mysql
sudo systemctl start/stop/restart php8.1-fpm # LEMP만
# 서비스 상태 확인
sudo systemctl status service_name
# 부팅 시 자동 시작 설정/해제
sudo systemctl enable/disable service_name
로그 확인
# 웹서버 로그
sudo tail -f /var/log/apache2/error.log # Apache
sudo tail -f /var/log/nginx/error.log # Nginx
# MySQL 로그
sudo tail -f /var/log/mysql/error.log
# PHP 로그
sudo tail -f /var/log/php8.1-fpm.log
마무리
축하합니다! 이제 완전한 웹 개발 환경이 구축되었습니다. LAMP든 LEMP든, 두 스택 모두 강력한 웹 애플리케이션을 개발하고 운영할 수 있는 환경을 제공합니다.
다음 단계로 추천하는 작업들:
- SSL 인증서 설치 – Let’s Encrypt로 HTTPS 적용
- 버전 관리 – Git 설치 및 설정
- 개발 도구 – Composer, Node.js 등 필요에 따라 설치
- 모니터링 – 서버 상태 모니터링 도구 설정
- 백업 – 정기적인 데이터베이스 및 파일 백업 설정
보안 점검 체크리스트:
- ✅ 테스트 파일들 삭제 (
info.php
,dbtest.php
등) - ✅ 기본 비밀번호 변경
- ✅ 불필요한 서비스 비활성화
- ✅ 정기적인 보안 업데이트
- ✅ 방화벽 설정 확인
이제 여러분만의 웹 프로젝트를 시작해보세요!
이 가이드가 도움이 되셨나요? 설치 과정에서 문제가 발생하거나 추가 질문이 있으시면 댓글로 남겨주세요. 함께 해결해보겠습니다!