กลับไปหน้าบทความ
#Nginx#Logs#Debug#Web Server#DevOps

อ่าน Nginx Logs ให้เป็น เพื่อลดเวลา Debug เว็บได้อย่างมีประสิทธิภาพ

การอ่าน Nginx Logs อย่างเป็นลำดับช่วยลดเวลาในการ debug ปัญหาเว็บได้อย่างมาก ไม่ว่าจะเป็นเว็บช้า เว็บเข้าไม่ได้ API ล่ม หรือไฟล์ static ไม่ถูกเสิร์ฟ บทความนี้สรุปแนวคิดและเทคนิคที่ใช้ได้จริงสำหรับทั้งมือใหม่และผู้ดูแลระบบ

15 มิถุนายน 2569อ่านประมาณ 3 นาที

แชร์บทความ

อ่าน Nginx Logs ให้เป็น เพื่อลดเวลา Debug เว็บได้อย่างมีประสิทธิภาพ

การอ่าน Nginx Logs ให้เป็น ไม่ใช่แค่ช่วยแก้ปัญหาได้เร็วขึ้น แต่ยังช่วยให้เข้าใจพฤติกรรมของระบบได้ชัดขึ้นด้วย หลายทีมเสียเวลาไปมากกับการเปิด log แล้วเจอข้อมูลจำนวนมหาศาล จนไม่รู้ว่าควรเริ่มตรงไหน

ความจริงแล้ว หากอ่านอย่างเป็นลำดับและตั้งคำถามให้ถูกตั้งแต่ต้น เราจะไล่ปัญหาได้เร็วขึ้นมาก ทั้งกรณีเว็บเข้าไม่ได้ เว็บช้า API มีปัญหา หรือไฟล์ static ไม่ถูกเสิร์ฟตามที่ควรจะเป็น

บทความนี้สรุปแนวทางแบบใช้งานจริงสำหรับทั้งผู้เริ่มต้นและคนที่ดูแลระบบอยู่แล้ว

รู้จัก log หลัก 2 แบบของ Nginx

โดยทั่วไป Nginx มักมี log หลักอยู่ 2 ประเภท

1. access.log

ใช้เก็บข้อมูลการเข้าถึงระบบ เช่น

  • ใครเป็นคนเรียก
  • เรียก URL ไหน
  • ได้ status code อะไร
  • response มีขนาดเท่าไร
  • ใช้เวลานานแค่ไหน

log ประเภทนี้เหมาะมากสำหรับใช้วิเคราะห์ว่า request ไหนผิดปกติ หรือ request ไหนใช้เวลานานผิดปกติ

2. error.log

ใช้เก็บข้อมูลความผิดปกติของระบบ เช่น

  • เชื่อมต่อไป upstream ไม่ได้
  • หาไฟล์ไม่เจอ
  • permission ไม่พอ
  • configuration มีปัญหา

ถ้าเว็บเข้าไม่ได้ หรือมีอาการผิดปกติชัดเจน error.log มักเป็นจุดเริ่มต้นที่ดีที่สุด

เริ่ม debug จากคำถามที่ถูกต้อง

เวลาระบบมีปัญหา ไม่ควรเปิดทั้ง access.log และ error.log แบบสะเปะสะปะพร้อมกัน เพราะจะยิ่งทำให้สับสน

ให้เริ่มจากคำถามเดียวก่อนว่า ปัญหาที่เกิดขึ้นเป็นแนวไหน

  • ถ้าเข้าเว็บไม่ได้ ให้ดู error.log ก่อน
  • ถ้าเว็บช้า หรือบาง request ดูแปลก ให้ดู access.log ก่อน

การเริ่มจากอาการที่ผู้ใช้พบ จะช่วยลดเวลาในการไล่ปัญหาได้มาก

วิธีอ่าน access.log แบบเร็วและได้ประเด็น

ตัวอย่าง access log

127.0.0.1 - - [01/Jun/2026:10:00:00 +0700] "GET /api/users HTTP/1.1" 500 182 "-" "Mozilla/5.0"

สิ่งสำคัญที่ควรมองให้ออกมีดังนี้

  • IP ของผู้เรียก
  • Method และ path ที่ถูกเรียก
  • Status code
  • ขนาด response
  • User-Agent

