개발노트

고즐의 개발 및 서버 개발 노트

Certbot Friendly VirtualHost 템플릿: Apache·Nginx 즉시 적용 가이드

# certbot # virtualhost # nginx # apache # https설정

Server 2025.12.06 3 회 읽음
Server 3시간 전 3 회 읽음


계정을 추가하고 아파치에 도메인과 계정을 세팅하고 나서 SSL 설정에 대한 템플릿 가이드를 소개 합니다.

복사해서 도메인만 변경하여 사용할 수 있습니다.


Certbot Friendly VirtualHost 템플릿 가이드

Certbot을 활용한 SSL 자동 발급과 갱신은 서버 운영의 표준이 되었다. 그러나 Apache와 Nginx는 VirtualHost 또는 Server Block 구조가 잘못되면 인증서 발급이 실패하거나 리다이렉션 루프가 발생하기 쉽다. 아래 템플릿은 운영환경에서 바로 사용할 수 있도록 정리한 실전 구성 예시다.


Apache VirtualHost 구성 원리

Apache는 HTTP(80)와 HTTPS(443)를 명확히 분리하는 구조가 Certbot webroot 모드와 가장 잘 맞는다. 또한 .well-known 경로는 반드시 AllowOverride가 허용되어야 한다.

Apache 기본 HTTP(80) 템플릿


    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example

    # Certbot이 인증을 위해 접근하는 경로
    
        AllowOverride All
    

    # HTTP → HTTPS 자동 리다이렉트
    RewriteEngine On
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Apache HTTPS(443) 템플릿


    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/example

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    # 보안 헤더 선택적 추가
    Header always set Strict-Transport-Security "max-age=31536000"

이 구조를 만들고 나면 Certbot의 Apache 플러그인은 자동으로 인증서 파일 경로를 교체하거나 보안 설정을 추가할 수 있다.



Nginx Server Block 구성 원리

Nginx는 HTTP 서버블록과 HTTPS 서버블록을 별도로 구성하는 것이 가장 안전하다. 특히 webroot 방식은 .well-known 디렉터리 alias를 올바르게 지정해야 한다.

Nginx 기본 HTTP 서버블록

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example;

    # Certbot 인증 경로
    location /.well-known/acme-challenge/ {
        root /var/www/example;
    }

    # HTTP → HTTPS 리다이렉트
    return 301 https://$host$request_uri;
}

Nginx HTTPS 서버블록

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    root /var/www/example;
    index index.php index.html;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;

    # 보안 강화
    add_header Strict-Transport-Security "max-age=31536000" always;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}



Webroot, Standalone, DNS Challenge 차이

챌린지 방식에 따라 VirtualHost 템플릿 구조가 달라진다. webroot는 기존 서버 환경에 가장 잘 맞고, standalone은 서버 정지를 필요로 하며, DNS 챌린지는 와일드카드 발급에 필수다.

Webroot 방식 특징

DocumentRoot 또는 지정한 webroot 기반으로 .well-known/acme-challenge 경로 접근이 필요하다. 운영환경 호환성이 높아 가장 많이 사용되는 방식이다.

Standalone 방식 특징

Certbot이 자체적으로 80 포트를 열기 때문에 Apache/Nginx가 잠시 중지되어야 한다. 운영 사이트에는 거의 추천되지 않는다.

DNS Challenge 특징

_acme-challenge TXT 레코드 생성 방식으로, 와일드카드 인증서 발급에 필수다. VirtualHost 구조는 영향을 받지 않는다.



운영 환경에서 자주 발생하는 문제들

SSL 인증서 발급 실패는 대부분 VirtualHost 또는 Server Block 구조가 잘못된 경우다. 아래 사례는 실 운영에서 가장 많이 발생한다.

1. HTTP 서버블록이 존재하지 않음

Certbot은 기본적으로 80 포트를 통해 챌린지를 검증하므로 HTTP 블록이 없으면 실패한다.

2. .well-known 경로가 막혀 있음

Nginx에서 try_files 설정이 잘못되면 인증 파일을 찾지 못한다.

3. HTTPS 리다이렉트가 너무 강하게 걸려 있음

HTTP 요청이 HTTPS로 리다이렉트 되기 전에 챌린지가 실패하는 구조가 있다.

4. 여러 도메인을 alias로 설정했지만 DNS A레코드가 누락됨

ServerAlias 또는 server_name에 등록된 모든 도메인은 DNS에서 A레코드가 동일하게 설정되어야 한다.



Certbot 명령어 기본 흐름

VirtualHost 템플릿을 준비했다면 Certbot 명령은 매우 간단하다.

Apache

sudo certbot --apache -d example.com -d www.example.com

Nginx

sudo certbot --nginx -d example.com -d www.example.com

Webroot 방식

sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com



자동 갱신 점검

Certbot은 systemd.timer 또는 cron 기반 갱신 기능을 제공한다. 운영자는 실제로 갱신이 되는지 테스트하는 습관이 필요하다.

sudo certbot renew --dry-run



마무리

VirtualHost 또는 Server Block을 올바르게 설계하면 Certbot은 거의 문제 없이 SSL 발급 및 자동 갱신을 수행한다. 위 템플릿은 Rocky Linux 9·Ubuntu 22·Debian 12·AlmaLinux 등 대부분의 Linux 환경에서 바로 적용 가능하며, 운영 중인 사이트에도 안정적으로 적용할 수 있다.