Nginx를 리버스 프록시로, Apache를 백엔드 웹서버로 사용하는 구성 방법
Nginx가 SSL/TLS 처리와 클라이언트 요청을 담당하고, Apache는 WordPress 애플리케이션을 실행
- Nginx:
– 정적 파일(이미지, CSS, JS) 처리에 매우 빠르고 동시 접속 처리에 강함
– Nginx는 Apache보다 훨씬 적은 메모리 사용
– Nginx는 이벤트 기반 구조로 수천 개의 동시 연결을 적은 리소스로 처리 - Apache: PHP 처리와 .htaccess 지원이 우수하고, WordPress 같은 PHP 애플리케이션과 호환성이 좋음
아키텍처 구조
클라이언트 → Nginx (80/443포트) → Apache (5050포트) → WordPress
↓
SSL/TLS 처리
HTTPS 강제
1. WordPress 설정
파일 위치
wp-config.php (WordPress 루트 디렉토리)
설정 목적
Nginx 리버스 프록시 환경에서 WordPress가 HTTPS를 올바르게 인식하도록 설정
코드 추가 위치
/* That's all, stop editing! Happy blogging. */ 주석 위에 다음 코드를 추가
// Nginx 리버스 프록시 환경에서 HTTPS를 강제 인식시키는 코드
if (
(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') ||
(isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'on')
) {
$_SERVER['HTTPS'] = 'on';
}
설명
- Nginx가 전달하는
X-Forwarded-Proto헤더를 확인 - HTTPS 요청임을 감지하면
$_SERVER['HTTPS']를'on'으로 설정 - WordPress의 리다이렉트 루프 및 Mixed Content 문제 해결
2. Nginx 설정
파일 위치
/etc/nginx/sites-available/test.conf
주요 명령어
# 문법 검사 sudo nginx -t # 설정 활성화 (심볼릭 링크 생성) sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/ # 설정 비활성화 (심볼릭 링크 제거) sudo rm /etc/nginx/sites-enabled/test.conf # Nginx 상태 확인 sudo systemctl status nginx # Nginx 재시작 sudo systemctl restart nginx
설정 구조
(1) HTTP → HTTPS 리다이렉트 (포트 80)
server {
listen 80;
listen [::]:80;
server_name test.com www.test.com;
# 모든 HTTP 요청을 HTTPS로 301 영구 이동
return 301 https://$host$request_uri;
}
기능:
- 모든 HTTP 요청을 HTTPS로 강제 리다이렉트
- SEO 및 보안 향상
(2) HTTPS 요청 처리 및 프록시 (포트 443)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name test.com www.test.com;
# SSL/TLS 인증서 설정 (Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
# 보안 헤더 설정
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
# Apache로 프록시
location / {
proxy_pass http://127.0.0.1:5050;
# 클라이언트 원본 정보 전달
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# HTTPS 정보 전달 (필수)
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port 443;
proxy_redirect off;
}
# .ht 파일 보안 차단
location ~ /\.ht {
deny all;
}
}
주요 기능:
- SSL/TLS 처리: Nginx가 HTTPS 암호화/복호화 담당
- 보안 헤더: HSTS, XSS 보호, 클릭재킹 방지
- 프록시 헤더: Apache가 실제 클라이언트 정보를 알 수 있도록 전달
- X-Forwarded-Proto: WordPress가 HTTPS를 인식하는 데 필수
3. Apache 설정
포트 설정
파일: /etc/apache2/ports.conf
Listen 5050
설명:
- Apache는 외부 접근 불가능한 내부 포트 5050에서만 대기
- Nginx만 이 포트로 요청 전달 가능
VirtualHost 설정
파일: /etc/apache2/sites-available/test.conf
<VirtualHost *:5050>
ServerName test.com
ServerAlias www.test.com
DocumentRoot /path/to/wordpress/
ErrorLog ${APACHE_LOG_DIR}/test_error_444.log
CustomLog ${APACHE_LOG_DIR}/test_access_444.log combined
</VirtualHost>
주요 명령어
# 사이트 활성화 sudo a2ensite test.conf # 사이트 비활성화 sudo a2dissite test.conf # Apache 설정 다시 로드 sudo systemctl reload apache2
4. 전체 설정 흐름
초기 설정 순서
- Apache 포트 변경
sudo vim /etc/apache2/ports.conf # Listen 5050 추가 - Apache VirtualHost 생성
sudo vim /etc/apache2/sites-available/test.conf sudo a2ensite test.conf sudo systemctl reload apache2 - WordPress 설정 수정
sudo vim /path/to/wordpress/wp-config.php # 프록시 인식 코드 추가 - Nginx 설정 생성
sudo vim /etc/nginx/sites-available/test.conf sudo nginx -t sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/ sudo systemctl restart nginx - SSL 인증서 발급 (Let’s Encrypt)
sudo certbot --nginx -d test.com -d www.test.com
5. 트러블슈팅
일반적인 문제
문제 1: WordPress 리다이렉트 루프
원인: WordPress가 HTTPS를 인식하지 못함
해결: wp-config.php에 프록시 인식 코드 확인
문제 2: Mixed Content 경고
원인: HTTP 리소스가 HTTPS 페이지에 로드됨
해결: WordPress 설정 > 사이트 주소를 https://로 변경
문제 3: 502 Bad Gateway
원인: Apache가 5050 포트에서 실행되지 않음
해결:
sudo systemctl status apache2 sudo netstat -tlnp | grep 5050
문제 4: SSL 인증서 오류
원인: 인증서 경로가 올바르지 않음
해결: Nginx 설정에서 인증서 경로 확인
6. 보안 체크리스트
- [ ] HTTP → HTTPS 강제 리다이렉트 작동
- [ ] Apache는 localhost(127.0.0.1)에서만 접근 가능
- [ ] SSL 인증서 자동 갱신 설정
- [ ] 보안 헤더(HSTS, X-Frame-Options 등) 적용
- [ ]
.ht파일 접근 차단 - [ ] 방화벽에서 5050 포트 외부 차단
7. 성능 최적화 팁
- Nginx 캐싱 활성화: 정적 파일을 Nginx에서 직접 서빙
- Gzip 압축: 텍스트 기반 콘텐츠 압축
- HTTP/2 활성화: 이미 설정됨 (
http2옵션) - Keep-Alive 설정: 연결 재사용
참고 사항
- 도메인: 실제 도메인으로
test.com변경 필요 - 경로: WordPress 설치 경로에 맞게 수정
- 포트: 5050 포트는 예시이며, 다른 포트 사용 가능 (보안을 위해 비표준 포트 권장)
- 로그: 각 설정 파일에 명시된 로그 경로에서 문제 진단 가능




