ติดตั้ง GoAccess วิเคราะห์ Log Nginx แบบ Real-time บน VPS

ติดตั้ง GoAccess วิเคราะห์ Log Nginx แบบ Real-time บน VPS

สิงหาคม 2026 · อ่าน 8 นาที

GoAccess คือเครื่องมือ open-source สำหรับวิเคราะห์ access log ของ web server แบบ real-time โดยไม่ต้องพึ่ง Elasticsearch, Logstash หรือ Kibana เลย ทำงานตรง terminal ได้เลย หรือจะ export เป็น HTML dashboard แบบ interactive ก็ได้ ผมใช้ GoAccess มาหลายปีบน VPS ที่รัน Nginx มันช่วยให้เห็นได้ทันทีว่าใครกำลัง hammer endpoint ไหน, bot ไหนกำลัง crawl อยู่, และ URL ไหนมี error rate สูงกว่าปกติ ทั้งหมดนี้ใช้ RAM ไม่ถึง 10MB

ทำไมต้องใช้ GoAccess แทน ELK หรือ Grafana Loki?

ประเด็นGoAccessELK StackGrafana Loki
RAM ใช้งาน< 10 MB2–8 GB+500 MB+
ติดตั้ง1 คำสั่งซับซ้อนปานกลาง
Real-time✅ WebSocket✅ (Kibana)✅ (Grafana)
ค่าใช้จ่ายฟรีฟรี แต่ต้องการ spec สูงฟรี แต่ต้องการ spec สูง
เหมาะกับVPS เล็ก–กลางEnterprise / logging scale ใหญ่Multi-service

ติดตั้ง GoAccess บน Ubuntu/Debian

Ubuntu 22.04/24.04 มี GoAccess ใน repository แต่มักเป็น version เก่า แนะนำใช้ official repo เพื่อได้ version ล่าสุด:

# เพิ่ม GoAccess official repository
echo "deb https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list

sudo apt update
sudo apt install -y goaccess

# ตรวจสอบ version
goaccess --version

ติดตั้งบน CentOS/Rocky Linux/AlmaLinux

# ติดตั้งจาก EPEL
sudo dnf install -y epel-release
sudo dnf install -y goaccess

# ตรวจสอบ version
goaccess --version

รู้จัก format ของ Nginx access log

ก่อนใช้ GoAccess ต้องรู้ว่า Nginx ใช้ log format อะไร ดูได้ที่ /etc/nginx/nginx.conf:

# ดู log_format ที่ Nginx ใช้
grep -A5 "log_format" /etc/nginx/nginx.conf

# ค่าเริ่มต้นส่วนใหญ่เป็น combined หรือ main
# combined format:
# $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

