Search

๋กœ๊ทธ ๋ฐ ๋””๋ฒ„๊น…

Nginx ๋กœ๊ทธ ๋ฐ ๋””๋ฒ„๊น…

๊ฐœ์š”

Nginx๋Š” access.log(์ ‘๊ทผ ๋กœ๊ทธ)์™€ error.log(์—๋Ÿฌ ๋กœ๊ทธ) ๋‘ ๊ฐ€์ง€ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์š”์ฒญ๊ณผ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ๋กœ๊ทธ๋Š” ๋ฌธ์ œ ์ง„๋‹จ๊ณผ ์„œ๋น„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ํ•ต์‹ฌ ๋„๊ตฌ์ด๋‹ค.
์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์š”. "์‚ฌ์ดํŠธ๊ฐ€ ์•ˆ ์—ด๋ ค์š”!", "๊ฐ‘์ž๊ธฐ ๋А๋ ค์กŒ์–ด์š”!", "404 ์—๋Ÿฌ๊ฐ€ ๋‚˜์š”!" ๊ฐ™์€ ์ƒํ™ฉ์ด ์˜ค๋ฉด, ๊ฐ€์žฅ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•  ๊ณณ์ด ๋ฐ”๋กœ ๋กœ๊ทธ ํŒŒ์ผ์ด์—์š”.
๋กœ๊ทธ๋Š” ์„œ๋ฒ„์˜ ๋ธ”๋ž™๋ฐ•์Šค์™€ ๊ฐ™์•„์š”. ๋ฌด์Šจ ์š”์ฒญ์ด ๋“ค์–ด์™”๊ณ , ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค๋ฉด ์™œ ๋‚ฌ๋Š”์ง€ ์ „๋ถ€ ๊ธฐ๋ก๋˜์–ด ์žˆ๊ฑฐ๋“ ์š”. ๋กœ๊ทธ๋ฅผ ์ž˜ ์ฝ์„ ์ค„ ์•Œ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” ๊ธˆ๋ฐฉ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”!

๋กœ๊ทธ ํŒŒ์ผ ์œ„์น˜

graph TD
    A["/var/log/nginx/"] --> B["access.log<br/>๐Ÿ“Š ์ ‘๊ทผ ๋กœ๊ทธ"]
    A --> C["error.log<br/>๐Ÿšจ ์—๋Ÿฌ ๋กœ๊ทธ"]

    B --> B1["๋ชจ๋“  HTTP ์š”์ฒญ ๊ธฐ๋ก<br/>IP, URL, ์ƒํƒœ์ฝ”๋“œ, ์‘๋‹ต์‹œ๊ฐ„"]
    C --> C1["์˜ค๋ฅ˜ ๋ฐ ๊ฒฝ๊ณ  ๊ธฐ๋ก<br/>์„ค์ • ์˜ค๋ฅ˜, ์—ฐ๊ฒฐ ์‹คํŒจ ๋“ฑ"]

    style B fill:#90EE90
    style C fill:#FFB3B3
Mermaid
๋ณต์‚ฌ
๋กœ๊ทธ ํŒŒ์ผ
๊ฒฝ๋กœ
๊ธฐ๋ก ๋‚ด์šฉ
access.log
/var/log/nginx/access.log
๋ชจ๋“  HTTP ์š”์ฒญ (์„ฑ๊ณต + ์‹คํŒจ)
error.log
/var/log/nginx/error.log
์˜ค๋ฅ˜, ๊ฒฝ๊ณ , ๋””๋ฒ„๊ทธ ์ •๋ณด

Access Log (์ ‘๊ทผ ๋กœ๊ทธ)

๊ธฐ๋ณธ ๋กœ๊ทธ ํ˜•์‹

