Nginx

Nginx Error Messages และวิธีแก้ไข — คู่มือจัดการ Error ทุกรูปแบบ

Nginx เป็น web server ที่มีความเสถียร และประสิทธิภาพสูง แต่เมื่อเกิด error ขึ้น ผู้ดูแลระบบจำเป็นต้องเข้าใจว่า error แต่ละตัวมีความหมายอย่างไร และแนวทางการแก้ไขเป็นอย่างไร บทความนี้จะช่วยให้คุณสามารถจัดการ Nginx error messages ได้อย่างมีประสิทธิภาพ ตั้งแต่การระบุปัญหา ตรวจสอบ error logs ไปจนถึงการแก้ไขอย่างถูกต้อง ซึ่งจะช่วยลดเวลาการ troubleshoot และป้องกันการหยุดให้บริการ

ความเข้าใจพื้นฐานเกี่ยวกับ HTTP Error Codes

HTTP Status Codes เป็นการตอบสนองของ server ที่บ่งชี้ผลลัพธ์ของ request จากไคลเอนต์ รหัส 3 หลักแต่ละตัวมีความหมายต่างกัน โดยแบ่งเป็นกลุ่มหลัก ดังนี้:

  • 1xx (Informational) — ข้อมูลเพิ่มเติม Request ยังดำเนินการอยู่
  • 2xx (Success) — Request สำเร็จแล้ว
  • 3xx (Redirection) — ต้องมี Action เพิ่มเติมเพื่อสำเร็จ
  • 4xx (Client Error) — ข้อผิดพลาดจากฝั่ง Client
  • 5xx (Server Error) — ข้อผิดพลาดจากฝั่ง Server

บทความนี้มุ่งเน้นไปที่ 4xx และ 5xx errors เนื่องจากเป็น error ที่มักปรากฏบน Nginx และต้องการการจัดการเชิงรุก

Client Error (4xx) และวิธีแก้ไข

400 Bad Request

ความหมาย: Server ไม่สามารถประมวลผล request ได้เพราะ syntax ไม่ถูกต้อง

สาเหตุทั่วไป:

  • HTTP header ผิดรูปแบบ
  • URL parameter มีอักขระพิเศษไม่ valid
  • Request body ใหญ่เกินขีดจำกัด (ตรวจสอบ client_max_body_size)
  • Cookie corrupt หรือ header ซ้ำซ้อน

วิธีแก้ไข:

  • เพิ่มค่า client_max_body_size ใน Nginx config
  • ล้าง cache browser และ cookies
  • ตรวจสอบ Content-Type header ว่าตรงกับ request body
  • ดู error log เพื่อหาข้อมูลเพิ่มเติม
http {
    client_max_body_size 100M;
}

401 Unauthorized

ความหมาย: Request ต้องการการยืนยันตัวตน (Authentication) แต่ยังไม่ได้ให้

สาเหตุทั่วไป:

  • ไม่ได้ส่ง Authorization header
  • Username/Password ไม่ถูกต้อง
  • Token หรือ API key หมดอายุ
  • Cookie session หมดอายุ

วิธีแก้ไข:

  • ตรวจสอบ credentials ว่าถูกต้อง
  • ยืนยันว่า Authorization header ถูกส่งมาใน request
  • อัพเดต token/API key หากหมดอายุ
  • ล้าง session cookies และ login ใหม่

403 Forbidden

ความหมาย: Server ยืนยันตัวตนแล้ว แต่ไม่มีสิทธิ์เข้าถึง resource นั้น

สาเหตุทั่วไป:

  • File permissions (chmod) ไม่ถูกต้อง
  • Directory indexing ถูก disable
  • IP address ถูก block
  • User role ไม่มีสิทธิ์เข้าถึง

วิธีแก้ไข:

  • ตรวจสอบ file permission: ls -la /path/to/file
  • ปรับ ownership: chown www-data:www-data /path/to/file
  • ปรับ permission: chmod 644 /path/to/file
  • ตรวจสอบ Nginx access rules (allow/deny directives)
# ตัวอย่าง: เปลี่ยน file permission
chmod 644 /var/www/html/index.html
chown www-data:www-data /var/www/html/index.html

