✅ Apache Reverse Proxy로 HTTP → HTTPS 변환하는 방법

🔹 1. Apache Reverse Proxy 개념

Apache의 mod_proxy 모듈을 이용하면, HTTP 사이트를 HTTPS로 변환하여 Nextcloud에서 안전하게 iframe으로 표시할 수 있습니다.

  • 외부 HTTP 사이트 → Apache Reverse Proxy → HTTPS 변환 후 Nextcloud에 제공

  • 이 방식은 브라우저의 Mixed Content Policy 문제를 해결하고, HTTPS 환경에서 안전하게 iframe을 사용할 수 있도록 도와줍니다.


🔹 2. Apache Reverse Proxy 설정 방법

📌 1) Apache에 Reverse Proxy 모듈 활성화

Ubuntu/Debian 기준으로 아래 명령어를 실행하여 Proxy 관련 모듈을 활성화합니다.

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod proxy_html

모듈을 활성화한 후 Apache를 재시작합니다.

sudo systemctl restart apache2

📌 2) Virtual Host 파일 설정 (Reverse Proxy 구성)

이제 Reverse Proxy를 설정할 가상 호스트 파일을 생성 및 수정합니다.

  1. /etc/apache2/sites-available/reverse-proxy.conf 파일을 만듭니다.

sudo nano /etc/apache2/sites-available/reverse-proxy.conf
  1. 다음 내용을 추가합니다.

    • your-nextcloud.com → Nextcloud의 도메인

    • proxy.your-nextcloud.com → Reverse Proxy로 사용할 서브도메인

    • http://your-external-site.com → iframe으로 표시할 HTTP 사이트

<VirtualHost *:443>
ServerName proxy.your-nextcloud.com
# SSL 설정 (Let’s Encrypt 사용 가능)
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/your-nextcloud.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your-nextcloud.com/privkey.pem

# Reverse Proxy 설정
ProxyPreserveHost On
ProxyPass / http://your-external-site.com/
ProxyPassReverse / http://your-external-site.com/

# Header 설정 (보안 관련)
<IfModule mod_headers.c>
Header always set X-Frame-Options “SAMEORIGIN”
Header always set Content-Security-Policy “frame-ancestors ‘self’ https://your-nextcloud.com;”
</IfModule>

# 로그 설정
ErrorLog ${APACHE_LOG_DIR}/reverse-proxy_error.log
CustomLog ${APACHE_LOG_DIR}/reverse-proxy_access.log combined
</VirtualHost>

설정 설명

  • ProxyPassProxyPassReverse를 이용해 HTTP 사이트를 HTTPS로 변환

  • X-Frame-Options "SAMEORIGIN" → Nextcloud에서 iframe으로 로드 가능하게 설정

  • Content-Security-Policy → iframe에서 표시할 도메인 제한


📌 3) Reverse Proxy 설정 적용

  1. 가상 호스트 활성화

sudo a2ensite reverse-proxy
  1. Apache 설정 오류 확인

sudo apachectl configtest

"Syntax OK" 메시지가 나오면 설정이 정상입니다.

  1. Apache 재시작

sudo systemctl restart apache2

📌 4) Nextcloud의 External Sites에 추가

이제 Nextcloud에서 External Sites 앱을 이용하여 iframe을 추가할 때,
기존 HTTP 사이트 대신 https://proxy.your-nextcloud.com/을 입력하면 됩니다.

예제

  • 기존: http://your-external-site.com

  • 변경 후: https://proxy.your-nextcloud.com

이제 Nextcloud에서 iframe으로 안전하게 표시될 것입니다. 🚀


🔹 추가 설정 (선택 사항)

1️⃣ 만약 HTTP로 접근이 가능해야 한다면?

HTTPS가 아닌 HTTP에서도 프록시가 동작하도록 하려면, 다음 설정을 /etc/apache2/sites-available/reverse-proxy.conf에 추가하세요.

<VirtualHost *:80>
ServerName proxy.your-nextcloud.com
Redirect permanent / https://proxy.your-nextcloud.com/
</VirtualHost>

이렇게 하면 HTTP로 접근해도 자동으로 HTTPS로 리디렉트됩니다.

