Nginx

Logging ใน Nginx — จัดการ Error Log และ Access Log อย่างมืออาชีพ

Nginx เป็น Web Server ที่ได้รับความนิยมสูงสุดในโลกในปัจจุบัน แต่เพื่อให้ระบบทำงานได้อย่างเสถียรและปลอดภัย การจัดการ Nginx log อย่างถูกต้องจึงเป็นสิ่งที่ไม่อาจมองข้ามได้ Log ใน Nginx นั้นแบ่งออกเป็น 2 ประเภทหลัก คือ Access Log (บันทึกการเข้าใช้งาน) และ Error Log (บันทึกข้อผิดพลาด) ซึ่งข้อมูลเหล่านี้มีความสำคัญต่อการวินิจฉัยปัญหา ตรวจสอบความปลอดภัย และปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์ บทความนี้จะแนะนำวิธีการ log ใน Nginx อย่างสมบูรณ์ตั้งแต่พื้นฐานไปจนถึงเทคนิคขั้นสูง

Error Log ใน Nginx คืออะไร

Error Log เป็นไฟล์บันทึกที่บ้านข้อผิดพลาด คำเตือน และข้อมูลการวินิจฉัยจากการทำงานของ Nginx ไฟล์นี้ช่วยให้ผู้ดูแลระบบสามารถระบุและแก้ไขปัญหาต่างๆ ที่เกิดขึ้นบนเซิร์ฟเวอร์ได้อย่างรวดเร็ว เช่น ข้อผิดพลาดในการเชื่อมต่อ ปัญหาไฟล์ที่หายไป หรือข้อกำหนดการ upstream ที่มีปัญหา

วิธีการตั้งค่า Error Log ใน Nginx นั้นง่ายมาก คุณเพียงแค่เพิ่มคำสั่ง error_log ลงในไฟล์ config ของ Nginx

error_log Directive

คำสั่ง error_log ใช้เพื่อกำหนดตำแหน่งของไฟล์ log และระดับความสำคัญของข้อมูลที่ต้องการบันทึก ไวยากรณ์มีดังนี้:

error_log /path/to/error.log warn;

เมื่อกำหนด error_log แล้ว Nginx จะบันทึกข้อมูลทั้งหมดที่มีระดับความสำคัญเท่ากับหรือสูงกว่าระดับที่กำหนด ตัวอย่างเช่น หากตั้งค่าเป็น warn ระบบจะบันทึกข้อความ warn, error, crit, alert และ emerg แต่จะไม่บันทึก debug, info และ notice

Log Levels ใน Nginx อธิบายแต่ละระดับ

Nginx มีระดับความสำคัญของ log ถึง 8 ระดับ โดยเรียงจากต่ำสุดไปสูงสุด ดังนี้:

ระดับค่าตัวเลขความหมาย
debug0ข้อมูลสำหรับการวินิจฉัย (debug)
info1ข้อมูลทั่วไป
notice2ประกาศสำคัญที่สำหรับ notice
warn3คำเตือน (warning)
error4ข้อผิดพลาด
crit5สถานการณ์วิกฤต
alert6ข้อมูลที่ต้องอ่านทันที
emerg7ระบบไม่สามารถใช้งานได้

โดยค่าเริ่มต้น Nginx จะตั้งค่า Error Log เป็นระดับ error ซึ่งเหมาะสมสำหรับการใช้งานในสภาพแวดล้อม Production แต่หากต้องการข้อมูลรายละเอียดมากขึ้น คุณสามารถเปลี่ยนเป็น info หรือแม้แต่ debug ได้

# เปลี่ยน log level เป็น info
error_log /var/log/nginx/error.log info;

# สำหรับ debug ให้ข้อมูลรายละเอียด
error_log /var/log/nginx/error.log debug;

Access Log ใน Nginx — บันทึกการเข้าใช้งาน

