Nginx + Apache / Reverse Proxy

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. 전체 설정 흐름

초기 설정 순서

  1. Apache 포트 변경 sudo vim /etc/apache2/ports.conf # Listen 5050 추가
  2. Apache VirtualHost 생성 sudo vim /etc/apache2/sites-available/test.conf sudo a2ensite test.conf sudo systemctl reload apache2
  3. WordPress 설정 수정 sudo vim /path/to/wordpress/wp-config.php # 프록시 인식 코드 추가
  4. 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
  5. 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. 성능 최적화 팁

  1. Nginx 캐싱 활성화: 정적 파일을 Nginx에서 직접 서빙
  2. Gzip 압축: 텍스트 기반 콘텐츠 압축
  3. HTTP/2 활성화: 이미 설정됨 (http2 옵션)
  4. Keep-Alive 설정: 연결 재사용

참고 사항

  • 도메인: 실제 도메인으로 test.com 변경 필요
  • 경로: WordPress 설치 경로에 맞게 수정
  • 포트: 5050 포트는 예시이며, 다른 포트 사용 가능 (보안을 위해 비표준 포트 권장)
  • 로그: 각 설정 파일에 명시된 로그 경로에서 문제 진단 가능

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