GrepBoardTools GrepBoard 매뉴얼 ↗ Log ↗

Tools / 서버 설정

nginx 설정 만들기

사이트에 필요한 것을 고릅니다. http 블록에만 둘 수 있는 설정(log_format, limit_req_zone)은 conf.d 파일로 따로 나옵니다.

입력한 값은 브라우저 안에서만 계산하고 서버로 보내지 않습니다.

사이트

이 블록이 받을 도메인, 공백으로 구분. _ 는 아무 이름(기본 받기).

폴더의 정적 파일, 또는 앱으로 넘기기(리버스 프록시).

앱이 듣는 주소: http://127.0.0.1:3000 — 포트 뒤에 경로는 넣지 않습니다.

Upgrade · Connection 헤더를 넘기고 쉬는 연결을 1시간까지 유지.

HTTPS

443 에서 인증서로 받기.

체인 포함 인증서. 비우면 certbot 이 만드는 Let’s Encrypt 경로.

개인 키. 비우면 Let’s Encrypt 경로.

80 포트 블록을 따로 두고 모두 https:// 로 보냅니다.

listen … ssl http2 (Ubuntu 24.04 의 nginx 1.24 가 읽는 꼴).

브라우저가 1년 동안 HTTP 를 거부합니다. 쓰는 모든 하위 도메인에서 HTTPS 가 될 때만.

[::] 에서도 받기(Ubuntu 기본 사이트도 그렇게 함).

크기 · 압축 · 로그

업로드 최대 크기. 예: 20m — 비우면 nginx 기본 1m(넘으면 413). 0 은 제한 없음.

텍스트 · CSS · JS · JSON · SVG 압축. Ubuntu 의 nginx.conf 는 gzip 을 켜 두지만 HTML 만 압축합니다.

combined 가 기본, 시간 포함은 요청 · 업스트림 시간을 붙이고, JSON 은 줄마다 객체 하나.

nosniff · 같은 출처만 프레임 · 리퍼러 정책, nginx 버전 숨기기.

요청 수 제한

클라이언트 IP 마다 요청 수 제한.

server 블록 — 저장할 곳 /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    return 301 https://$host$request_uri;
}

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

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml application/javascript application/json application/xml image/svg+xml;

    server_tokens off;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    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;
    }
}

무엇을 하나

Ubuntu 의 /etc/nginx/sites-available/ 에 넣을 server 블록을 만듭니다. 정적 파일과 리버스 프록시 중에서 고르고, HTTPS · 업로드 크기 · 압축 · 로그 · 보안 헤더 · 요청 수 제한을 더합니다. log_format · limit_req_zone · 웹소켓용 map 처럼 http 블록에만 둘 수 있는 줄은 /etc/nginx/conf.d/ 파일로 따로 내고, 이름에 사이트 이름을 붙여 사이트를 여러 개 올려도 겹치지 않게 합니다.

예시

고른 것들어가는 줄
리버스 프록시proxy_pass http://127.0.0.1:3000; + Host · X-Forwarded-For · X-Forwarded-Proto 헤더
웹소켓proxy_set_header Upgrade $http_upgrade; · Connection 은 map 으로
HTTP → HTTPS80 포트 블록에 return 301 https://$host$request_uri;
업로드 20MBclient_max_body_size 20m; (기본 1m, 넘으면 413)
요청 수 제한limit_req_zone … rate=10r/s; (conf.d) + limit_req zone=… burst=20 nodelay;
시간이 든 로그rt=$request_time uct=… urt=$upstream_response_time

흔한 실수

  • log_format · limit_req_zone 을 server 블록에 넣기 — nginx -t 가 「directive is not allowed here」로 거부합니다. 이 두 줄은 http 블록(Ubuntu 에서는 conf.d/*.conf)에 둡니다.
  • 인증서보다 설정을 먼저 켜기 — ssl_certificate 파일이 없으면 nginx -t 가 실패합니다. 인증서를 먼저 받거나 HTTPS 를 끈 설정으로 시작합니다.
  • server_name _ 와 Ubuntu 기본 사이트 — 기본 사이트(sites-enabled/default)도 _ 를 써서 「conflicting server name」 경고가 납니다. 기본 받기로 쓸 거라면 기본 사이트의 링크를 지웁니다.
  • burst=0 — nginx 는 0 을 거부합니다. 몰림을 허용하지 않으려면 burst 를 아예 빼면 됩니다(이 도구는 0 이면 뺍니다).

어떻게 확인했나

공개 전에 Ubuntu 24.04 의 nginx 1.24 패키지를 풀어 nginx -t 로 옵션 조합 52개를 검사했습니다(데몬은 띄우지 않음). http 블록은 Ubuntu 의 nginx.conf 와 같은 줄에서 경로만 바꿨고, 인증서는 시험용 자체 서명, 일부 조합은 Ubuntu 기본 사이트와 함께, 사이트 3개를 한 서버에 올린 경우도 넣었습니다. 경고([warn])까지 0 이어야 통과로 셌습니다 — 모두 66번. 문법 검사이므로 앱이 실제로 응답하는지는 따로 확인해야 합니다.

자주 묻는 것

sites-available 과 sites-enabled 는 무엇이 다른가요?

Ubuntu 의 nginx.conf 는 sites-enabled/ 만 읽습니다. 설정은 sites-available/ 에 두고 ln -s 로 sites-enabled/ 에 링크를 걸어 켭니다. 링크만 지우면 파일은 남긴 채 끌 수 있습니다.

바꾼 뒤 restart 와 reload 중 무엇을 하나요?

sudo nginx -t 로 검사한 뒤 sudo systemctl reload nginx 를 씁니다. reload 는 새 설정으로 워커를 바꾸면서 접속 중인 연결을 끊지 않고, 설정에 문제가 있으면 예전 설정으로 계속 돕니다.

입력한 값이 서버로 가나요?

아니요. 설정은 브라우저 안에서 만듭니다. 도메인 · 경로 · 업스트림 주소는 서버로 보내지 않고, 이 사이트가 쓰는 방문 통계와 광고에도 넘기지 않습니다. 자세한 것은 개인정보 처리 안내에 있습니다.