Lab 12 — Final Troubleshooting Lab
1. Mục tiêu
Đây là lab tổng kết toàn bộ kiến thức Linux nền tảng từ Lab 1 → Lab 11.
Thay vì học từng command riêng lẻ, chúng ta sẽ đóng vai một DevOps Engineer nhận một server đang có nhiều lỗi và phải tự tìm nguyên nhân.
Mục tiêu:
Linux
↓
Process
↓
Network
↓
DNS
↓
Firewall
↓
Nginx
↓
Git
Sau lab này, bạn cần hình thành một kỹ năng quan trọng:
Không đoán lỗi — kiểm tra từng tầng và thu hẹp phạm vi lỗi.
2. Tình huống thực tế
Bạn nhận được một server production:
Client
│
│ https://todo.example.com
▼
Server
│
├── Nginx :80
│
└── Backend :8080
Developer báo:
"Website không truy cập được."
Bạn SSH vào server.
Không được phép:
sudo reboot
hoặc:
sudo systemctl restart nginx
một cách tùy tiện.
Nhiệm vụ của bạn là:
- Xác định lỗi.
- Tìm root cause.
- Sửa lỗi.
- Verify.
- Ghi lại nguyên nhân.
3. Mô hình Lab
Chúng ta tạo:
Client
│
│ HTTP
▼
Nginx :80
│
│ Reverse Proxy
▼
Backend :8080
Backend sử dụng Python đơn giản:
python3 -m http.server 8080
4. Chuẩn bị Backend
Tạo application:
mkdir -p ~/lab12/backend
cd ~/lab12/backend
Tạo file:
echo "Todo API is working" > index.html
Chạy:
python3 -m http.server 8080
Test:
curl http://localhost:8080
Kết quả:
Todo API is working
5. Cấu hình Nginx
Tạo:
sudo nano /etc/nginx/sites-available/lab12
Nội dung:
server {
listen 80;
server_name _;
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;
}
}
Enable:
sudo ln -s \
/etc/nginx/sites-available/lab12 \
/etc/nginx/sites-enabled/lab12
Kiểm tra:
sudo nginx -t
Reload:
sudo systemctl reload nginx
Test:
curl http://localhost
Kết quả:
Todo API is working
6. Hiểu hệ thống trước khi Debug
Trước khi troubleshoot, hãy vẽ lại:
Client
│
│ HTTP :80
▼
Firewall
│
▼
Nginx
:80
│
│ proxy_pass
▼
Backend
:8080
Khi request fail, có thể lỗi nằm ở:
Client
↓
Network
↓
Firewall
↓
Nginx
↓
Backend
Không nên kiểm tra ngẫu nhiên.
7. Quy tắc Debug quan trọng nhất
Khi gặp lỗi:
Website không hoạt động
Không bắt đầu bằng:
sudo systemctl restart nginx
Hãy đi từ ngoài vào trong:
1. DNS
↓
2. Network
↓
3. Port
↓
4. Firewall
↓
5. Nginx
↓
6. Backend
↓
7. Application
8. Step 1 — Kiểm tra DNS
Nếu có domain:
dig todo.example.com
hoặc:
nslookup todo.example.com
Kiểm tra:
Domain
↓
IP
Nếu domain trỏ sai IP:
DNS ✗
thì chưa cần kiểm tra Nginx.
Trick
Có thể bỏ qua DNS để test server trực tiếp:
curl http://SERVER_IP
Nếu:
SERVER_IP → OK
DOMAIN → FAIL
thì rất có khả năng vấn đề nằm ở DNS/domain/HTTP routing.
9. Step 2 — Kiểm tra Server
SSH vào:
ssh user@server
Kiểm tra:
hostname
ip addr
ip route
Mục tiêu:
Server có đúng máy không?
Có IP không?
Có default route không?
10. Step 3 — Kiểm tra Listening Port
Đây là command cực kỳ quan trọng:
sudo ss -lntp
Tìm:
:80
:8080
Ví dụ:
LISTEN 0 511 0.0.0.0:80
LISTEN 0 128 127.0.0.1:8080
Có nghĩa:
Nginx
↓
0.0.0.0:80
Backend
↓
127.0.0.1:8080
11. Step 4 — Test Backend trực tiếp
Đây là bước rất quan trọng.
curl http://127.0.0.1:8080
Nếu:
Todo API is working
thì:
Backend ✓
Nếu:
Connection refused
thì:
Backend ✗
Không cần debug Nginx trước.
12. Step 5 — Test Nginx
Nếu Backend OK:
curl http://localhost
Nếu nhận:
Todo API is working
thì:
Nginx ✓
Backend ✓
13. Step 6 — Kiểm tra Nginx Service
sudo systemctl status nginx
Nếu:
Active: active (running)
thì Nginx đang chạy.
Nếu:
failed
kiểm tra:
sudo nginx -t
và:
sudo journalctl -u nginx --no-pager
14. Step 7 — Kiểm tra Nginx Configuration
Luôn chạy:
sudo nginx -t
Nếu:
syntax is ok
test is successful
thì syntax hợp lệ.
Nếu lỗi:
nginx: [emerg] ...
đọc chính xác:
file nào?
line nào?
directive nào?
Đừng đoán.
15. Step 8 — Kiểm tra Nginx Logs
Access log:
sudo tail -f /var/log/nginx/access.log
Error log:
sudo tail -f /var/log/nginx/error.log
Sau đó từ terminal khác:
curl http://localhost
Quan sát log.
16. Tạo lỗi #1 — Backend Down
Dừng Backend:
Ctrl + C
Test:
curl http://localhost
Có thể nhận:
502 Bad Gateway
Debug
curl http://127.0.0.1:8080
Kết quả:
Connection refused
→ Backend đang down.
Kiểm tra process:
ps aux | grep python
Kiểm tra port:
sudo ss -lntp | grep 8080
Root Cause
Backend process
↓
DOWN
↓
Nginx cannot connect
↓
502
17. Fix lỗi #1
Khởi động lại Backend:
cd ~/lab12/backend
python3 -m http.server 8080
Test:
curl http://127.0.0.1:8080
Sau đó:
curl http://localhost
18. Tạo lỗi #2 — Sai Port
Sửa Nginx:
proxy_pass http://127.0.0.1:8081;
Kiểm tra:
sudo nginx -t
Reload:
sudo systemctl reload nginx
Test:
curl http://localhost
→ 502.
19. Debug lỗi #2
Backend:
curl http://127.0.0.1:8080
→ OK.
Nginx:
curl http://localhost
→ FAIL.
Kiểm tra:
sudo ss -lntp
Bạn thấy:
8080
nhưng Nginx đang proxy:
8081
Root Cause
Nginx
│
└── :8081 ✗
Backend
│
└── :8080 ✓
Sửa:
proxy_pass http://127.0.0.1:8080;
Sau đó:
sudo nginx -t
sudo systemctl reload nginx
20. Tạo lỗi #3 — Nginx Configuration
Thử thêm lỗi syntax:
server {
listen 80
server_name _;
}
Thiếu:
;
Chạy:
sudo nginx -t
Nginx sẽ báo lỗi.
Bài học
Không bao giờ:
Edit config
↓
Restart ngay
Hãy:
Edit
↓
nginx -t
↓
reload
21. Tạo lỗi #4 — Firewall
Kiểm tra firewall:
sudo ufw status
Nếu UFW đang active:
Status: active
Xem rules:
sudo ufw status numbered
Ví dụ:
80/tcp ALLOW
22/tcp ALLOW
Nếu port 80 bị block:
Internet
│
X
Firewall
│
▼
Nginx
Nginx có thể đang chạy hoàn toàn bình thường nhưng client bên ngoài vẫn không truy cập được.
22. Firewall Debug
Có một cách phân biệt rất hữu ích.
Test local
curl http://localhost
Nếu OK:
Nginx ✓
Test từ máy khác
curl http://SERVER_IP
Nếu fail:
Local ✓
Remote ✗
Hãy kiểm tra:
Firewall
Network
Cloud Security Group
Routing
Đây là pattern troubleshooting rất hay gặp.
23. Step 9 — Kiểm tra Process
Nếu Backend không hoạt động:
ps aux | grep python
Hoặc:
pgrep -af python
Bạn cần xác định:
Process có chạy không?
PID là gì?
Process chạy bằng user nào?
24. Step 10 — Kiểm tra Resource
Application có thể chết vì thiếu tài nguyên.
Kiểm tra CPU/RAM:
top
hoặc:
free -h
Disk:
df -h
Disk inode:
df -i
Nếu:
Disk = 100%
application có thể không thể:
Write log
Create file
Write database
Create temporary file
25. Một lỗi production rất phổ biến
Ví dụ:
Website chậm
Không nhất thiết là Nginx.
Kiểm tra:
top
Nếu:
CPU 100%
→ Có thể application đang quá tải.
Nếu:
free -h
RAM gần hết:
→ Có thể memory pressure.
Nếu:
df -h
Disk 100%:
→ Có thể log/database/container image đầy disk.
26. Step 11 — Kiểm tra Network
Kiểm tra interface:
ip addr
Kiểm tra route:
ip route
Kiểm tra connectivity:
ping 8.8.8.8
Kiểm tra DNS:
ping google.com
Nếu:
ping 8.8.8.8 ✓
ping google.com ✗
thì rất có thể:
Internet ✓
DNS ✗
27. Step 12 — Kiểm tra HTTP
Dùng:
curl -v http://localhost
-v rất hữu ích.
Bạn có thể thấy:
> GET /
> Host: localhost
< HTTP/1.1 200 OK
< Server: nginx
Như vậy bạn biết:
TCP connection ✓
HTTP request ✓
HTTP response ✓
28. Phân biệt Connection Refused và Timeout
Đây là kiến thức rất quan trọng.
Connection refused
curl: (7) Connection refused
Thường nghĩ đến:
Không có process listen
Port sai
Service down
Timeout
Connection timed out
Thường nghĩ đến:
Firewall
Network
Routing
Security Group
Không phải lúc nào cũng đúng 100%, nhưng đây là hướng điều tra ban đầu rất hữu ích.
29. Step 13 — Git Troubleshooting
DevOps cũng thường phải xử lý Git.
Kiểm tra:
git status
Xem branch:
git branch
Xem remote:
git remote -v
Xem lịch sử:
git log --oneline --graph
30. Tình huống Git
Developer nói:
"Tôi đã sửa code nhưng không thấy thay đổi."
Kiểm tra:
git status
Nếu:
nothing to commit
kiểm tra:
git log --oneline
Có thể:
Đang ở sai branch
Kiểm tra:
git branch
Ví dụ:
* main
feature/login
Trong khi code được commit ở:
feature/login
31. Git Scenario — Uncommitted Changes
git status
Nếu:
modified: nginx.conf
xem:
git diff
Bạn có thể quyết định:
Giữ
↓
git add
↓
git commit
hoặc:
Bỏ
↓
git restore nginx.conf
32. Git Scenario — Merge Conflict
Nếu:
git merge feature/nginx
bị:
CONFLICT
không panic.
Làm:
git status
Sửa file.
Sau đó:
git add .
git commit
Nếu muốn hủy:
git merge --abort
33. Final Troubleshooting Challenge
Bây giờ hãy không xem phần solution bên dưới.
Giả sử hệ thống:
Client
│
▼
Nginx :80
│
▼
Backend :8080
Developer báo:
"API trả 502."
Bạn cần tự tìm nguyên nhân.
Checklist
curl http://localhost
curl http://localhost:8080
sudo ss -lntp
sudo systemctl status nginx
sudo nginx -t
sudo tail -n 50 /var/log/nginx/error.log
ps aux
df -h
free -h
34. Final Challenge — Tự xây Incident
Tạo các lỗi sau từng lỗi một:
Scenario A
Backend bị stop.
Mục tiêu:
502
Tìm root cause.
Scenario B
Nginx proxy tới:
8081
Backend chạy:
8080
Tìm root cause.
Scenario C
Nginx config sai syntax.
Tìm root cause bằng:
nginx -t
Scenario D
Firewall block port 80.
Mục tiêu:
Local request → OK
Remote request → FAIL
Tìm root cause.
Scenario E
Disk đầy:
/dev/sda1 100%
Tìm:
df -h
và:
du -sh /*
Sau đó xác định thư mục chiếm nhiều disk.
Không chạy
rm -rfbừa bãi trong production.
35. Incident Response Workflow
Trong production, bạn có thể sử dụng workflow:
Alert
│
▼
Understand Impact
│
▼
Check Symptoms
│
▼
Collect Evidence
│
▼
Identify Root Cause
│
▼
Apply Fix
│
▼
Verify
│
▼
Document
Ví dụ:
502
↓
curl backend
↓
Connection refused
↓
ss -lntp
↓
8080 không listen
↓
process backend chết
↓
restart application
↓
curl backend
↓
200 OK
↓
curl nginx
↓
200 OK
36. Đừng sửa khi chưa hiểu
Một trong những thói quen nguy hiểm:
Website lỗi
↓
restart nginx
↓
restart server
↓
reboot
Bạn có thể vô tình:
- Làm mất evidence.
- Làm gián đoạn service.
- Che giấu root cause.
- Khiến incident khó điều tra hơn.
Thay vào đó:
Observe
↓
Measure
↓
Understand
↓
Fix
↓
Verify
37. Một số command "vũ khí" cần nhớ
Process
ps aux
top
pgrep
kill
Systemd
systemctl status
systemctl restart
journalctl
Network
ip addr
ip route
ss -lntp
ping
curl
DNS
dig
nslookup
Disk
df -h
df -i
du -sh
Nginx
nginx -t
systemctl status nginx
tail -f /var/log/nginx/error.log
Git
git status
git diff
git log
git branch
git switch
git merge
38. Cheat Sheet — Debug theo tầng
Khi service không hoạt động:
Service Down
│
▼
┌───────────────┐
│ DNS │
└───────┬───────┘
▼
┌───────────────┐
│ Network │
└───────┬───────┘
▼
┌───────────────┐
│ Firewall │
└───────┬───────┘
▼
┌───────────────┐
│ Port │
└───────┬───────┘
▼
┌───────────────┐
│ Process │
└───────┬───────┘
▼
┌───────────────┐
│ Service │
└───────┬───────┘
▼
┌───────────────┐
│ Application │
└───────────────┘
39. Bảng triệu chứng → hướng điều tra
| Triệu chứng | Kiểm tra đầu tiên |
|---|---|
| DNS không resolve | dig, nslookup |
| Connection refused | ss -lntp, process |
| Connection timeout | Firewall/network |
| 502 | Backend + error.log |
| 404 | Nginx routing/application routing |
| 500 | Application logs |
| CPU cao | top |
| RAM đầy | free -h, top |
| Disk đầy | df -h, du |
| Service chết | systemctl, journalctl |
| Git thay đổi không thấy | git status, git branch |
| Git conflict | git status |
40. Kết quả cần đạt
Sau Lab 12, bạn không chỉ cần nhớ command.
Bạn cần hình thành tư duy troubleshooting:
Problem
↓
Observe
↓
Break system into layers
↓
Test each layer
↓
Eliminate possibilities
↓
Find root cause
↓
Fix
↓
Verify
Ví dụ:
Website không truy cập được
↓
DNS?
↓
IP?
↓
Firewall?
↓
Port 80?
↓
Nginx?
↓
Backend?
↓
Application?
41. Tổng kết Phase 1
Sau 12 lab, bạn đã đi qua toàn bộ nền móng:
Lab 1
Linux Filesystem
↓
Lab 2
Users & Permissions
↓
Lab 3
Process & systemd
↓
Lab 4
CPU / RAM / Disk
↓
Lab 5
SSH
↓
Lab 6
Networking
↓
Lab 7
DNS & HTTP
↓
Lab 8
Firewall
↓
Lab 9
Nginx & Reverse Proxy
↓
Lab 10
Git
↓
Lab 11
Git Branching
↓
Lab 12
Troubleshooting
Kiến thức này sẽ trở thành nền móng cho Phase tiếp theo:
Linux
↓
Docker
↓
Docker Compose
↓
Ansible
↓
Terraform
↓
Kubernetes
↓
Helm
↓
ArgoCD / GitOps
↓
Prometheus / Grafana / Loki
↓
Azure / AKS
Điều quan trọng nhất của Phase 1
Đừng đánh giá bản thân bằng việc:
"Tôi nhớ được bao nhiêu command?"
Hãy đánh giá bằng câu hỏi:
"Khi một server production gặp sự cố, tôi có biết bắt đầu kiểm tra từ đâu và làm thế nào để thu hẹp nguyên nhân không?"
Nếu bạn có thể nhìn:
502 Bad Gateway
và tự suy luận:
Nginx đang trả 502
↓
Nginx có chạy?
↓
Backend có listen?
↓
Port có đúng?
↓
Backend có response?
↓
Logs nói gì?
thì bạn đã bắt đầu có tư duy của một DevOps Engineer, chứ không chỉ đang học Linux command.
All rights reserved