404 Not Found

ความหมาย: Server ไม่พบ resource ที่ร้องขอ

สาเหตุทั่วไป:

  • File/page ถูกลบไปแล้ว
  • URL ผิด (typo)
  • Document root ตั้งค่าผิด
  • URL rewrite rules ไม่ถูกต้อง
  • Permalink ไม่ตรงกับ directory structure

วิธีแก้ไข:

  • ตรวจสอบ root path ใน Nginx config: root /var/www/html;
  • ตรวจสอบไฟล์ยังคงอยู่: ls -la /var/www/html/path/to/file
  • ปรับ error_page directive ให้แสดง custom 404 page
  • ตรวจสอบ try_files directive สำหรับ URL rewriting
# ตัวอย่าง: Custom 404 page ใน Nginx
server {
    root /var/www/html;
    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}

405 Method Not Allowed

ความหมาย: Request method (GET, POST, PUT, DELETE) ไม่ถูกอนุญาตสำหรับ resource นี้

สาเหตุทั่วไป:

  • Config Nginx ระบุได้ว่า method ไหนอนุญาต (limit_except)
  • Application logic ไม่รองรับ method นั้น
  • API endpoint ต้องใช้ POST แต่ส่ง GET มา

วิธีแก้ไข:

  • ตรวจสอบ limit_except directives
  • ใช้ method ที่ถูกต้องในการ call API/endpoint
  • ตรวจสอบ Allow header ที่ server ส่งมา
# ตัวอย่าง: จำกัด methods ใน Nginx
location /upload {
    limit_except GET POST {
        deny all;
    }
}

408 Request Timeout

ความหมาย: Server รอ request จาก client นานเกินไป

สาเหตุทั่วไป:

  • Client connection ช้า
  • Timeout setting ใน Nginx ตั้งค่าน้อยเกินไป
  • Network issue ระหว่าง client-server

วิธีแก้ไข:

  • เพิ่มค่า client_header_timeout, client_body_timeout
  • ตรวจสอบ network latency
  • ตรวจสอบว่า client ไม่ stuck (connection issue)
http {
    client_header_timeout 60s;
    client_body_timeout 60s;
    keepalive_timeout 65s;
}

413 Payload Too Large

ความหมาย: Request body ใหญ่เกินขีดจำกัดที่ server ตั้งไว้

สาเหตุทั่วไป:

  • Upload file ขนาดใหญ่เกินขีดจำกัด
  • client_max_body_size ตั้งค่าน้อยเกินไป

วิธีแก้ไข:

  • เพิ่มค่า client_max_body_size ใน nginx.conf
  • ตรวจสอบขีดจำกัดใน PHP (post_max_size, upload_max_filesize) หากใช้ PHP
# ตัวอย่าง: เพิ่ม limit สำหรับ upload ใหญ่
http {
    client_max_body_size 500M;
}

# PHP config (php.ini)
post_max_size = 500M
upload_max_filesize = 500M

414 URI Too Long

ความหมาย: URL เบิ้งเกินขีดจำกัดที่ server กำหนด

สาเหตุทั่วไป:

  • Query string มีข้อมูลมากเกินไป
  • large_client_header_buffers ตั้งค่าน้อยเกินไป

วิธีแก้ไข:

  • ใช้ POST request แทน GET เมื่อส่งข้อมูลมาก
  • เพิ่มค่า large_client_header_buffers
http {
    large_client_header_buffers 4 16k;
}

429 Too Many Requests

ความหมาย: Client ส่ง request มากเกินไปในช่วงเวลาสั้น

สาเหตุทั่วไป:

  • Rate limiting จาก Nginx/Cloudflare ถูกเรียกใช้
  • DDoS attack
  • Crawling/scraping ไม่ควบคุม

วิธีแก้ไข:

  • ตรวจสอบว่า client IP ถูก rate limit
  • ปรับ limit_req settings หากต้อง
  • ใช้ User-Agent limit สำหรับ bot/crawler
# ตัวอย่าง: Rate limiting ใน Nginx
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;

server {
    location / {
        limit_req zone=general burst=20 nodelay;
    }
}

