เมื่อเว็บไซต์แสดง Error หรือทำงานผิดปกติ สิ่งแรกที่ต้องทำคือ "อ่าน Error Log" เพราะ Log คือหลักฐานที่ Server บันทึกไว้ทุกครั้งที่เกิดปัญหา บน DirectAdmin มี Log อยู่หลายประเภทที่ให้ข้อมูลต่างกัน ทั้ง Apache Error Log, Access Log และ PHP Error Log
ประเภทของ Log บน DirectAdmin
- Apache Error Log — บันทึก Error จาก Web Server เช่น Permission Denied, File Not Found, 500 Internal Server Error
- Apache Access Log — บันทึกทุก Request ที่เข้ามา ใช้วิเคราะห์ Traffic และหา Request ที่ผิดปกติ
- PHP Error Log — บันทึก Error จากโค้ด PHP โดยเฉพาะ เช่น Warning, Fatal Error, Notice
- FTP Transfer Log — บันทึกการอัพโหลด/ดาวน์โหลดผ่าน FTP
วิธีเปิดดู Error Log ผ่าน DirectAdmin
วิธีที่ 1: ผ่าน DirectAdmin Panel
- Login เข้า DirectAdmin
- ไปที่ Advanced Features → Site Summary / Statistics / Logs
- เลือก Domain ที่ต้องการดู Log
- คลิก Error Log หรือ Access Log
- DirectAdmin จะแสดง Log 20–50 บรรทัดล่าสุด
วิธีที่ 2: ผ่าน File Manager
Log Files จะถูกเก็บในตำแหน่งนี้ (อาจแตกต่างตาม Config ของ Hosting):
~/logs/yourdomain.com.error.log ~/logs/yourdomain.com.bytes_log ~/logs/yourdomain.com.log (access log) ~/logs/php_errorlog
เปิด File Manager ใน DirectAdmin → ไปที่ logs/ → คลิกขวาเพื่อดูเนื้อหาไฟล์
วิธีที่ 3: ผ่าน SSH (ถ้ามีสิทธิ์)
tail -n 100 ~/logs/yourdomain.com.error.log tail -f ~/logs/yourdomain.com.error.log # ดู real-time
คำสั่ง tail -f แสดง Log แบบ Real-time เหมาะมากสำหรับ Debug ปัญหาที่กำลังเกิดขึ้น
อ่าน Apache Error Log
Format ของ Apache Error Log มีรูปแบบดังนี้:
[Thu May 16 10:23:45.123456 2026] [core:error] [pid 12345] [client 1.2.3.4:54321] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error.
- วันเวลา — เวลาที่เกิด Error
- [core:error] — Module และ Level ของ Error
- [client IP] — IP ของผู้เรียก Request
- ข้อความ Error — คำอธิบายปัญหา
Error ที่พบบ่อยและวิธีแก้ไข
1. 500 Internal Server Error
[error] [client x.x.x.x] SoftException in Application.cpp:360: Script has to be an executable and writable only by its owner.
สาเหตุ: Permission ของไฟล์ PHP ผิด (ต้องเป็น 644 ไม่ใช่ 777)
แก้ไข: File Manager → คลิกขวาที่ไฟล์ → Change Permission → ตั้งเป็น 644
2. Permission Denied
[error] [client x.x.x.x] (13)Permission denied: /home/user/public_html/.htaccess pcfg_openfile: unable to check htaccess file
สาเหตุ: Permission ของ .htaccess หรือ Folder ไม่ถูกต้อง
แก้ไข: Folder ควรเป็น 755, ไฟล์ควรเป็น 644
3. File Not Found (404)
[error] [client x.x.x.x] File does not exist: /home/user/public_html/wp-login.php
สาเหตุ: ไฟล์ถูกลบหรือ URL ผิด อาจเป็น Bot scan หา WordPress หรือ Directory Traversal
แก้ไข: ถ้าเป็น WordPress ให้ตรวจว่า wp-login.php มีอยู่ ถ้าเป็น Bot ให้ดูปริมาณ Request และพิจารณา Block IP
4. .htaccess Redirect Loop
[error] Request exceeded the limit of 10 internal redirects
สาเหตุ: RewriteRule ใน .htaccess วนซ้ำ (Loop)
แก้ไข: ตรวจ RewriteRule ว่ามี Guard Condition ป้องกัน Loop หรือไม่
Log Level และความหมายของแต่ละระดับ
Apache จัดระดับความรุนแรงของ Log ไว้ 8 ระดับ ตามมาตรฐาน RFC 5424 ซึ่งช่วยให้กรอง Log ได้ตรงจุดมากขึ้น:
| Level | ความหมาย | ควรทำอะไร |
|---|---|---|
emerg |
ฉุกเฉินสุด — Server หยุดทำงานทั้งหมด | แก้ทันที |
alert |
ต้องดำเนินการทันที | แก้ทันที |
crit |
วิกฤต — บางฟีเจอร์ล้มเหลว | ตรวจสอบด่วน |
error |
Error ที่ทำให้ Request ล้มเหลว (500, 403) | ตรวจสอบโดยเร็ว |
warn |
คำเตือน — ยังทำงานได้แต่มีปัญหาแฝง | บันทึกไว้ตรวจภายหลัง |
notice / info / debug |
ข้อมูลทั่วไป / Debug | ใช้เฉพาะตอน Debug จริง |
บน DirectAdmin Hosting ค่า LogLevel ปกติตั้งที่ warn หรือ error ซึ่งเหมาะสมสำหรับ Production เพราะไม่ Flood Log ด้วยข้อมูลที่ไม่จำเป็น หากต้องการ Debug ลึกขึ้นสามารถเพิ่มลงใน .htaccess ชั่วคราวได้:
LogLevel debug
จำไว้ว่าต้องลบบรรทัดนี้ออกหลัง Debug เสร็จ มิฉะนั้น Log File จะโตขึ้นอย่างรวดเร็วและเปลืองพื้นที่ Disk
วิเคราะห์ Log เพื่อหา Bot และ DDoS
Access Log เป็นเครื่องมือสำคัญในการตรวจสอบว่ามี Bot หรือการโจมตีเกิดขึ้นหรือไม่ สัญญาณที่ควรระวังได้แก่:
- Request จำนวนมากจาก IP เดียว ในช่วงเวลาสั้น เช่น 1,000 Request ใน 1 นาที
- User-Agent ผิดปกติ เช่น
python-requests/2.x,curl/7.x,Go-http-client/2.0 - URL Pattern ซ้ำ ๆ เช่น
/wp-admin/,/xmlrpc.php,/.env,/admin/login - 404 จำนวนมากในเวลาสั้น มักเป็น Vulnerability Scanner ที่ลองเส้นทางต่าง ๆ
เมื่อพบ IP น่าสงสัย สามารถ Block ได้ทันทีด้วย .htaccess:
# Block IP เดี่ยว Deny from 203.0.113.1 # Block ทั้ง Subnet Deny from 203.0.113.0/24
หรือใช้ mod_evasive (ถ้า Hosting รองรับ) สำหรับ Rate Limiting อัตโนมัติ เพื่อป้องกัน IP ใหม่ที่โจมตีแทนที่จะต้องแบน IP ทีละตัว
เทคนิค: ใช้คำสั่ง awk นับ Request แยกตาม IP จาก Access Log ได้รวดเร็ว:awk '{print $1}' ~/logs/yourdomain.com.log | sort | uniq -c | sort -rn | head -20
ผลลัพธ์คือ Top 20 IP ที่ส่ง Request มากที่สุดพร้อมจำนวน
อ่าน Access Log
Access Log บันทึกทุก HTTP Request ในรูปแบบ Combined Log Format:
1.2.3.4 - - [16/May/2026:10:23:45 +0700] "GET /index.html HTTP/1.1" 200 1234 "https://google.com" "Mozilla/5.0..."
1.2.3.4— IP ของผู้เข้าชมGET /index.html— Method และ URL ที่ขอ200— HTTP Status Code1234— ขนาด Response (bytes)"https://google.com"— Referer"Mozilla/5.0..."— User Agent
ใช้ Access Log เพื่อ:
- หา IP ที่ส่ง Request จำนวนมาก (DDoS/Bot)
- ตรวจสอบว่า Search Engine Crawler เข้าถึงหน้าไหน
- วิเคราะห์ Error 404 และ 500 ที่เกิดขึ้นบ่อย
- ดู Bandwidth ที่แต่ละ Request ใช้
ค้นหาใน Log ด้วย grep
หากมีสิทธิ์ SSH ใช้ grep เพื่อกรอง Log ที่ต้องการ:
# หา Error ทั้งหมด grep "\[error\]" ~/logs/yourdomain.com.error.log # หา 500 Error จาก Access Log grep " 500 " ~/logs/yourdomain.com.log # หา Request จาก IP เฉพาะ grep "^1\.2\.3\.4" ~/logs/yourdomain.com.log # หา 404 Error วันนี้ grep "16/May/2026" ~/logs/yourdomain.com.log | grep " 404 "
Log File ขนาดใหญ่เกิน 10 MB ควร Download มาดูในเครื่อง Local แทนการเปิดบน File Manager เพราะอาจทำให้เบราว์เซอร์ค้างได้ ใช้ Text Editor อย่าง Notepad++ หรือ VS Code แทน
เปิด PHP Error Log สำหรับ Debug
PHP Error Log แยกต่างหากจาก Apache Error Log อ่านได้ที่:
~/logs/php_errorlog # หรือตามที่กำหนดใน php.ini: error_log = /home/username/logs/php_errorlog
ถ้าต้องการเปิดใช้ PHP Error Log ให้เพิ่มใน .htaccess:
php_flag log_errors on php_value error_log /home/username/logs/php_errorlog
แปลความหมาย PHP Error ที่พบบ่อยใน Log
PHP Error Log มีหลายประเภทที่ Developer มักพบในการทำงานประจำวัน การอ่านให้เป็นช่วยประหยัดเวลา Debug ได้มาก:
- Fatal error: Call to undefined function — เรียกฟังก์ชันที่ยังไม่ได้ประกาศหรือ Include ไฟล์ที่มีฟังก์ชันนั้นยังไม่ครบ ตรวจว่า require/include ถูกต้องหรือไม่
- Warning: Cannot modify header information - headers already sent — มีการ Output อะไรบางอย่าง (เช่น ช่องว่าง หรือ BOM) ก่อน
header()ตรวจไฟล์ที่ Include ว่ามีช่องว่างหลัง?>หรือไม่ - Fatal error: Maximum execution time of 30 seconds exceeded — Script ทำงานนานเกิน PHP Timeout (ปกติ 30 วินาที) มักเกิดกับ Loop ที่ไม่มีการหยุด หรือ Query ที่ช้ามาก
- Notice: Undefined variable — ใช้ตัวแปรที่ยังไม่ได้กำหนดค่า PHP เวอร์ชันใหม่ (8.0+) อาจ Throw Fatal Error แทน Notice
- Warning: mysql_connect(): Access denied — ข้อมูล Database ผิด (User, Password, Host) ตรวจค่าใน Configuration File
- Parse error: syntax error, unexpected — Syntax ผิดในโค้ด PHP ดูบรรทัดที่ Error Log ระบุ มักเป็น Missing semicolon หรือ Bracket ปิดไม่ครบ
เมื่อพบ PHP Error ให้บันทึก Error Message เต็ม ๆ และ Line Number จาก Log แล้วค้นหาใน Stack Overflow หรือ PHP Manual ก็จะได้วิธีแก้ไขอย่างรวดเร็ว ขอแนะนำให้เปิด Log ในขณะที่ทำการ Test ฟีเจอร์ใหม่ ๆ เพื่อจับ Error ได้ทันทีก่อนที่จะปิด Display Errors บน Production จริง
ตั้งค่า Error Reporting ใน PHP.ini และ .htaccess
บน Shared Hosting มักไม่สามารถแก้ไข php.ini ระดับ Server ได้โดยตรง แต่สามารถ Override ค่าบางอย่างได้ผ่าน .htaccess ซึ่ง DirectAdmin รองรับ ค่าที่สำคัญในการจัดการ Error Reporting ได้แก่:
# ซ่อน Error จากหน้าเว็บแต่ยังบันทึกลง Log php_flag display_errors off php_flag log_errors on php_value error_log /home/username/logs/php_errorlog # แสดง Error ทั้งหมด (ใช้ตอน Development เท่านั้น) php_flag display_errors on php_value error_reporting -1 # แสดงเฉพาะ Fatal Error (ไม่แสดง Notice/Warning) php_value error_reporting E_ERROR
กฎสำคัญ: บน Production Server ควรตั้ง display_errors off เสมอ เพราะการแสดง Error บนหน้าเว็บเปิดเผยข้อมูล Path และโครงสร้างของ Code ให้ Hacker ได้โดยไม่จำเป็น ให้บันทึกลง Log แทนและอ่านจาก Log โดยตรง
คำแนะนำ: สร้างไฟล์ .htaccess แยกสำหรับโฟลเดอร์ logs/ เพื่อป้องกันไม่ให้ผู้เข้าชมทั่วไปเข้าถึง Log File ผ่านเบราว์เซอร์ได้ โดยเพิ่มบรรทัด Deny from all หรือ Options -Indexes ในโฟลเดอร์ logs
Log Rotation และการจัดการ Log File อัตโนมัติ
บน Hosting ที่ใช้งานมานาน Log File มักสะสมจนมีขนาดใหญ่หลายร้อย MB โดยเฉพาะ Access Log ที่บันทึกทุก Request DirectAdmin จัดการ Log Rotation ให้อัตโนมัติในหลาย Hosting Plan ซึ่งหมายความว่า Log จะถูก Compress และ Archive เป็นรายวันหรือรายสัปดาห์ ไฟล์ Archive ที่ Compress แล้วจะช่วยประหยัดพื้นที่ Disk ได้อย่างมากโดยยังสามารถค้นหาข้อมูลย้อนหลังได้ ตัวอย่าง Log ที่ Archive แล้วจะมีชื่อไฟล์ดังนี้:
~/logs/yourdomain.com.error.log ~/logs/yourdomain.com.error.log.1.gz ~/logs/yourdomain.com.error.log.2.gz
หากต้องการอ่าน Log ที่ถูก Compress แล้วโดยไม่ต้องแตกไฟล์ ใช้คำสั่ง zcat หรือ zgrep:
# อ่าน Log ที่ Compress แล้ว zcat ~/logs/yourdomain.com.error.log.1.gz | tail -100 # ค้นหาใน Log ที่ Compress แล้ว zgrep "\[error\]" ~/logs/yourdomain.com.error.log.1.gz
หากต้องการเคลียร์ Log เก่าด้วยตนเองเพื่อประหยัด Disk Space สามารถลบไฟล์ .gz เก่า ๆ ได้โดยตรงผ่าน File Manager ใน DirectAdmin แต่ไม่ควรลบไฟล์ Log ปัจจุบัน (.log ที่ไม่มีตัวเลขต่อท้าย) เพราะ Apache จะเขียน Log ลงในไฟล์นั้นต่อไปเรื่อย ๆ โดยทั่วไปแนะนำเก็บ Log ไว้อย่างน้อย 30 วันเพื่อใช้อ้างอิงกรณีพบปัญหาที่ไม่แสดงอาการทันที เช่น ปริมาณ Bot ที่ค่อย ๆ เพิ่มขึ้นตามเวลา หรือ Error ที่เกิดขึ้นซ้ำ ๆ เฉพาะบางช่วงเวลา
โฮสติ้งที่ให้คุณเข้าถึง Log ได้เต็มรูปแบบ
AsiaGB Hosting เปิด Error Log และ Access Log ให้ทุก Account ผ่าน DirectAdmin พร้อม SSD Storage เริ่มต้น 500 บาท/ปี
ดูแพ็กเกจโฮสติ้ง