หากมีการปรับ log_format เพิ่มเติม อาจพบค่าที่สำคัญมากในการ debug เช่น

  • request_time
  • upstream_response_time

request_time คืออะไร

คือเวลารวมทั้งหมดที่ Nginx ใช้กับ request นั้น ตั้งแต่รับคำขอจนส่งคำตอบเสร็จ

upstream_response_time คืออะไร

คือเวลาที่ backend ใช้ตอบกลับมายัง Nginx เช่นบริการที่รันด้วย Node.js, PHP-FPM, Python หรือ Java

ค่าทั้งสองนี้มีประโยชน์มากเมื่อต้องไล่ปัญหาเว็บช้า

ตีความอาการเว็บช้าจากเวลาใน log

เมื่อดูค่าจาก access.log แล้ว สามารถใช้หลักคิดต่อไปนี้ได้

request_time สูง แต่ upstream_response_time ต่ำ

กรณีนี้มักหมายความว่าปัญหาอาจไม่ได้อยู่ที่ backend โดยตรง แต่อาจเกี่ยวกับ

  • client ช้า
  • network ช้า
  • การส่งไฟล์ขนาดใหญ่
  • การเชื่อมต่อที่ปลายทางรับข้อมูลช้า

upstream_response_time สูง

มักชี้ว่าปัญหาอยู่ที่ backend หรือระบบด้านหลัง เช่น

  • application ทำงานช้า
  • query database ช้า
  • service ภายในตอบกลับช้า

การแยกสองค่านี้ให้ออก ช่วยให้ไม่เสียเวลาโทษผิดจุด

ทำความเข้าใจ status code ที่เจอบ่อยใน Nginx

บาง status code เป็นสัญญาณที่ช่วยชี้ทิศทางการ debug ได้เร็วมาก

499

หมายถึงฝั่ง client ปิด connection ไปก่อนที่ server จะตอบเสร็จ

หลายคนมักเข้าใจผิดว่า server ล่ม ทั้งที่จริงอาจเกิดจาก

  • หน้าเว็บ timeout
  • network ของผู้ใช้มีปัญหา
  • ผู้ใช้กดออกจากหน้าเว็บก่อน

ดังนั้นถ้าเห็น 499 จำนวนมาก อย่าเพิ่งสรุปว่า server พัง

502

มักหมายถึง Nginx ส่งงานต่อไป upstream ไม่สำเร็จ เช่น

  • app ดับ
  • port ไม่เปิด
  • socket ใช้งานไม่ได้
  • service ปลายทางไม่พร้อมรับงาน

504

มักเป็นกรณีที่ Nginx รอ backend นานเกินเวลาที่กำหนด จึงเกิด timeout

403

ควรตรวจสอบเรื่องต่อไปนี้

  • permission ของไฟล์หรือ directory
  • กฎ deny
  • path ที่ Nginx ไม่มีสิทธิ์เข้าถึง

404

หากไฟล์มีอยู่จริง แต่ยังได้ 404 ปัญหาอาจไม่ได้อยู่ที่ไฟล์หาย แต่อาจเกิดจากการตั้งค่า root และ alias ไม่ตรงกัน

ตัวอย่างข้อความใน error.log ที่ควรอ่านออก

ฝั่ง error.log มักบอกสาเหตุได้ชัดกว่ามาก โดยเฉพาะเมื่อระบบมีอาการเข้าไม่ได้หรือเชื่อมต่อ backend ล้มเหลว

connect() failed (111: Connection refused) while connecting to upstream

แปลว่า Nginx พยายามส่ง request ต่อไปยัง backend แล้ว แต่ปลายทางไม่รับการเชื่อมต่อ

สาเหตุที่พบบ่อย เช่น

  • service ยังไม่รัน
  • รันคนละ port
  • container ยังไม่พร้อม
  • firewall บล็อกการเชื่อมต่อ

an upstream response is buffered to a temporary file

ข้อความนี้ไม่ได้แปลว่าเป็น error ร้ายแรงเสมอไป แต่เป็นสัญญาณว่าข้อมูลตอบกลับมีขนาดใหญ่จน Nginx ต้องนำไปพักลง disk ซึ่งอาจกระทบ performance ได้

open() failed (2: No such file or directory)

มักเกิดจาก

  • path ของ static file ผิด
  • deploy แล้วไฟล์ยังมาไม่ครบ
  • อ้างอิงตำแหน่งไฟล์ผิด