444 Connection Closed Without Response

ความหมาย: Nginx ปิดการเชื่อมต่อโดยไม่ส่ง response กลับ

สาเหตุทั่วไป:

  • Request มาจาก IP ที่ถูก block (allow/deny rules)
  • Invalid request format
  • Bot/scanner ถูกตรวจพบ

วิธีแก้ไข:

  • ตรวจสอบ error log: tail -f /var/log/nginx/error.log
  • ตรวจสอบ allow/deny rules
  • ตรวจสอบ IP ของ client ว่าไม่ถูก block

495-497 SSL Certificate Errors

495 — SSL Certificate Required

Client ต้องส่ง SSL certificate มากับ request แต่ไม่ส่ง

496 — SSL Certificate Rejected

SSL certificate ไม่ valid หรือไม่อนุญาต

497 — HTTP Request Sent to HTTPS Port

Client ส่ง HTTP request ไปยัง HTTPS port

สาเหตุและวิธีแก้ไข:

  • ตรวจสอบ SSL certificate ว่า valid และ match domain
  • ใช้ https:// แทน http://
  • ตรวจสอบ certificate expiry date: openssl x509 -in /path/to/cert.pem -text -noout
  • อัพเดต certificate หากหมดอายุ
# ตรวจสอบ SSL certificate
openssl x509 -in /etc/nginx/ssl/certificate.pem -text -noout | grep -A 2 "Validity"

# บังคับ HTTPS redirect
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

499 Client Closed Request

ความหมาย: Client ปิดการเชื่อมต่อก่อนที่ server จะส่ง response

สาเหตุทั่วไป:

  • Client timeout (disconnect ก่อน server ตอบ)
  • Request processing ช้าเกินไป
  • Network interrupt

วิธีแก้ไข:

  • เพิ่ม send_timeout หากการส่ง response ช้า
  • ปรับปรุง server performance
  • ตรวจสอบ fastcgi_read_timeout (สำหรับ PHP)
http {
    send_timeout 60s;
    fastcgi_read_timeout 300s;
}

Server Error (5xx) และวิธีแก้ไข

500 Internal Server Error

ความหมาย: Server เกิดข้อผิดพลาดภายในที่ไม่สามารถจัดการได้

สาเหตุทั่วไป:

  • PHP script error
  • Database connection failed
  • Permission/file ownership ผิด
  • Memory limit exceeded
  • Upstream application crash

วิธีแก้ไข:

  • ดู error log: tail -f /var/log/nginx/error.log
  • ตรวจสอบ PHP error log: tail -f /var/log/php-fpm.log
  • ตรวจสอบ upstream status (ถ้าใช้ proxy)
  • ตรวจสอบ database connection
  • เพิ่ม memory limit หากจำเป็น

502 Bad Gateway

ความหมาย: Nginx ไม่สามารถติดต่อ upstream server ได้ (เช่น PHP-FPM, Application Server)

สาเหตุทั่วไป:

  • Upstream server (PHP-FPM) ไม่รัน
  • PHP-FPM socket/port ไม่เปิด
  • Upstream server crashed
  • Max connections ถึง limit
  • Upstream server ตอบช้าเกินไป

วิธีแก้ไข:

  • ตรวจสอบ PHP-FPM status: systemctl status php-fpm
  • Restart PHP-FPM: systemctl restart php-fpm
  • ตรวจสอบ upstream address ใน nginx.conf ว่าถูกต้อง
  • เพิ่ม proxy timeouts เพื่อให้ upstream มีเวลาพอ
upstream php_backend {
    server unix:/var/run/php-fpm.sock;
    server 127.0.0.1:9000 backup;
}

server {
    location ~ \.php$ {
        proxy_pass http://php_backend;
        proxy_connect_timeout 10s;
        proxy_read_timeout 300s;
    }
}

503 Service Unavailable

ความหมาย: Server ไม่พร้อมให้บริการชั่วคราว (อาจกำลังบำรุงรักษา หรือ overload)

สาเหตุทั่วไป:

  • All upstream servers down
  • Server อยู่ใน maintenance mode
  • CPU/Memory ใช้ 100%
  • Too many requests (all worker processes busy)

