로그 분석으로 병목 지점을 찾아내고 Nginx 설정을 최적화하는 실전 가이드입니다. 응답시간, 캐시 히트율, 압축 효율을 로그 데이터로 측정하고 개선합니다.
기본 로그 포맷에 $request_time과 $upstream_response_time 추가:
log_format optimized '$remote_addr - [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" rt=$request_time uct=$upstream_connect_time uht=$upstream_header_time urt=$upstream_response_time';
access_log /var/log/nginx/access.log optimized;
필드 의미:
$request_time: 총 요청 처리 시간$upstream_connect_time: 백엔드 연결 시간$upstream_header_time: 백엔드 헤더 응답 시간$upstream_response_time: 백엔드 전체 응답 시간awk '{print $(NF-6)}' /var/log/nginx/access.log | sed 's/rt=//' | sort -n > times.txt
P95=$(sed -n "$(($(wc -l < times.txt) * 95 / 100))p" times.txt)
echo "P95: ${P95}s"
awk '$NF ~ /urt=[1-9]/ || $NF ~ /urt=[0-9]{2,}/' /var/log/nginx/access.log
awk '{print $(NF-6), $7}' /var/log/nginx/access.log | sed 's/rt=//' | sort -rn | head -10
log_format cache '$remote_addr - "$request" $status $upstream_cache_status';
access_log /var/log/nginx/cache.log cache;
$upstream_cache_status 값:
HIT: 캐시에서 제공MISS: 캐시 없음, 백엔드 요청BYPASS: 캐시 우회EXPIRED: 캐시 만료-: 캐시 사용 안 함TOTAL=$(wc -l < /var/log/nginx/cache.log)
HIT=$(grep 'HIT' /var/log/nginx/cache.log | wc -l)
echo "Hit Rate: $((100 * HIT / TOTAL))%"
80% 이상이 이상적입니다.
log_format gzip '$remote_addr - "$request" $status $body_bytes_sent $gzip_ratio';
access_log /var/log/nginx/gzip.log gzip;
$gzip_ratio: 압축률 (예: 3.5 = 3.5배 압축)
awk '{print $NF}' /var/log/nginx/gzip.log | awk '{sum+=$1; n++} END {print sum/n}'
netstat -an | grep :80 | wc -l
/etc/nginx/nginx.conf:
events {
worker_connections 4096; # 기본값 1024 → 4096
use epoll; # Linux에서 효율적
}
최대 연결 수 = worker_processes × worker_connections
http {
keepalive_timeout 65;
keepalive_requests 100;
}
Keep-Alive 사용 시 동일 IP의 연속 요청 간격이 짧습니다:
awk '{print $1, $4}' /var/log/nginx/access.log | sort | uniq -c
upstream backend {
server 127.0.0.1:9000;
keepalive 32;
}
server { location ~ \.php$ { fastcgi_pass backend; fastcgi_keep_conn on; } }
$upstream_connect_time = 0.000 → 재사용됨
awk '$NF ~ /uct=0\.000/' /var/log/nginx/access.log | wc -l
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
grep ' 304 ' /var/log/nginx/access.log | wc -l
304 (Not Modified) 비율이 높을수록 캐싱이 잘 됩니다.
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
로그에 $request_time, $upstream_response_time, $upstream_cache_status를 추가하면 응답시간, 캐시 히트율, 백엔드 병목을 정량적으로 측정할 수 있습니다. 이 데이터로 worker_connections, keepalive, 캐싱 정책을 최적화하세요.