0

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à:

  1. Xác định lỗi.
  2. Tìm root cause.
  3. Sửa lỗi.
  4. Verify.
  5. 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 -rf bừ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

Viblo
Let's register a Viblo Account to get more interesting posts.