1️⃣ 현재 SSL 인증서 확인

먼저 현재 설정된 인증서를 확인합니다.

openssl s_client -connect proxy.korduck.duckdns.org:443 -servername proxy.korduck.duckdns.org </dev/null 2>/dev/null | openssl x509 -noout -text | grep "Subject:"

🚀 출력 예시 (정상적인 경우)

Subject: CN=proxy.korduck.duckdns.org

출력 예시 (잘못된 경우, 다른 도메인일 때)

Subject: CN=example.com

이 경우, SSL 인증서가 proxy.korduck.duckdns.org에 대해 발급되지 않았기 때문에 새로 발급해야 합니다.


2️⃣ Let’s Encrypt 인증서 갱신 (재발급)

  1. 기존 인증서 삭제

sudo rm -rf /etc/letsencrypt/live/proxy.korduck.duckdns.org
sudo rm -rf /etc/letsencrypt/archive/proxy.korduck.duckdns.org
sudo rm -rf /etc/letsencrypt/renewal/proxy.korduck.duckdns.org.conf
  1. 새로운 인증서 발급

sudo certbot certonly --standalone -d proxy.korduck.duckdns.org

🚀 발급이 성공하면 다음과 같은 메시지가 나와야 함

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/proxy.korduck.duckdns.org/fullchain.pem
  1. Apache 설정 업데이트

sudo nano /etc/apache2/sites-available/reverse-proxy.conf

설정 확인

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/privkey.pem
  1. Apache 재시작

sudo systemctl restart apache2

3️⃣ 올바른 인증서가 적용되었는지 다시 확인

openssl s_client -connect proxy.korduck.duckdns.org:443 -servername proxy.korduck.duckdns.org </dev/null 2>/dev/null | openssl x509 -noout -text | grep "Subject:"

출력이 다음과 같으면 정상 작동

Subject: CN=proxy.korduck.duckdns.org

이제 다시 브라우저에서 https://proxy.korduck.duckdns.org 접속 테스트하거나,

curl -I https://proxy.korduck.duckdns.org

실행하여 HTTP 200 응답이 오는지 확인하세요.

2️⃣ 새로운 도메인(proxy.korduck.duckdns.org)으로 SSL 인증서 갱신

📌 방법 1: 기존 도메인 + 새로운 도메인 함께 인증

sudo certbot certonly --standalone -d korduck.duckdns.org -d proxy.korduck.duckdns.org

🚀 이렇게 하면 하나의 인증서에 두 개의 도메인이 포함됨.

또는,

📌 방법 2: 기존 인증서 삭제 후 새로운 도메인만 인증

sudo certbot delete --cert-name korduck.duckdns.org
sudo certbot certonly --standalone -d proxy.korduck.duckdns.org

3️⃣ Apache/Nginx SSL 설정 수정

sudo nano /etc/apache2/sites-available/nextcloud.conf

변경해야 할 부분

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/privkey.pem

저장 후 Apache 재시작

sudo systemctl restart apache2

“✅ Apache Reverse Proxy로 HTTP → HTTPS 변환하는 방법”에 대한 1개의 생각

  1. /etc/apache2/sites-available/reverse-proxy.conf


    ServerName proxy.your-ssl_domain

    # SSL 설정 (Let’s Encrypt 사용 가능)
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/your-ssl_domain/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/your-ssl_domain/privkey.pem

    # Reverse Proxy 설정
    ProxyPreserveHost On
    ProxyPass / http://your-external-site/
    ProxyPassReverse / http://your-external-site/

    # Header 설정 (보안 관련)

    Header always set X-Frame-Options “SAMEORIGIN”
    Header always set Content-Security-Policy “frame-ancestors ‘self’ https://your-ssl_domain;”

    # 로그 설정
    ErrorLog ${APACHE_LOG_DIR}/reverse-proxy_error.log
    CustomLog ${APACHE_LOG_DIR}/reverse-proxy_access.log combined


    ServerName proxy.your-ssl_domain
    Redirect permanent / https://proxy.your-ssl_domain/

    응답

댓글 남기기