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:#FFB3B3Mermaid
๋ณต์ฌ
๋ก๊ทธ ํ์ผ | ๊ฒฝ๋ก | ๊ธฐ๋ก ๋ด์ฉ |
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 --> JMermaid
๋ณต์ฌ
ํต์ฌ ์ ๋ฆฌ
access.log: ๋ชจ๋ HTTP ์์ฒญ ๊ธฐ๋ก โ IP, URL, ์ํ์ฝ๋, ์๋ต์๊ฐ
error.log: ์ค๋ฅ/๊ฒฝ๊ณ ๊ธฐ๋ก โ ํ๋ก๋์
์์๋ warn ๋ ๋ฒจ ๊ถ์ฅ
์ค์๊ฐ ๋ชจ๋ํฐ๋ง: tail -f /var/log/nginx/access.log
์ปค์คํ
๋ก๊ทธ ํฌ๋งท์ $request_time ์ถ๊ฐํ๋ฉด ์ฑ๋ฅ ๋ถ์ ๊ฐ๋ฅ
logrotate๋ก ๋ก๊ทธ ํ์ผ ์๋ ์ํ ๊ด๋ฆฌ ํ์