192.168.1.100 - - [17/Apr/2026:10:30:15 +0900] "GET /api/users HTTP/1.1" 200 1234 "<https://example.com/>" "Mozilla/5.0..."
Plain Text
๋ณต์‚ฌ
๊ฐ ๋ถ€๋ถ„์˜ ์˜๋ฏธ:
์ˆœ์„œ
๊ฐ’
์˜๋ฏธ
1
192.168.1.100
ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ
2
-
์ธ์ฆ๋œ ์‚ฌ์šฉ์ž (๋ณดํ†ต ๋น„์–ด์žˆ์Œ)
3
-
Remote user
4
[17/Apr/2026:10:30:15 +0900]
์š”์ฒญ ์‹œ๊ฐ„
5
"GET /api/users HTTP/1.1"
์š”์ฒญ ๋ฉ”์„œ๋“œ + ๊ฒฝ๋กœ + ํ”„๋กœํ† ์ฝœ
6
200
HTTP ์ƒํƒœ ์ฝ”๋“œ
7
1234
์‘๋‹ต ๋ฐ”์ดํŠธ ์ˆ˜
8
"<https://example.com/>"
Referer (์–ด๋””์„œ ์™”๋Š”์ง€)
9
"Mozilla/5.0..."
User-Agent (๋ธŒ๋ผ์šฐ์ € ์ •๋ณด)

์ปค์Šคํ…€ ๋กœ๊ทธ ํฌ๋งท

# nginx.conf์˜ http ๋ธ”๋ก์—์„œ http { # ๊ธฐ๋ณธ ํฌ๋งท log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; # ํ™•์žฅ ํฌ๋งท (์‘๋‹ต ์‹œ๊ฐ„ ํฌํ•จ โ€” ์„ฑ๋Šฅ ๋ถ„์„์šฉ) log_format detailed '$remote_addr - [$time_local] ' '"$request" $status $body_bytes_sent ' 'rt=$request_time ' 'urt=$upstream_response_time ' '"$http_user_agent"'; # JSON ํฌ๋งท (๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ ์—ฐ๋™์šฉ) log_format json_log escape=json '{' '"time": "$time_iso8601",' '"remote_addr": "$remote_addr",' '"method": "$request_method",' '"uri": "$request_uri",' '"status": $status,' '"body_bytes_sent": $body_bytes_sent,' '"request_time": $request_time,' '"upstream_response_time": "$upstream_response_time",' '"user_agent": "$http_user_agent"' '}'; access_log /var/log/nginx/access.log detailed; }
Plain Text
๋ณต์‚ฌ
๋ณ€์ˆ˜
์„ค๋ช…
ํ™œ์šฉ
$request_time
์ด ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ (์ดˆ)
๋А๋ฆฐ ์š”์ฒญ ์ฐพ๊ธฐ
$upstream_response_time
๋ฐฑ์—”๋“œ ์‘๋‹ต ์‹œ๊ฐ„
Spring Boot ๋ณ‘๋ชฉ ํ™•์ธ
$bytes_sent
์ „์†ก ๋ฐ”์ดํŠธ
๋Œ€์—ญํญ ๋ชจ๋‹ˆํ„ฐ๋ง
$connection
์—ฐ๊ฒฐ ๋ฒˆํ˜ธ
์—ฐ๊ฒฐ ์ถ”์ 
$request_length
์š”์ฒญ ํฌ๊ธฐ
ํฐ ์š”์ฒญ ๊ฐ์ง€

Error Log (์—๋Ÿฌ ๋กœ๊ทธ)

์—๋Ÿฌ ๋กœ๊ทธ ๋ ˆ๋ฒจ

error_log /var/log/nginx/error.log warn;
Plain Text
๋ณต์‚ฌ
๋ ˆ๋ฒจ
์‹ฌ๊ฐ๋„
์„ค๋ช…
์‚ฌ์šฉ ์‹œ์ 
debug
์ตœ์ €
๋””๋ฒ„๊ทธ ์ •๋ณด (๋งค์šฐ ์ƒ์„ธ)
๊ฐœ๋ฐœ/๋””๋ฒ„๊น… ์‹œ๋งŒ
info
๋‚ฎ์Œ
์ผ๋ฐ˜ ์ •๋ณด
์ƒ์„ธ ๋ชจ๋‹ˆํ„ฐ๋ง
notice
๋ณดํ†ต
์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ด๋ฒคํŠธ
์ผ๋ฐ˜ ์šด์˜
warn
์ฃผ์˜
๊ฒฝ๊ณ  (์„œ๋น„์Šค ์˜ํ–ฅ ์—†์Œ)
ํ”„๋กœ๋•์…˜ ๊ถŒ์žฅ
error
๋†’์Œ
์˜ค๋ฅ˜ (์ผ๋ถ€ ๊ธฐ๋Šฅ ์‹คํŒจ)
ํ”„๋กœ๋•์…˜ ์ตœ์†Œ
crit
๋งค์šฐ ๋†’์Œ
์น˜๋ช…์  ์˜ค๋ฅ˜
์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋งŒ
alert
๊ธด๊ธ‰
์ฆ‰์‹œ ์กฐ์น˜ ํ•„์š”
๊ธด๊ธ‰ ๋ฌธ์ œ๋งŒ
emerg
์ตœ๊ณ 
์‹œ์Šคํ…œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
์‹œ์Šคํ…œ ๋‹ค์šด
ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋ณดํ†ต warn ๋˜๋Š” error ๋ ˆ๋ฒจ์„ ์‚ฌ์šฉํ•ด์š”. debug๋Š” ๋กœ๊ทธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ์Œ“์—ฌ์„œ ๋””์Šคํฌ๋ฅผ ๊ฐ€๋“ ์ฑ„์šธ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜!

