Nginx는 높은 성능과 안정성으로 널리 쓰이는 웹 서버입니다. 설치부터 서버 블록, 리버스 프록시, SSL, 인증서 자동 갱신까지 실무에서 자주 만지는 설정을 정리합니다.
설치와 서비스
apt-get install -y nginx
service nginx reload # start | restart | status | stop | reload
설정을 바꾼 뒤에는 무중단으로 반영되는 reload 를 많이 씁니다.
서버 블록 (site)
Nginx는 사이트별 설정을 sites-available 에 두고, sites-enabled 에 심볼릭 링크를 걸어 활성화합니다.
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
기본 서버 블록은 이렇게 생겼어요.
server {
listen 80;
server_name example.com *.example.com; # 서브도메인 포함
root /var/www/html;
index index.html;
location / {
# 경로별 설정 (패턴 매칭 가능)
}
}
nginx.conf 주요 옵션
전역 설정(/etc/nginx/nginx.conf)에서 알아두면 좋은 값들입니다.
sendfile on;/tcp_nopush on;— 파일 전송 최적화client_max_body_size 0;— 업로드 최대 크기(기본 1MB, 초과 시 413).0은 무제한server_tokens off;— 응답에서 버전 정보를 숨겨 취약점 노출 방지charset utf-8;— 문자 인코딩
server_tokens off; 는 보안상 거의 항상 켜두는 걸 권장합니다.
리버스 프록시
백엔드로 요청을 넘기고 부하 분산·보안을 챙기는 리버스 프록시 설정입니다.
location / {
proxy_pass http://127.0.0.1:8080;
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_pass와try_files를 같이 쓰면 에러 응답을 삼켜버리니, 프록시를 쓸 땐try_files는 주석 처리하세요.
SSL 설정
HTTPS 서버 블록 예시입니다.
server {
listen 443 ssl;
server_name 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;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
location / {
root /var/www/html;
index index.html;
}
}
⚠️ 보안 주의: 오래된 설정에서 흔히 보이는
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.2;는 쓰지 마세요. SSLv2/SSLv3/TLSv1은 취약점 때문에 폐기됐습니다.TLSv1.2 TLSv1.3만 남기는 게 맞습니다. 마찬가지로 예전ssl on;지시어도 폐기됐으니, 위처럼listen 443 ssl;형태를 쓰세요.
HTTP를 HTTPS로 강제 리다이렉트하려면 80 포트 블록에서:
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
설정 후에는 항상 문법 검사를 먼저 합니다.
nginx -t && service nginx reload
Certbot으로 SSL 자동 갱신
Let’s Encrypt 인증서는 90일마다 만료되니 자동 갱신이 필수예요.
apt-get install -y certbot python3-certbot-nginx
certbot --nginx -d example.com # 발급 + nginx 설정 자동 수정
Certbot은 설치 시 자동 갱신 타이머를 걸어둡니다(만료 30일 전 갱신 시도).
systemctl list-timers | grep certbot # certbot.timer 확인
certbot renew --dry-run # 갱신 시뮬레이션
갱신 후 Nginx를 다시 읽게 하려면 배포 훅을 둡니다.
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
이렇게 해두면 인증서가 자동으로 갱신되고 Nginx도 알아서 반영되니, 만료 걱정 없이 굴러갑니다.