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