# ดู access log path
grep "access_log" /etc/nginx/nginx.conf /etc/nginx/sites-enabled/* 2>/dev/null | head -10

รัน GoAccess แบบ real-time ใน terminal

วิธีที่เร็วที่สุด — เปิด terminal แล้วรันคำสั่งนี้:

# วิเคราะห์ Nginx access log (combined format)
sudo goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  -c

# ถ้าไม่ต้องการ dialog ให้เลือก format ระบุตรงๆ
sudo goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  --no-query-string

# วิเคราะห์หลาย log พร้อมกัน (รวม rotated logs)
sudo goaccess /var/log/nginx/access.log /var/log/nginx/access.log.1 \
  --log-format=COMBINED

ใน terminal คุณจะเห็น dashboard แบ่งเป็น panel ต่างๆ: Visitors, Requests, Static Requests, Not Found, Hosts, Operating Systems, Browsers, Time Distribution, Virtual Hosts

Tip: กด F5 เพื่อ refresh, กดตัวเลข (1–9) เพื่อ expand panel ใดก็ได้, กด q เพื่อออก

สร้าง HTML Dashboard อัตโนมัติด้วย Cron

นี่คือฟีเจอร์ที่ผมใช้บ่อยที่สุด — export เป็น HTML report ที่ดูได้ผ่าน browser พร้อม WebSocket real-time update:

สร้าง HTML report แบบ static

# สร้างโฟลเดอร์สำหรับเก็บ report
sudo mkdir -p /var/www/html/analytics
sudo chown www-data:www-data /var/www/html/analytics

# สร้าง HTML report
sudo goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  --output=/var/www/html/analytics/index.html \
  --no-query-string

# ตรวจสอบไฟล์
ls -lh /var/www/html/analytics/index.html

ตั้ง Cron ให้อัปเดต report ทุกชั่วโมง

# แก้ไข crontab ของ root
sudo crontab -e

# เพิ่มบรรทัดนี้ (อัปเดตทุกชั่วโมง)
0 * * * * goaccess /var/log/nginx/access.log --log-format=COMBINED --output=/var/www/html/analytics/index.html --no-query-string 2>/dev/null

ป้องกัน analytics dashboard ด้วย HTTP Basic Auth

# สร้าง password file
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.analytics-htpasswd admin

# เพิ่ม location block ใน Nginx config
location /analytics/ {
    auth_basic "Analytics";
    auth_basic_user_file /etc/nginx/.analytics-htpasswd;
    alias /var/www/html/analytics/;
}

# reload Nginx
sudo nginx -t && sudo systemctl reload nginx

ใช้งาน GoAccess แบบ real-time WebSocket server

GoAccess สามารถรันเป็น daemon ที่ push update ผ่าน WebSocket ทำให้ HTML dashboard อัปเดตแบบ live โดยไม่ต้อง refresh:

# รัน GoAccess daemon mode พร้อม WebSocket
sudo goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  --output=/var/www/html/analytics/index.html \
  --real-time-html \
  --ws-url=wss://yourdomain.com/ws \
  --port=7890 \
  --daemonize \
  --pid-file=/var/run/goaccess.pid \
  --log-file=/var/log/goaccess.log

# ตรวจสอบว่า daemon กำลังรัน
ps aux | grep goaccess

Nginx config สำหรับ WebSocket proxy

# เพิ่มใน Nginx server block
location /ws {
    proxy_pass http://127.0.0.1:7890;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 7200;
}

วิเคราะห์ log ด้วย filter และ custom log format

# วิเคราะห์ log เฉพาะวันนี้ (ใช้ pipe จาก grep)
grep "27/Aug/2026" /var/log/nginx/access.log | \
  sudo goaccess --log-format=COMBINED -

# วิเคราะห์เฉพาะ IP ที่น่าสงสัย
grep "^185.220." /var/log/nginx/access.log | \
  sudo goaccess --log-format=COMBINED -

# รวมทุก log ไฟล์รวม rotated gzip
(sudo zcat /var/log/nginx/access.log.*.gz; sudo cat /var/log/nginx/access.log) | \
  goaccess --log-format=COMBINED -o /var/www/html/analytics/index.html -

กรณีใช้ custom log format ใน Nginx

# ถ้า Nginx ใช้ custom format ให้ระบุ format ตรงๆ
sudo goaccess /var/log/nginx/access.log \
  --log-format='%h - %e [%d:%t %^] "%r" %s %b "%R" "%u" "%^"' \
  --date-format='%d/%b/%Y' \
  --time-format='%H:%M:%S'

สร้าง systemd service สำหรับ GoAccess daemon

# สร้าง service file
sudo tee /etc/systemd/system/goaccess.service << 'EOF'
[Unit]
Description=GoAccess Real-time Web Analytics
After=network.target nginx.service

[Service]
Type=forking
User=root
ExecStart=/usr/bin/goaccess /var/log/nginx/access.log \
  --log-format=COMBINED \
  --output=/var/www/html/analytics/index.html \
  --real-time-html \
  --ws-url=wss://yourdomain.com/ws \
  --port=7890 \
  --daemonize \
  --pid-file=/var/run/goaccess.pid \
  --log-file=/var/log/goaccess.log
ExecStop=/bin/kill -TERM $MAINPID
PIDFile=/var/run/goaccess.pid
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# เปิดใช้งาน service
sudo systemctl daemon-reload
sudo systemctl enable goaccess
sudo systemctl start goaccess
sudo systemctl status goaccess

ตรวจสอบว่า GoAccess ทำงานถูกต้อง

# ตรวจสอบ version และ build options
goaccess --version

# ทดสอบ parse log โดยไม่ output
sudo goaccess /var/log/nginx/access.log \
  --log-format=COMBINED --dry-run 2>&1 | tail -5

# ตรวจสอบสถานะ service daemon
systemctl status goaccess

# ตรวจสอบ WebSocket port
ss -tlnp | grep 7890

# นับ request ทั้งหมดใน log ปัจจุบัน
sudo wc -l /var/log/nginx/access.log
Tip: ถ้า GoAccess แสดง "Unknown log format" ให้รัน sudo goaccess /var/log/nginx/access.log -c เพื่อดู dialog เลือก format จะได้รู้ว่า format ไหน match กับ log จริง

แก้ปัญหาที่พบบ่อย

Error: "No input data was provided"

เกิดเมื่อ GoAccess ไม่สามารถอ่านไฟล์ log ได้ ส่วนใหญ่เป็นปัญหา permission หรือไฟล์ว่าง

# ตรวจสอบสิทธิ์ไฟล์ log
ls -la /var/log/nginx/access.log

# รันด้วย sudo
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED

# หรือเพิ่ม user ปัจจุบันเข้า adm group (Debian/Ubuntu)
sudo usermod -aG adm $USER
# logout แล้ว login ใหม่

Error: "Couldn't parse log on date/time" หรือ invalid entries จำนวนมาก

Log format ที่ระบุไม่ตรงกับ format จริงในไฟล์ log ให้ดู log จริงแล้วระบุ format ให้ถูก

# ดูตัวอย่าง log จริง 3 บรรทัดแรก
sudo head -3 /var/log/nginx/access.log

# เปรียบเทียบกับ combined format:
# IP - user [dd/Mon/YYYY:HH:MM:SS +zone] "METHOD /path HTTP/1.x" status bytes "referer" "UA"

# ถ้า format ต่างกัน ให้ระบุ custom format
sudo goaccess /var/log/nginx/access.log \
  --log-format='%h %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u"' \
  --date-format='%d/%b/%Y' \
  --time-format='%H:%M:%S'

Error: "WebSocket connection failed" บน HTML dashboard

Nginx ไม่ได้ตั้ง proxy สำหรับ WebSocket หรือ firewall บล็อก port ที่ GoAccess ใช้

# ตรวจสอบว่า GoAccess daemon กำลังฟังอยู่
ss -tlnp | grep 7890

# ตรวจสอบ Nginx config มี WebSocket proxy หรือไม่
grep -rn "proxy_pass.*7890\|Upgrade" /etc/nginx/sites-enabled/

# ตรวจสอบ firewall
sudo ufw status | grep 7890

Error: "Output file already opened by another instance"

มี GoAccess instance อื่นเขียน output file เดิมอยู่ ต้องหยุด instance เก่าก่อน

# ค้นหา process GoAccess ทั้งหมด
ps aux | grep goaccess

# หยุด service
sudo systemctl stop goaccess

# หรือ kill โดยตรง
sudo kill $(cat /var/run/goaccess.pid)

# จากนั้นรันใหม่
sudo systemctl start goaccess

HTML report แสดงข้อมูลน้อยหรือ panel ว่างเปล่า

เกิดเมื่อ log เพิ่งเริ่มต้น หรือ GoAccess ไม่ได้รวม log ที่ rotate แล้ว

# รวมทุก log รวม rotated gzip
(sudo zcat /var/log/nginx/access.log.*.gz 2>/dev/null; sudo cat /var/log/nginx/access.log) | \
  goaccess --log-format=COMBINED -o /var/www/html/analytics/index.html -

คำถามที่พบบ่อย

GoAccess รองรับ log format อะไรบ้าง?

GoAccess รองรับ format หลักๆ ได้แก่ COMBINED (Nginx/Apache combined), COMMON (Apache common), VCOMBINED (เมื่อ Nginx อยู่หลัง load balancer), W3C (IIS), CLOUDFRONT, CLOUDSTORAGE, AWSELB, SQUID, AWSS3 และ custom format ที่กำหนดเองด้วย strftime-style specifier ครบทุกรูปแบบ

GoAccess เก็บข้อมูลไว้ที่ไหน? ปลอดภัยจาก visitor ไหม?

GoAccess ทำงานแบบ in-memory ไม่มีฐานข้อมูล ไม่มีไฟล์ data ถาวร (ยกเว้น HTML output ที่คุณ export เอง) HTML dashboard ที่สร้างออกมาจะเปิดเผย URL, IP ย่อ และสถิติต่างๆ แนะนำป้องกันด้วย HTTP Basic Auth เสมอก่อน expose ให้ external access

GoAccess ต่างจาก Matomo หรือ Google Analytics อย่างไร?

GoAccess วิเคราะห์จาก server-side access log ทำให้เห็นทุก request รวมถึง bot, crawler, และ API call ที่ browser analytics จับไม่ได้ แต่ไม่มี session tracking, conversion funnel หรือ user journey ที่ละเอียดเหมือน Matomo ใช้ GoAccess สำหรับ server health และ security monitoring, ใช้ Matomo สำหรับ user behavior analysis