Nginx เป็น web server ที่มีประสิทธิภาพสูง แต่เมื่อเกิดปัญหา การแก้ไขอาจทำให้ system administrator เสียเวลานาน ปัญหา Nginx ที่พบบ่อย เช่น 502 Bad Gateway, 504 Gateway Timeout, 403 Forbidden และ 413 Request Entity Too Large มักเกิดจากการตั้งค่าไม่ถูกต้อง permission issues หรือปัญหา upstream connection ในบทความนี้ เราจะศึกษาวิธีการแก้ปัญหา Nginx อย่างเป็นระบบ ตั้งแต่การตรวจสอบการแก้ไขไฟล์ configuration ไปจนถึงการใช้เครื่องมือ debugging ขั้นสูง เพื่อให้ server ของคุณทำงานได้อย่างราบรื่นบน Cloud VPS
การตรวจสอบ Configuration Syntax ด้วย nginx -t
ก่อนที่จะ restart หรือ reload Nginx ควรตรวจสอบ syntax ของไฟล์ configuration ก่อน เพื่อหลีกเลี่ยงปัญหาที่เกิดจากการเขียน configuration ผิด
วิธีตรวจสอบ Configuration
sudo nginx -t
ผลลัพธ์ที่ถูกต้องจะแสดงดังนี้:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
หากมีข้อผิดพลาด ระบบจะแสดง error message พร้อมบอกบรรทัดและไฟล์ที่ผิด เช่น:
nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/default:25
nginx: configuration file /etc/nginx/nginx.conf test failed
ทันทีที่แก้ไขเสร็จ ให้รัน nginx -t อีกครั้ง จากนั้นถึง reload configuration
sudo nginx -s reload
การตรวจสอบ Error Log และ Access Log
Log files เป็นเครื่องมือสำคัญสำหรับการแก้ปัญหา Nginx โดยปกติ error log จะบันทึกปัญหาที่เกิดขึ้น ในขณะที่ access log บันทึกทุก HTTP request
ตำแหน่ง Error Log
ตำแหน่ง default ของ error log:
/var/log/nginx/error.log
ดู error log แบบ real-time:
sudo tail -f /var/log/nginx/error.log
ดู 50 บรรทัดสุดท้าย:
sudo tail -n 50 /var/log/nginx/error.log
ค้นหา error ที่เฉพาะเจาะจง:
sudo grep "502\|503\|connection refused" /var/log/nginx/error.log
ตำแหน่ง Access Log
ตำแหน่ง default ของ access log:
/var/log/nginx/access.log
เช่นเดียวกับ error log สามารถดู access log แบบ real-time ด้วย tail -f
ปัญหา 502 Bad Gateway — สาเหตุและวิธีแก้
502 Bad Gateway เกิดเมื่อ Nginx ไม่สามารถเชื่อมต่อกับ upstream server (เช่น PHP-FPM, Node.js, Gunicorn) นี่คือปัญหาที่พบได้บ่อยที่สุด
สาเหตุทั่วไปของ 502 Bad Gateway
- Upstream server ไม่ทำงาน — PHP-FPM, Node.js หรือแอปพลิเคชันหยุดทำงาน
- Socket ไม่สามารถเข้าถึงได้ — PHP-FPM socket ไม่มี permission ที่ถูกต้อง
- Connection refused — Port ของ upstream ไม่เปิด หรือ upstream ไม่ listening
- Timeout — Upstream ตอบสนองช้าเกินกว่า timeout ที่ตั้งไว้
- Out of memory — Server หมด memory
วิธีแก้ 502 Bad Gateway
1. ตรวจสอบว่า Upstream Service ทำงานอยู่
# ตรวจสอบ PHP-FPM
sudo systemctl status php8.1-fpm
# ตรวจสอบ Node.js application
ps aux | grep node
# ตรวจสอบ Gunicorn
ps aux | grep gunicorn
2. ตรวจสอบ Socket/Port Availability
# ตรวจสอบว่า PHP-FPM socket มีอยู่หรือไม่
ls -la /run/php/php8.1-fpm.sock
# ตรวจสอบ Permission ของ socket
stat /run/php/php8.1-fpm.sock
Socket ต้องสามารถอ่านและเขียนได้โดย nginx user (default: www-data)
# แก้ไข permission ถ้าจำเป็น
sudo chown www-data:www-data /run/php/php8.1-fpm.sock
sudo chmod 660 /run/php/php8.1-fpm.sock
3. ตรวจสอบ Nginx Configuration
# ตรวจสอบว่า fastcgi_pass ชี้ไปยังตำแหน่ง socket ที่ถูกต้อง
sudo grep -n "fastcgi_pass\|proxy_pass" /etc/nginx/sites-enabled/*
ตัวอย่าง configuration ที่ถูกต้อง:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
4. ตรวจสอบ Server Resource
# ดูการใช้ memory
free -h
# ดูการใช้ CPU
top -bn1 | head -n 10
# ดูจำนวน process ที่กำลังทำงาน
ps aux | wc -l
ถ้า server หมด memory หรือ CPU สูง ให้เพิ่ม resource หรือปรับ configuration
ปัญหา 504 Gateway Timeout
504 Gateway Timeout เกิดเมื่อ upstream server ตอบสนองช้า เกินกว่า timeout ที่ตั้งไว้ ปัญหานี้มักเกิดจากการประมวลผลที่ใช้เวลานาน
วิธีแก้ 504 Gateway Timeout
1. เพิ่มค่า Timeout ใน Nginx Configuration
upstream php_backend {
server unix:/run/php/php8.1-fpm.sock;
# เพิ่ม timeout
connect_timeout 60s;
send_timeout 60s;
read_timeout 300s; # 5 นาที
}
server {
location ~ \.php$ {
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 300s;
fastcgi_pass php_backend;
}
}
2. ตรวจสอบ Application Performance
ตรวจสอบ log ของ application เพื่อดู query ที่ช้า หรือ bottleneck
# ตรวจสอบ PHP-FPM slow log
sudo tail -f /var/log/php8.1-fpm.log
3. เพิ่ม Upstream Worker
upstream php_backend {
server unix:/run/php/php8.1-fpm.sock weight=1;
server unix:/run/php/php8.1-fpm-2.sock weight=1;
}
ปัญหา 403 Forbidden
403 Forbidden มักเกิดจากปัญหา file permissions หรือ configuration ที่ block access
สาเหตุทั่วไป
- File หรือ directory ไม่สามารถอ่านได้โดย nginx user
- Directory ไม่มี index file (index.html, index.php)
- ตั้งค่า location block ที่ deny access
วิธีแก้
# ตรวจสอบ file permission
ls -la /var/www/html/index.php
# แก้ไข permission
sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 755 /var/www/html/
sudo chmod 644 /var/www/html/*.php
ตรวจสอบ Nginx configuration สำหรับ deny rules:
sudo grep -n "deny\|allow" /etc/nginx/sites-enabled/*
ปัญหา 413 Request Entity Too Large
413 Request Entity Too Large เกิดเมื่อขนาดไฟล์ที่ส่ง upload เกินค่า limit ที่ตั้งไว้
วิธีแก้
# เพิ่มค่า client_max_body_size ใน /etc/nginx/nginx.conf
http {
client_max_body_size 100M;
}
จากนั้น test configuration และ reload:
sudo nginx -t
sudo systemctl reload nginx
ปัญหา Permission — File Permissions และ SELinux
ตรวจสอบ File Permissions
# ดู user ของ nginx
ps aux | grep nginx
# ดู owner ของ files
ls -la /var/www/html/
Nginx user (default: www-data หรือ nginx) ต้องมี read permission สำหรับทั้งหมด parent directories และ files
# ตั้งค่า permission ที่ถูกต้อง
sudo chown -R www-data:www-data /var/www/html/
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
ตรวจสอบ SELinux (บน Red Hat/CentOS)
# ดูสถานะ SELinux
getenforce
# ถ้า SELinux เปิดอยู่ ให้ตั้งค่า context
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?"
sudo restorecon -Rv /var/www/html/
ปัญหา Upstream Connection Refused
Connection refused เกิดเมื่อ Nginx ไม่สามารถเชื่อมต่อกับ upstream server ได้ เนื่องจาก upstream ไม่ running หรือ port ไม่ถูกต้อง
วิธีแก้
# ตรวจสอบว่า service ทำงานหรือไม่
sudo systemctl status php8.1-fpm
sudo systemctl status nodejs
# ตรวจสอบว่า port เปิดหรือไม่
sudo netstat -tlnp | grep LISTEN
# หรือ (บนระบบที่ใหม่)
sudo ss -tlnp | grep LISTEN
ถ้า service ไม่ทำงาน ให้ restart:
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
ปัญหา DNS Resolution Issues
ถ้า Nginx ใช้ domain name เป็น upstream (ไม่ใช่ IP address) และการแก้ไข DNS ล้มเหลว request จะ fail
วิธีแก้
# ทดสอบ DNS resolution
nslookup backend.example.com
dig backend.example.com
# ตรวจสอบ /etc/resolv.conf
cat /etc/resolv.conf
ในการกำหนด upstream ให้ใช้ resolver:
http {
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
upstream backend {
server backend.example.com:8080;
}
}
ปัญหา SSL Certificate Errors
SSL ไม่ทำงาน
# ตรวจสอบว่า certificate file มีอยู่หรือไม่
ls -la /etc/ssl/certs/
ls -la /etc/ssl/private/
# ตรวจสอบวันหมดอายุของ certificate
openssl x509 -noout -dates -in /etc/ssl/certs/your-certificate.crt
ตัวอย่าง server block ที่ถูกต้อง:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/your-certificate.crt;
ssl_certificate_key /etc/ssl/private/your-key.key;
ssl_protocols TLSv1.2 TLSv1.3;
}
ตรวจสอบ syntax:
sudo nginx -t
ปัญหา “Too Many Open Files”
ปัญหานี้เกิดเมื่อ Nginx สร้าง connections มากเกินกว่า system limit
วิธีแก้
# ตรวจสอบ current limit
ulimit -n
# ตั้งค่า limit สำหรับ root user
ulimit -n 65536
# สำหรับ permanent change ให้แก้ไข /etc/security/limits.conf
# เพิ่มบรรทัด:
# * soft nofile 65536
# * hard nofile 65536
# ตรวจสอบว่า worker_connections ใน nginx.conf ไม่เกิน limit
sudo grep "worker_connections" /etc/nginx/nginx.conf
ปัญหา Worker Connections Exceeded
ปัญหานี้เกิดเมื่อ connections เกินค่า worker_connections ที่ตั้งไว้
วิธีแก้
# ดูค่าปัจจุบัน
sudo grep "worker_connections" /etc/nginx/nginx.conf
# คำนวณค่าที่เหมาะสม = (worker_rlimit_nofile / worker_processes)
# เพิ่มค่าใน /etc/nginx/nginx.conf
events {
worker_connections 10000;
}
ต้องตั้งค่า worker_rlimit_nofile ให้เท่ากับหรือมากกว่า worker_connections
worker_processes auto;
worker_rlimit_nofile 65536;
events {
worker_connections 10000;
}
ปัญหา Disk Space และ Memory Issues
ตรวจสอบ Disk Space
# ดูจำนวน free space
df -h
# ดู usage ของ /var directory
du -sh /var/*
# ล้าง old log files
sudo find /var/log -name "*.log.*" -delete
ตรวจสอบ Memory
# ดูการใช้ memory
free -h
# ดู process ที่ใช้ memory มากที่สุด
ps aux --sort=-%mem | head
ถ้า memory ไม่พอ ให้ปรับ configuration:
# ลดค่า buffer size
client_body_buffer_size 128k;
client_max_body_size 10m;
# ปรับจำนวน worker processes
worker_processes auto;
ปัญหา Nginx Won’t Start หรือ Restart ล้มเหลว
วิธีแก้
# ตรวจสอบ syntax
sudo nginx -t
# ดู error message เมื่อ start
sudo systemctl start nginx
sudo systemctl status nginx
# ดู detailed error
sudo journalctl -u nginx -n 50
ปัญหาที่พบบ่อย:
- Port ถูกใช้ไปแล้ว: เปลี่ยน listen port หรือ kill process ที่ใช้ port
- Configuration syntax error: ใช้
nginx -tเพื่อตรวจสอบ - Permission denied: ตรวจสอบ owner ของ config files
การ Enable Debug Logging
สำหรับปัญหาที่ซับซ้อน ให้เปิดใช้ debug logging:
# แก้ไข /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log debug;
# test และ reload
sudo nginx -t
sudo systemctl reload nginx
# ดู debug messages
sudo tail -f /var/log/nginx/error.log
ปิด debug logging หลังแก้ไขเสร็จ เพราะจะสร้าง log file ขนาดใหญ่:
error_log /var/log/nginx/error.log warn;
ใช้ Strace และ GDB สำหรับการ Debug ขั้นสูง
Strace — ติดตาม System Calls
# ติดตาม process ของ nginx master
sudo strace -p $(ps aux | grep "[n]ginx: master" | awk '{print $2}') -e trace=file
# บันทึกผลลัพธ์เข้าไฟล์
sudo strace -p $(ps aux | grep "[n]ginx: master" | awk '{print $2}') -o /tmp/nginx.trace
ผลลัพธ์จะแสดง system calls ที่ nginx ทำ ช่วยในการหาสาเหตุของปัญหา I/O
GDB — GNU Debugger
# ติดตาม nginx process ด้วย gdb
sudo gdb -p $(ps aux | grep "[n]ginx: worker" | awk '{print $2}' | head -1)
# ในภายใน gdb:
(gdb) bt # backtrace — แสดง call stack
(gdb) info threads # ดู threads
(gdb) quit # ออก
เครื่องมือเหล่านี้ช่วยวินิจฉัยปัญหาที่ซับซ้อน แต่ต้องมีความรู้เพิ่มเติมในการใช้
Methodology สำหรับการแก้ปัญหาอย่างเป็นระบบ
เมื่อ Nginx มีปัญหา ให้ทำตามขั้นตอนนี้อย่างเป็นระบบ:
- ตรวจสอบ Status ของ Nginx —
sudo systemctl status nginx - ตรวจสอบ Configuration Syntax —
sudo nginx -t - ดู Error Log —
sudo tail -f /var/log/nginx/error.log - ตรวจสอบ Upstream Service — เช่น PHP-FPM, Node.js
- ตรวจสอบ File Permissions — เพิ่มเติม directory และ files
- ตรวจสอบ System Resource — CPU, memory, disk space
- ตรวจสอบ Network Connectivity — ดูว่า upstream reachable หรือไม่
- Enable Debug Logging ถ้าจำเป็น — สำหรับปัญหาที่ซับซ้อน
- ลองเพิ่มเติม Timeout Values — ถ้ากำลังเกี่ยวกับ timeout
- Restart Nginx —
sudo systemctl restart nginx
สรุป
การแก้ปัญหา Nginx ต้องใช้ความเข้าใจเกี่ยวกับ configuration, file permissions, และ upstream services การใช้เครื่องมือสำคัญ เช่น nginx -t, error log, สถานะของ service และการตรวจสอบ network connectivity จะช่วยให้แก้ไขปัญหาอย่างรวดเร็ว นอกจากนี้ การติดตาม error messages และการเปิด debug logging จะทำให้ระบุสาเหตุที่ชัดเจน บน Cloud VPS ของ DE เราขอแนะนำให้ตั้งค่า monitoring เพิ่มเติม เช่น real-time log tracking และ resource monitoring เพื่อป้องกันปัญหาเหล่านี้ล่วงหน้า
แนะนำบริการ DE Cloud VPS
การรัน Nginx บน Cloud VPS ต้องเลือก server ที่มีประสิทธิภาพสูง ทีม DE ให้บริการ Cloud VPS ที่มีความเสถียร ระบบจัดการ resource ที่ดี และ technical support ที่พร้อมช่วยเหลือ 24/7 บน Cloud VPS ของ DE คุณจะได้รับ:
- Scalable Resources — ปรับ CPU, memory, storage ตามความต้องการ
- Pre-installed Web Server Tools — Nginx, Apache, PHP-FPM พร้อมใช้งาน
- Backup & Restore — ป้องกันการสูญหายข้อมูล
- Security Features — Firewall, DDoS protection, SSL certificates
- Technical Support — ทีมผู้เชี่ยวชาญ ready to assist
สำหรับข้อมูลเพิ่มเติม โปรดเยี่ยมชม https://de.co.th/cloud-vps หรือติดต่อทีมของเรา เพื่อเลือก package ที่เหมาะสมกับ application ของคุณ
Keywords: Nginx troubleshooting, แก้ปัญหา Nginx, Nginx 502, Nginx error fix, Nginx configuration, Cloud VPS, web server