Access Log เป็นไฟล์บันทึกของการเข้าใช้งานเว็บไซต์ของคุณ ข้อมูลในไฟล์นี้เก็บรวมถึง IP Address ของผู้เยี่ยมชม วันเวลาของการขอ (Request) ข้อมูลที่ขอ (URI) ส่วนหัวของการร้องขอ (HTTP Headers) และสถานะตัวเลข (HTTP Status Code) ข้อมูลเหล่านี้มีประโยชน์ต่อการวิเคราะห์การใช้งาน ตรวจสอบความปลอดภัย และปรับปรุงประสิทธิภาพเว็บไซต์

access_log Directive

คำสั่ง access_log ใช้เพื่อเปิดหรือปิดการบันทึก Access Log และกำหนดตำแหน่งไฟล์

access_log /var/log/nginx/access.log combined;

ที่นี่ combined คือรูปแบบการบันทึก (log format) ที่ Nginx สนับสนุน ซึ่งจะอธิบายในรายละเอียดต่อไป

Log Format — รูปแบบการบันทึก

Nginx ให้ความยืดหยุ่นในการกำหนดรูปแบบของ log โดยใช้คำสั่ง log_format ซึ่งคุณสามารถเลือกข้อมูลที่ต้องการบันทึกได้

log_format Directive

ไวยากรณ์พื้นฐานมีดังนี้:

log_format format_name 'format_string';

ตัวแปรที่ใช้บ่อยในการสร้างรูปแบบ log คือ:

  • $remote_addr — IP Address ของผู้เยี่ยมชม
  • $remote_user — ชื่อผู้ใช้ที่ authenticate (ถ้ามี)
  • $time_local — วันเวลาในรูปแบบท้องถิ่น
  • $request — แสดง HTTP method, URI, และ HTTP version
  • $status — HTTP status code (200, 404, 500 เป็นต้น)
  • $body_bytes_sent — ขนาดของ Response body
  • $http_referer — URL ของเพจที่อ้างอิง
  • $http_user_agent — ข้อมูล User Agent (เบราว์เซอร์)
  • $request_time — เวลาประมวลผล request ทั้งหมด

Combined Format — รูปแบบ Combined

รูปแบบ combined เป็นรูปแบบมาตรฐานที่เปรียบเทียบกันในบรรดา Web Servers กำหนดดังนี้:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

ผลลัพธ์ของ combined format จะมีลักษณะดังนี้:

192.168.1.10 - john [06/Apr/2026:10:15:23 +0700] "GET /index.html HTTP/1.1" 200 1234 "-" "Mozilla/5.0"

JSON Format — รูปแบบ JSON

สำหรับการวิเคราะห์ข้อมูล log ในยุคสมัยนี้ รูปแบบ JSON นั้นเป็นที่นิยมมากขึ้น เพราะว่ามันง่ายต่อการประมวลผลด้วย Script และ Log Aggregation Tools

log_format json_combined escape=json
{
    "time_local":"$time_local",
    "remote_addr":"$remote_addr",
    "remote_user":"$remote_user",
    "request":"$request",
    "status": $status,
    "body_bytes_sent":$body_bytes_sent,
    "request_time":$request_time,
    "http_referrer":"$http_referer",
    "http_user_agent":"$http_user_agent"
};

access_log /var/log/nginx/access.json.log json_combined;

การตั้งค่า Access Log และ Error Log ต่างเว็บไซต์

Nginx ให้ความสามารถในการตั้งค่า log ที่แตกต่างกันสำหรับแต่ละ server block หรือ location block ซึ่งช่วยให้การจัดการและการวิเคราะห์ง่ายขึ้น

server {
    listen 80;
    server_name example.com;

    # log สำหรับ server block นี้
    access_log /var/log/nginx/example.com-access.log combined;
    error_log /var/log/nginx/example.com-error.log warn;

    location /api/ {
        # log เฉพาะสำหรับ /api/
        access_log /var/log/nginx/api-access.log combined;
    }

    location /images/ {
        # ปิด log สำหรับ /images/ เพื่อลดขนาดไฟล์
        access_log off;
    }
}

Conditional Logging — บันทึก Log แบบมีเงื่อนไข

