로드밸런서와 웹 서버, 데이터베이스 서버를 분리하여 보안성과 확장성을 높인 3계층(3-Tier) 웹 서비스 환경 구축 과정을 정리함.
개념정리
HAProxy (The Traffic Police)
- 역할: 로드밸런서(Load Balancer).
- 설명: 여러 대의 웹 서버 앞단에서 교통정리를 담당함. 사용자들의 접속 요청을 미리 정해진 알고리즘(Round Robin 등)에 따라 각 서버로 골고루 분산시켜 특정 서버에 과부하가 걸리는 것을 방지함.
- 핵심 가치: 한 대의 서버가 죽어도 다른 서버가 서비스를 유지할 수 있게 하는 고가용성(High Availability) 확보.
WordPress (The Storefront)
- 역할: 웹 서버 및 어플리케이션(Web/App).
- 설명: 전 세계에서 가장 많이 사용되는 콘텐츠 관리 시스템(CMS)임. 사용자가 실제로 눈으로 보고 글을 작성하는 '가게의 앞마당' 역할을 함. PHP 기반으로 작동하며 마운트된 소스 코드를 통해 웹 페이지를 띄움.
- 핵심 가치: 사용자 친화적인 UI와 강력한 플러그인 생태계를 통한 빠른 서비스 구축.
MySQL (The Warehouse)
- 역할: 데이터베이스(Database).
- 설명: 웹 서버 뒤에서 모든 데이터를 안전하게 보관하는 '창고' 역할을 함. 워드프레스에 올라오는 게시글, 사용자 계정 정보, 설정값 등이 모두 이곳에 표(Table) 형태로 저장됨.
- 핵심 가치: 데이터의 무결성과 보안성 유지. 웹 서버와 분리하여 관리하므로 웹 서버가 해킹당하더라도 DB 데이터는 별도로 보호할 수 있음.
0. 서버 구성 정보
| 서버 역할 | 호스트명 | IP 주소 | 주요 설치 패키지 |
| Load Balancer | 서버 9-1 | 10.0.0.11 | HAProxy |
| Web Server 1 | 서버 9-2 | 10.0.0.12 | Apache, PHP 8.x, WordPress |
| Web Server 2 | 서버 9-3 | 10.0.0.13 | Apache, PHP 8.x, WordPress |
| DB Server | 서버 9-4 | 10.0.0.14 | MySQL 8.0 |
1. 로드밸런서 설정 (Server 9-1)
외부의 접속을 받아 내부 웹 서버 2대로 분산해 주는 역할을 수행함.
- 설정 자동화 (ha.sh):
- sed 명령어를 활용해 설정 파일(haproxy.cfg)을 열지 않고도 즉시 수정함.
- 80번 포트를 바인딩하고 app1(9-2), app2(9-3) 서버를 백엔드로 등록함.
Bash
#!/bin/bash
dnf install -y haproxy
# 포트 5000 -> 80 변경 및 백엔드 서버 IP 등록
sed -i 's/5000/80/g' /etc/haproxy/haproxy.cfg
sed -i 's/use_backend static/use_backend app/g' /etc/haproxy/haproxy.cfg
sed -i 's/127.0.0.1:5001/10.0.0.12:80/g' /etc/haproxy/haproxy.cfg
sed -i 's/127.0.0.1:5002/10.0.0.13:80/g' /etc/haproxy/haproxy.cfg
sed -i 's/server app3/#server app3/g' /etc/haproxy/haproxy.cfg
sed -i 's/server app4/#server app4/g' /etc/haproxy/haproxy.cfg
systemctl enable --now haproxy
firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload
2. 웹 서버 및 WordPress 설정 (Server 9-2, 9-3)
Apache 웹 서버에 PHP 모듈을 얹고 워드프레스를 연동함. DB 접속 계정 정보를 정확히 입력하는 것이 핵심임.
- 설정 자동화 (word.sh):
- DB 사용자: jh / 패스워드: It12345! 반영함.
- wp-config.php 파일을 생성하여 DB 서버(10.0.0.14)와 연결함.
Bash
#!/bin/bash
# 필수 패키지 설치 (PHP 8.0 이상 권장)
dnf install -y wget tar httpd php php-cli php-curl php-gd php-opcache php-mysqlnd
wget https://ko.wordpress.org/wordpress-6.8.2-ko_KR.tar.gz
tar xvfz wordpress-6.8.2-ko_KR.tar.gz
cp -ar wordpress/* /var/www/html/
# 인덱스 우선순위를 php로 변경
sed -i 's/DirectoryIndex index.html/DirectoryIndex index.php/g' /etc/httpd/conf/httpd.conf
cp /var/www/html/{wp-config-sample.php,wp-config.php}
# DB 연동 설정 (사용자: jh)
sed -i 's/database_name_here/wordpress/g' /var/www/html/wp-config.php
sed -i 's/username_here/jh/g' /var/www/html/wp-config.php
sed -i 's/password_here/It12345!/g' /var/www/html/wp-config.php
sed -i 's/localhost/10.0.0.14/g' /var/www/html/wp-config.php
systemctl enable --now httpd
firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload
3. 데이터베이스 서버 설정 (Server 9-4)
웹 서버들이 공통으로 데이터를 읽고 쓸 수 있는 MySQL DB를 구축함.
- 설정 자동화 (mysql.sh):
- 외부 접속이 가능한 사용자 jh를 생성하고 wordpress DB에 대한 모든 권한을 부여함.
Bash
#!/bin/bash
dnf install -y mysql-server
systemctl enable --now mysqld
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
# DB 및 사용자(jh) 생성 쿼리 실행
mysql -uroot -e "CREATE USER 'jh'@'%' IDENTIFIED BY 'It12345!';"
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO 'jh'@'%';"
mysql -uroot -e "CREATE DATABASE wordpress;"
mysql -uroot -e "FLUSH PRIVILEGES;"
4. 최종 확인 및 테스트
- 로드밸런서 작동 확인: 브라우저에 10.0.0.11 접속 시 워드프레스 초기 설정 화면이 노출되어야 함.
- 부하 분산 테스트: 각 서버에 echo 'server-1' > /var/www/html/health.html 생성 후, LB IP 주소로 반복 접속하여 출력 내용이 바뀌는지 확인함.
- DB 연동 확인: 워드프레스 설치 완료 후 DB 서버에서 show databases; 명령어로 테이블 생성 여부를 확인함.
반응형
'IT > Linux' 카테고리의 다른 글
| [Docker] 실무 심화: 이미지 관리, 네트워크 및 HAProxy 로드밸런싱 (0) | 2026.03.10 |
|---|---|
| [Linux] Docker 기초: 컨테이너 가상화 설치 및 실무 명령어 정리 (0) | 2026.03.10 |
| [Linux] NAT Gateway 및 HAProxy 로드밸런싱 구성 가이드 (0) | 2026.03.10 |
| [Linux] SSH Key 인증 방식 및 접속 가이드 (0) | 2026.03.10 |
| [Linux] NFS(Network File System) 설정 및 윈도우 연결 가이드 (0) | 2026.03.10 |