ํ”ํ•œ ์—๋Ÿฌ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€

์—๋Ÿฌ ๋ฉ”์‹œ์ง€
์˜๋ฏธ
ํ•ด๊ฒฐ
connect() failed (111: Connection refused)
๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋ฏธ์‹คํ–‰
Spring Boot ์ƒํƒœ ํ™•์ธ
open() "/var/www/..." failed (2: No such file)
ํŒŒ์ผ ์—†์Œ
๊ฒฝ๋กœ ํ™•์ธ, ํŒŒ์ผ ์กด์žฌ ํ™•์ธ
open() "..." failed (13: Permission denied)
๊ถŒํ•œ ์—†์Œ
chown www-data:www-data
client intended to send too large body
์š”์ฒญ ํฌ๊ธฐ ์ดˆ๊ณผ
client_max_body_size ๋Š˜๋ฆฌ๊ธฐ
upstream timed out
๋ฐฑ์—”๋“œ ์‘๋‹ต ์‹œ๊ฐ„ ์ดˆ๊ณผ
proxy_read_timeout ๋Š˜๋ฆฌ๊ธฐ

์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ช…๋ น์–ด

# ์ ‘๊ทผ ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ํ™•์ธ tail -f /var/log/nginx/access.log # ์—๋Ÿฌ ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ํ™•์ธ tail -f /var/log/nginx/error.log # ๋‘ ๋กœ๊ทธ ๋™์‹œ ํ™•์ธ tail -f /var/log/nginx/access.log /var/log/nginx/error.log # ํŠน์ • ์ƒํƒœ์ฝ”๋“œ๋งŒ ํ•„ํ„ฐ๋ง tail -f /var/log/nginx/access.log | grep " 500 " tail -f /var/log/nginx/access.log | grep " 404 " # ํŠน์ • IP์˜ ์š”์ฒญ๋งŒ ๋ณด๊ธฐ tail -f /var/log/nginx/access.log | grep "192.168.1.100" # ๋А๋ฆฐ ์š”์ฒญ ์ฐพ๊ธฐ (์‘๋‹ต ์‹œ๊ฐ„ 1์ดˆ ์ด์ƒ) awk '$NF > 1' /var/log/nginx/access.log
Bash
๋ณต์‚ฌ

๋กœ๊ทธ ๋ถ„์„ ๋ช…๋ น์–ด

# ๊ฐ€์žฅ ๋งŽ์ด ์ ‘์†ํ•œ IP (์ƒ์œ„ 10๊ฐœ) awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 # ๊ฐ€์žฅ ๋งŽ์ด ์š”์ฒญ๋œ URL (์ƒ์œ„ 10๊ฐœ) awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 # ์ƒํƒœ์ฝ”๋“œ๋ณ„ ์š”์ฒญ ์ˆ˜ awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn # ์‹œ๊ฐ„๋Œ€๋ณ„ ์š”์ฒญ ์ˆ˜ awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1,2 | sort | uniq -c # 4xx, 5xx ์—๋Ÿฌ ์ˆ˜ grep " [45][0-9][0-9] " /var/log/nginx/access.log | wc -l
Bash
๋ณต์‚ฌ

๋กœ๊ทธ ๋กœํ…Œ์ด์…˜

