Nginx 설정 생성기

Nginx 구성 생성

Nginx 설정을 처음부터 작성하려면 모든 proxy_set_header 줄과 gzip으로 압축할 MIME 타입을 일일이 기억해야 하고, try_files $uri/ /index.php?$args와 라우팅을 조용히 망가뜨리는 변형의 차이까지 구분해야 합니다. 이 생성기는 도메인, 업스트림, PHP 핸들러, SSL 파일 경로를 입력받아 TLS, HTTP/2, 정적 파일 캐싱, 압축에 대한 합리적인 기본값이 담긴 server block을 출력합니다.

server block 생성 방법

  1. 1

    프리셋 선택

    정적 사이트, PHP-FPM(Laravel, WordPress), Node.js 리버스 프록시, 또는 단순한 301 리디렉션 중에서 고르세요.

  2. 2

    도메인 입력

    server_name 목록을 넣습니다. 보통 www가 붙은 도메인과 붙지 않은 도메인을 함께 적습니다.

  3. 3

    SSL 정보 설정

    fullchain과 privkey 파일 경로를 지정하거나, HTTP만 사용할 경우 이 단계를 건너뜁니다.

  4. 4

    업스트림 조정

    proxy_pass를 쓰는 경우의 포트, 소켓 경로 또는 백엔드 URL을 지정합니다.

  5. 5

    복사해서 적용

    결과를 /etc/nginx/sites-available에 넣고 nginx -t를 실행한 뒤 Nginx를 reload 하세요.

좋은 server block의 구성

요즘 Nginx 가상 호스트는 대체로 다음 요소로 이루어집니다.

구성 요소 역할
listen 443 ssl http2 HTTP/2를 켠 상태로 HTTPS 연결을 받습니다
ssl_certificate + ssl_certificate_key TLS 인증서와 개인 키 파일을 지정합니다
ssl_protocols TLSv1.2 TLSv1.3 오래된 TLS 버전을 제외합니다
gzip on + 타입 목록 텍스트/HTML/JSON/JS/CSS를 전송 시점에 압축합니다
정적 자산용 expires 헤더 재방문자의 반복 요청을 줄입니다
try_files 프런트 컨트롤러(PHP, Laravel 등)로 넘깁니다
HSTS + 보안 헤더 브라우저가 항상 TLS를 쓰도록 강제합니다

리버스 프록시의 핵심

Nginx 뒤에서 동작하는 Node.js, Python, Ruby 애플리케이션의 경우:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

X-Forwarded-For를 빠뜨리는 것은 애플리케이션 로그에서 실제 클라이언트 IP를 잃어버리는 전형적인 실수입니다.

자주 저지르는 실수

  • server_name 폴백 블록 누락. 일치하는 이름이 없으면 Nginx는 첫 번째 server block을 기본값으로 사용합니다. Host 헤더 공격을 막으려면 444를 반환하는 캐치올 server_name _ 블록을 두세요.
  • 인증서 순서 오류. ssl_certificate 파일에는 리프 인증서만이 아니라 전체 체인(fullchain: 리프 + 중간 인증서)이 들어가야 합니다.
  • 과도한 캐싱. /index.htmlexpires 1y를 주면 이후 배포가 반영되지 않습니다. 대신 정적 자산 URL에 버전을 붙이세요.
  • 테스트 없이 reload. systemctl reload nginx 전에는 반드시 nginx -t를 실행하세요. 문법 오류 하나로 사이트 전체가 내려갑니다.

자주 묻는 질문

HTTP/2는 안정적이며 Nginx 1.25 이상에서 폭넓게 지원됩니다. HTTP/3(QUIC)도 Nginx 1.25 이상에서 쓸 수 있지만 아직 실험적 기능입니다. 지금 운영 환경을 구성한다면 HTTP/2를 켜고, 필요하면 http3quic 지시어로 HTTP/3를 추가하세요.

관례상 공개 체인은 /etc/ssl/certs/에, 개인 키는 /etc/ssl/private/에 둡니다. Let’s Encrypt는 모든 파일을 /etc/letsencrypt/live/domain/ 아래에 보관합니다. 사용 중인 갱신 도구가 기대하는 경로를 따르세요.

대부분의 사이트에서는 그렇습니다. 301 https://$host$request_uri를 반환하는 80 포트용 server block을 따로 추가하세요. HSTS와 함께 쓰면 첫 요청 이후에는 이 HTTP 블록이 거의 호출되지 않습니다.

reload 없이 설정만 검사하려면 sudo nginx -t를 실행하세요. “syntax is ok”와 “test is successful”이 출력되면 sudo systemctl reload nginx로 적용합니다. 운영 환경에서는 절대 restart를 쓰지 마세요. reload는 서비스 중단 없이 반영됩니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다