บางครั้งคุณอาจต้องการบันทึก log เฉพาะ request ที่มีเงื่อนไขบางอย่าง เช่น request ที่มี status code 2xx หรือ 3xx เท่านั้น Nginx สนับสนุนการตั้งค่าดังกล่าวผ่าน if parameter

map $status $log_condition {
    default 1;
    ~^2 0;  # ไม่บันทึก status 2xx
    ~^3 0;  # ไม่บันทึก status 3xx
}

server {
    listen 80;
    server_name example.com;

    # บันทึกเฉพาะ request ที่ไม่ใช่ 2xx หรือ 3xx
    access_log /var/log/nginx/errors-access.log combined if=$log_condition;
}

Buffer และ Flush — การดำเนินการแบบ Buffer

Nginx สามารถเก็บ log ไว้ใน buffer ก่อนจึงเขียนลงไฟล์จริง ซึ่งช่วยลดการดำเนินการ I/O และเพิ่มประสิทธิภาพของเซิร์ฟเวอร์

access_log /var/log/nginx/access.log combined buffer=32k flush=5s;

ที่นี่ buffer=32k หมายถึงขนาด buffer คือ 32 กิโลไบต์ และ flush=5s หมายถึงการเขียน log ลงไฟล์ทีละ 5 วินาที การตั้งค่านี้เหมาะสำหรับเซิร์ฟเวอร์ที่มี traffic สูง

Syslog Logging — ส่ง Log ไปยัง Syslog

นอกจากการบันทึก log ลงไฟล์ คุณยังสามารถส่ง log ไปยัง syslog server ได้ซึ่งเป็นประโยชน์สำหรับการจัดการ log บนหลาย server

access_log syslog:server=192.168.1.100:514 combined;
error_log syslog:server=192.168.1.100:514 warn;

การปิด Log สำหรับ Path ต่างๆ

บ่อยครั้งที่เรา ไม่ต้องการบันทึก log สำหรับ request บางอย่าง เช่น favicon.ico, robots.txt หรือ static files เพื่อลดขนาดไฟล์ log และปรับปรุงประสิทธิภาพ

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/access.log combined;

    # ปิด log สำหรับ favicon
    location = /favicon.ico {
        access_log off;
    }

    # ปิด log สำหรับ robots.txt
    location = /robots.txt {
        access_log off;
    }

    # ปิด log สำหรับ static files
    location ~* \.(css|js|gif|jpg|jpeg|png|ico|woff|woff2)$ {
        access_log off;
    }
}

การวิเคราะห์ Log ด้วย Tools

หลังจากเก็บ log ไว้แล้ว ข้อมูลเหล่านี้มีประโยชน์มากหากนำมาวิเคราะห์อย่างถูกต้อง มีหลาย tools ที่สามารถช่วยในการวิเคราะห์ Nginx log

GoAccess — เครื่องมือวิเคราะห์แบบ Real-time

GoAccess เป็นเครื่องมือประเมินผล log แบบ Real-time ที่แสดงข้อมูลการเยี่ยมชมแบบ Interactive

# ติดตั้ง GoAccess
sudo apt-get install goaccess

# วิเคราะห์ log จากไฟล์
goaccess /var/log/nginx/access.log

# สร้างรายงาน HTML
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

AWStats — เครื่องมือวิเคราะห์ระบบเดิม

AWStats เป็นเครื่องมือวิเคราะห์ log ที่เก่าแก่ แต่ยังคงเป็นที่นิยม มีอินเตอร์เฟส Web ที่สะดวก

# ติดตั้ง AWStats
sudo apt-get install awstats

# ตั้งค่าไฟล์ config
sudo nano /etc/awstats/awstats.example.conf

# รันการวิเคราะห์
/usr/lib/cgi-bin/awstats.pl -config=example -update

Security Logging — การบันทึก Log เพื่อความปลอดภัย

การจัดการ log อย่างมีสติต่อความปลอดภัยนั้นมีความสำคัญมาก เพื่อติดตามและป้องกันการโจมตี ลองดูตัวอย่างการบันทึก log เพื่อการตรวจสอบความปลอดภัย