permission denied

มักเกี่ยวข้องกับสิทธิ์ของ user ที่ใช้รัน Nginx เช่น www-data หรือ nginx ไม่มีสิทธิ์อ่านไฟล์หรือเข้า directory ที่ต้องใช้งาน

ทริคที่ช่วยให้ debug เร็วขึ้น

การอ่าน log ให้เร็ว ไม่ได้มีแค่การรู้ความหมายของข้อความ แต่รวมถึงวิธีทำงานระหว่างไล่ปัญหาด้วย

ดู log แบบ realtime

ใช้ tail -f เพื่อดูเหตุการณ์ขณะกดหน้าเว็บจริง วิธีนี้ช่วยจับคู่เวลาที่เกิดอาการกับ log ได้แม่นยำมาก

filter เฉพาะสิ่งที่สนใจ

ถ้าระบบมี traffic เยอะ ควรกรองเฉพาะ status code หรือ path ที่เกี่ยวข้อง เช่น 500, 502, 504 เพื่อลด noise

เช็กเวลาให้ตรงกันเสมอ

ควรจับเวลาที่เกิดเหตุให้ตรงกับใน log เพราะหลายครั้งปัญหาไม่ได้อยู่ที่ระบบ แต่อยู่ที่ timezone หรือเวลาของเครื่องไม่ตรงกัน

ระวังกรณีอยู่หลัง load balancer หรือ CDN

ถ้าระบบอยู่หลัง proxy ควรตรวจสอบว่า IP ที่เห็นใน log เป็น IP ของผู้ใช้จริง หรือเป็น IP ของ proxy ไม่เช่นนั้นอาจวิเคราะห์ผู้ใช้งานผิด

เก็บ request id ใน log format

ถ้ายังไม่ได้เก็บ request id ถือว่าพลาดเครื่องมือสำคัญมาก โดยเฉพาะในระบบที่มีหลาย service

request id ช่วยให้ตามรอย request เดียวกันข้ามหลายระบบได้ง่ายขึ้น และมีประโยชน์มากในสถาปัตยกรรมแบบ microservices

ระดับของ error.log ก็สำคัญ

หลายคนคิดว่า error.log มีไว้เก็บเฉพาะ error ร้ายแรง แต่จริง ๆ แล้ว Nginx มีหลายระดับ เช่น

  • debug
  • info
  • notice
  • warn
  • error
  • crit

การเปิด log level สูงเกินไปใน production อาจทำให้

  • log โตเร็วมาก
  • ใช้ disk มาก
  • เพิ่มภาระให้ระบบ

แนวทางที่เหมาะสมคือเพิ่มระดับ log ชั่วคราวตอนกำลังไล่ปัญหา และลดกลับหลังแก้เสร็จ

สูตรจำง่ายเวลา debug เว็บจาก Nginx Logs

ถ้าต้องการแนวทางสั้น ๆ สำหรับใช้งานจริง สามารถจำตามนี้ได้เลย

  • เข้าเว็บไม่ได้ ดู error.log
  • เว็บช้า ดู access.log พร้อมเวลา
  • เจอ 502 หรือ 504 ให้ไล่ upstream
  • เจอ 403 หรือ 404 ให้ไล่ path และ permission
  • เจอ 499 อย่าเพิ่งโทษ server

สรุป

การอ่าน Nginx Logs ให้เป็น คือทักษะที่ช่วยลดเวลา debug ได้อย่างชัดเจน เพราะทำให้เราเลิกเดาสุ่มและหันมาไล่ปัญหาตามหลักฐานจริง

เมื่อเข้าใจความต่างระหว่าง access.log และ error.log อ่าน status code ได้ ตีความเวลาอย่าง request_time และ upstream_response_time เป็น รวมถึงรู้วิธีดู log แบบมีเป้าหมาย เราจะหาสาเหตุของ incident ได้เร็วขึ้นมาก

ท้ายที่สุด คนที่อ่าน log เป็น ไม่ได้แค่แก้ปัญหาไวกว่าเท่านั้น แต่ยังมองเห็นภาพของระบบชัดกว่า รู้ว่าคอขวดอยู่ตรงไหน และสามารถวาง monitoring ได้ตรงจุดมากขึ้น