วิธีแก้ไข:

  • ตรวจสอบ server resource: top, free -h, df -h
  • ตรวจสอบ upstream servers ทั้งหมดว่าเปิด
  • เพิ่ม worker processes ถ้า CPU ยังว่าง
  • ใช้ custom 503 error page สำหรับ maintenance
# ตรวจสอบ resource
top -b -n 1 | head -20
free -h
df -h

# ตัวอย่าง: Custom 503 page สำหรับ maintenance
server {
    listen 80;
    root /var/www/html;

    error_page 503 /maintenance.html;
    location = /maintenance.html {
        internal;
    }

    # ตรวจสอบ maintenance file
    if (-f /var/www/html/maintenance.lock) {
        return 503;
    }
}

504 Gateway Timeout

ความหมาย: Upstream server ตอบช้าเกินไป ทำให้ Nginx timeout

สาเหตุทั่วไป:

  • Upstream server query ไม่เสร็จในเวลาที่กำหนด
  • Database query slow
  • External API call timeout
  • Upstream server overload

วิธีแก้ไข:

  • เพิ่ม proxy_connect_timeout, proxy_read_timeout, proxy_send_timeout
  • ปรับปรุง query performance (Database index)
  • ปรับปรุง application performance
  • เพิ่ม upstream server resources (RAM, CPU)
# ตัวอย่าง: เพิ่ม timeout settings
upstream app_backend {
    server app1.example.com;
    server app2.example.com;
}

server {
    location / {
        proxy_pass http://app_backend;
        proxy_connect_timeout 30s;
        proxy_send_timeout 60s;
        proxy_read_timeout 300s;
    }
}

Error Log Levels และการอ่าน Error Logs

Nginx แบ่ง log levels เป็นระดับต่าง ๆ ตามความสำคัญของปัญหา:

Level ความหมาย ตัวอย่าง
debug ข้อมูลดีบัก (รายละเอียด) *[debug] 12345#0: …
info ข้อมูลทั่วไป *[info] worker process started
notice ข้อมูลสำคัญ *[notice] signal process started
warn คำเตือน *[warn] upstream server slow
error ข้อผิดพลาด *[error] connect to upstream failed
crit ปัญหาวิกฤต *[crit] socket() failed
alert ปัญหาฉุกเฉิน *[alert] worker process terminated
emerg ปัญหาร้ายแรงที่สุด *[emerg] bind to port failed

วิธีการอ่าน Error Logs

ที่อยู่ของ Nginx error log:

  • /var/log/nginx/error.log (Ubuntu/Debian)
  • /var/log/nginx/error.log (RHEL/CentOS)
  • สามารถกำหนด path เอง ใน nginx.conf ด้วย: error_log /path/to/error.log warn;

คำสั่งดู logs:

# ดู error log แบบ real-time
tail -f /var/log/nginx/error.log

# ดู 50 บรรทัดสุดท้าย
tail -50 /var/log/nginx/error.log

# ค้นหา error เฉพาะ (เช่น 502)
grep "502" /var/log/nginx/error.log

# ค้นหา error จากเวลาที่กำหนด
grep "2026/04/06 10:" /var/log/nginx/error.log

# นับจำนวน error แต่ละประเภท
grep "\[error\]" /var/log/nginx/error.log | wc -l

ตั้งค่า Error Log Level

ในไฟล์ nginx.conf หรือ server block:

# ตั้งค่า log level ใน main context
error_log /var/log/nginx/error.log warn;

# หรือใน server block
server {
    error_log /var/log/nginx/domain-error.log info;
}

Custom Error Responses และ Error Page Configuration

Nginx อนุญาตให้เราสร้าง custom error page เพื่อให้ user ดูหน้า error ที่ตรงกับ brand ของเรา

การสร้าง Custom Error Pages

ขั้นตอนที่ 1: สร้างไฟล์ HTML สำหรับ error pages

# สร้าง directory สำหรับ error pages
mkdir -p /var/www/html/errors

# สร้างไฟล์ 404.html
cat > /var/www/html/errors/404.html << 'EOF'



    404 Not Found