log_format security '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    'referer:"$http_referer" ua:"$http_user_agent" '
                    'args:"$args"';

server {
    listen 80;
    server_name example.com;

    # บันทึก request ทั้งหมด
    access_log /var/log/nginx/security.log security;

    # บันทึก request ที่มี status error
    map $status $loggable {
        ~^[45] 1;
        default 0;
    }

    access_log /var/log/nginx/errors.log security if=$loggable;
}

Best Practices สำหรับการจัดการ Nginx Log

เพื่อให้ระบบ log ของคุณทำงานได้อย่างมีประสิทธิภาพและปลอดภัย ลองทำตามแนวทางปฏิบัติที่ดีต่อไปนี้:

  • หมุนเวียน Log ด้วยประจำ: ใช้ logrotate เพื่อบีบอัดและลบ log เก่า เพื่อไม่ให้ขนาดไฟล์ log ใหญ่เกินไป
  • กำหนดระดับ Log ที่เหมาะสม: ใช้ error หรือ warn สำหรับ Production และ info หรือ debug สำหรับการพัฒนา
  • บันทึก Log สำหรับแต่ละไซต์: ลดการบันทึก static files และ favicon เพื่อประหยัดพื้นที่
  • ใช้รูปแบบ JSON: สำหรับการวิเคราะห์แบบสมัยใหม่ JSON format ทำให้การประมวลผลง่ายขึ้น
  • ตั้งค่า Buffer: เพื่อลด I/O operations และเพิ่มประสิทธิภาพของเซิร์ฟเวอร์
  • ติดตามและวิเคราะห์: ใช้ tools เช่น GoAccess หรือ AWStats เพื่อติดตามสถานะของเซิร์ฟเวอร์

ตัวอย่าง Logrotate Configuration

# ไฟล์ /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

สรุป

การจัดการ Nginx log อย่างมืออาชีพนั้นเป็นสิ่งสำคัญสำหรับการดำเนินงาน Web Server ที่มีประสิทธิภาพ ปลอดภัย และสามารถวินิจฉัยปัญหาได้ ด้วยความเข้าใจในเรื่อง error_log, access_log, log levels, log formats และเครื่องมือวิเคราะห์ต่างๆ คุณจะสามารถควบคุมระบบ log ของเซิร์ฟเวอร์ได้อย่างมีประสิทธิภาพ นอกจากนี้ การสร้างนโยบายการจัดการ log ที่เหมาะสม เช่น การหมุนเวียน log, การตั้งค่า buffer และการปิด log สำหรับ static files จะช่วยให้ระบบของคุณทำงานได้อย่างราบรื่นและประหยัดทรัพยากร

แนะนำบริการ DE Cloud VPS และ Cloud Hosting

หากคุณต้องการตั้งค่า Nginx log ให้มีประสิทธิภาพสูง และต้องการสภาพแวดล้อมที่เสถียรสำหรับเซิร์ฟเวอร์ของคุณ Dot Enterprise Cloud VPS เป็นตัวเลือกที่ยอดเยี่ยม ด้วยการสนับสนุน Nginx ที่ครบถ้วน การจัดการ log ที่ง่าย และอินเทอร์เฟส Plesk ที่ใช้งานสะดวก คุณสามารถจัดการเซิร์ฟเวอร์ของตนเองได้อย่างสะดวก

นอกจากนี้ Dot Enterprise Cloud Hosting ก็มีการตั้งค่า Nginx ล่วงหน้าที่มีการจัดการ log ประสิทธิภาพสูง ทำให้คุณสามารถมุ่งเน้นไปยังการพัฒนาเว็บไซต์ของคุณแทนที่จะต้องจัดการการตั้งค่า log ด้วยตนเอง ลองเปลี่ยนมาใช้บริการของ Dot Enterprise วันนี้และอนุภพ การบริการที่ดีขึ้น

สำหรับข้อมูลเพิ่มเติม โปรดเยี่ยมชม https://de.co.th เพื่อทำความรู้จักกับ Dot Enterprise และบริการของเรา