๋กœ๊ทธ ํŒŒ์ผ์€ ๊ณ„์† ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ๊ธฐ์ ์œผ๋กœ **๋กœํ…Œ์ด์…˜(์ˆœํ™˜)**ํ•ด์•ผ ํ•ด์š”.
flowchart LR
    A["access.log<br/>(ํ˜„์žฌ ๊ธฐ๋ก ์ค‘)"] -->|"๋กœํ…Œ์ด์…˜"| B["access.log.1<br/>(์–ด์ œ ๋กœ๊ทธ)"]
    B --> C["access.log.2.gz<br/>(๊ทธ์ œ ๋กœ๊ทธ, ์••์ถ•)"]
    C --> D["...<br/>(14์ผ์น˜ ๋ณด๊ด€)"]
    D --> E["๐Ÿ—‘๏ธ ์ž๋™ ์‚ญ์ œ"]
Mermaid
๋ณต์‚ฌ
# logrotate ์„ค์ • ํ™•์ธ cat /etc/logrotate.d/nginx
Bash
๋ณต์‚ฌ
/var/log/nginx/*.log { daily # ๋งค์ผ ๋กœํ…Œ์ด์…˜ missingok # ๋กœ๊ทธ ํŒŒ์ผ ์—†์–ด๋„ ์—๋Ÿฌ ์•„๋‹˜ rotate 14 # 14์ผ์น˜ ๋ณด๊ด€ compress # ์˜ค๋ž˜๋œ ๋กœ๊ทธ gzip ์••์ถ• delaycompress # ํ•˜๋ฃจ ๋’ค์— ์••์ถ• notifempty # ๋นˆ ํŒŒ์ผ์€ ๋กœํ…Œ์ด์…˜ ์•ˆ ํ•จ create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }
Plain Text
๋ณต์‚ฌ

๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ

flowchart TD
    A["๐Ÿšจ ๋ฌธ์ œ ๋ฐœ์ƒ!"] --> B["1๏ธโƒฃ error.log ํ™•์ธ<br/>tail -f error.log"]
    B --> C{"์—๋Ÿฌ ๋ฉ”์‹œ์ง€<br/>ํ™•์ธ๋จ?"}
    C -->|Yes| D["์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜<br/>๋ฌธ์ œ ํ•ด๊ฒฐ"]
    C -->|No| E["2๏ธโƒฃ access.log ํ™•์ธ<br/>์ƒํƒœ์ฝ”๋“œ ๋ถ„์„"]
    E --> F{"์ƒํƒœ์ฝ”๋“œ<br/>๋น„์ •์ƒ?"}
    F -->|4xx| G["ํด๋ผ์ด์–ธํŠธ ๋ฌธ์ œ<br/>๊ฒฝ๋กœ, ๊ถŒํ•œ ํ™•์ธ"]
    F -->|5xx| H["์„œ๋ฒ„ ๋ฌธ์ œ<br/>๋ฐฑ์—”๋“œ ์ƒํƒœ ํ™•์ธ"]
    F -->|No| I["3๏ธโƒฃ ๋„คํŠธ์›Œํฌ ํ™•์ธ<br/>curl, ss ๋ช…๋ น์–ด"]

    D --> J["โœ… ํ•ด๊ฒฐ!"]
    G --> J
    H --> J
    I --> J
Mermaid
๋ณต์‚ฌ

ํ•ต์‹ฌ ์ •๋ฆฌ

access.log: ๋ชจ๋“  HTTP ์š”์ฒญ ๊ธฐ๋ก โ€” IP, URL, ์ƒํƒœ์ฝ”๋“œ, ์‘๋‹ต์‹œ๊ฐ„
error.log: ์˜ค๋ฅ˜/๊ฒฝ๊ณ  ๊ธฐ๋ก โ€” ํ”„๋กœ๋•์…˜์—์„œ๋Š” warn ๋ ˆ๋ฒจ ๊ถŒ์žฅ
์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง: tail -f /var/log/nginx/access.log
์ปค์Šคํ…€ ๋กœ๊ทธ ํฌ๋งท์— $request_time ์ถ”๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ ๋ถ„์„ ๊ฐ€๋Šฅ
logrotate๋กœ ๋กœ๊ทธ ํŒŒ์ผ ์ž๋™ ์ˆœํ™˜ ๊ด€๋ฆฌ ํ•„์ˆ˜