เช็ค Internet จากเว็บ: ทำยังไงให้รู้ว่าออกเน็ตได้จริง?

เช็ค Internet จากเว็บ: ทำยังไงให้รู้ว่าออกเน็ตได้จริง?

เคยเจอไหมครับ เวลาใช้งานเว็บไซต์แล้วอยู่ดี ๆ ก็โหลดข้อมูลไม่ได้ หรือ API เงียบหายไม่มีการตอบกลับ? หลายครั้งเรามักสงสัยว่า "ตกลงปัญหาอยู่ที่ตัวเรา เซิร์ฟเวอร์ หรือ Internet กันแน่?" วันนี้ผมจะมาเล่าเรื่อง "การตรวจสอบสถานะการเชื่อมต่อ Internet" ให้ฟังแบบง่าย ๆ แต่ละเอียด เพื่อช่วยให้ Developer หรือ SysAdmin สามารถเช็คสถานะได้ชัวร์ ไม่ใช่แค่ "ออนไลน์" แต่ต้อง "ออกเน็ตได้จริง" ด้วย!


ปัญหาเช็ค Internet แบบธรรมดา

หลายคนคงเคยใช้ navigator.onLine บน JavaScript เพื่อเช็คสถานะ Internet ใช่ไหมครับ? ตัวนี้มันทำงานง่าย ๆ แค่คืนค่า true หรือ false ซึ่งบอกว่าเบราว์เซอร์ "มีเครือข่าย" อยู่หรือเปล่า เช่น Wi-Fi เชื่อมต่อแล้ว แต่คำถามคือ:

  • เชื่อมต่อแล้วออกเน็ตได้จริงไหม?
  • Wi-Fi มีสัญญาณ แต่ Gateway ไม่ออก Internet จะเชื่อถือได้หรือเปล่า?

นี่แหละครับคือข้อจำกัดของ navigator.onLine ที่หลายคนมองข้ามไป และอาจทำให้เกิดการตีความผิด เช่น ระบบของเราบอกว่า "Online" แต่จริง ๆ เข้าเว็บไม่ได้เลย!

"navigator.onLine" แค่เช็คว่า ได้เกาะกับ WiFi หรือ Cellular รึยัง แต่ไม่ได้การันตีว่า WiFi หรือ Cellular ที่เกาะ อยู่ มีเน็ตให้ใช้ และ ออกเน็ตได้

วิธีการทำงานของ navigator.onLine

navigator.onLine เป็นฟีเจอร์ของ JavaScript ที่เบราว์เซอร์ใช้ตรวจสอบสถานะเครือข่าย โดยทำงานร่วมกับ OS (ระบบปฏิบัติการ) และ Network Stack ซึ่งทำให้สามารถรู้ได้ว่า:

  • มีการเชื่อมต่อ Wi-Fi, Ethernet, หรือ Mobile Data หรือไม่
  • แต่! มันไม่ได้ตรวจสอบว่ามีการเข้าถึง Internet ได้จริงหรือเปล่า

ตัวอย่างง่าย ๆ:

if (navigator.onLine) {
    console.log('You are online');
} else {
    console.log('You are offline');
}

เบื้องหลังมันดูง่ายใช่ไหมครับ? แต่ข้อเสียคือ มันอาจให้ผล "false positive" ได้ เช่น ต่อ Wi-Fi ที่ไม่มี Internet มันยังคงบอกว่า "ออนไลน์" อยู่ดี


แล้วจะทำยังไงให้รู้ว่าออก Internet ได้จริง?

คำตอบคือเราต้อง "ทดสอบการเชื่อมต่อ" จริง ๆ ครับ! วิธีนี้จะช่วยยืนยันได้ว่า Internet ใช้งานได้แน่นอน โดยมีเทคนิคหลัก ๆ ดังนี้:


1. การ Ping ไปที่ External Service

การใช้คำสั่ง fetch หรือ HEAD Request เพื่อ Ping ไปยังเซิร์ฟเวอร์ที่เรารู้ว่ามีความน่าเชื่อถือ เช่น:

  • Google: https://www.google.com/generate_204 หรือ https://8.8.8.8
  • Cloudflare: https://1.1.1.1
  • OpenDNS: https://www.opendns.com/
  • Github: https://raw.githubusercontent.com/vijityannapon/health-check/refs/heads/master/health.txt

ตัวอย่าง:

function checkInternetConnection() {
    return fetch('https://raw.githubusercontent.com/vijityannapon/health-check/refs/heads/master/health.txt', { method: 'HEAD' })
        .then(() => true)  // ถ้าสำเร็จ แสดงว่าออก Internet ได้
        .catch(() => false); // ถ้าล้มเหลว แสดงว่าเน็ตมีปัญหา
}

ข้อดีของวิธีนี้:

  • ทดสอบ Internet ได้จริง
  • ใช้งานง่ายและรวดเร็ว

ข้อเสีย:

  • ต้องพึ่งพาเซิร์ฟเวอร์ภายนอก
  • ถ้าเซิร์ฟเวอร์ที่เลือก Down ระบบเราก็อาจจะเช็คผิดพลาดได้
ฉนั้นเราจึงควรเลือก Server ที่ได้มาตรฐาน และ แข็งแก่ง ดัง ที่ผมยกตัยวอย่างด้านบน

2. ใช้ Static File หรือ Health Check ของตัวเอง

ถ้าคุณไม่อยากพึ่งพาเซิร์ฟเวอร์ภายนอก คุณสามารถสร้างไฟล์ง่าย ๆ บนเซิร์ฟเวอร์ของตัวเอง เช่น:

  • ไฟล์ชื่อ health.txt ที่มีเนื้อหา:
    OK
  • หรือสร้าง API Endpoint เช่น /health ที่คืนค่า 200 OK เมื่อเซิร์ฟเวอร์ทำงานปกติ

ตัวอย่าง Nginx:

location /health {
    default_type text/plain;
    return 200 "OK";
}

ข้อดี:

  • ควบคุมได้เอง 100%
  • ไม่ต้องกังวลว่าเซิร์ฟเวอร์ภายนอกจะล่ม

ข้อเสีย:

  • ถ้าปัญหาอยู่ที่เซิร์ฟเวอร์ของคุณเอง ไฟล์นี้ก็จะล่มตามไปด้วย!

3. จำกัดการเข้าถึงและรักษาความปลอดภัย

หากคุณใช้ไฟล์หรือ Endpoint สำหรับ Health Check คุณควรระวังเรื่องความปลอดภัย:

  1. ตั้ง Permission ไฟล์ให้เฉพาะ Read-Only:
    chmod 444 health.txt
  2. จำกัด IP ที่เข้าถึงไฟล์: ตัวอย่าง Nginx:
location /health {
    allow 192.168.1.0/24; # เฉพาะเครือข่ายภายใน
    deny all;
}
  1. เพิ่ม Rate Limiting: เพื่อป้องกัน DDoS:
limit_req_zone $binary_remote_addr zone=healthcheck:10m rate=5r/s;
location /health {
    limit_req zone=healthcheck burst=10 nodelay;
}

4. ใช้ CDN หรือบริการฟรี

ถ้าคุณไม่อยากบริหารจัดการเซิร์ฟเวอร์เอง:

  • ใช้ CDN เช่น Cloudflare หรือ AWS S3 เก็บไฟล์ health.txt
  • หรือใช้บริการที่มีอยู่แล้ว เช่น Google หรือ Cloudflare DNS

เทคนิคเพิ่มเติม: การลดขนาด Header

ไม่ว่าจะใช้วิธีไหน การลดขนาด Header ก็ช่วยให้ระบบของคุณเบาและเร็วขึ้น:

  1. ใช้ HTTP Method: HEAD เพื่อส่งคำขอที่มีเฉพาะ Header:
fetch('https://example.com/health.txt', { method: 'HEAD' });
  1. ลด Header ที่ไม่จำเป็นจากเซิร์ฟเวอร์: ตัวอย่าง Nginx:
proxy_hide_header X-Powered-By;
proxy_hide_header Server;

สรุป

การเช็คสถานะการเชื่อมต่อ Internet ของเว็บไซต์มีหลากหลายวิธีให้เลือกตามความเหมาะสม:

  • ถ้าต้องการง่ายและเร็ว: ใช้ External Service เช่น Google หรือ Cloudflare
  • ถ้าต้องการควบคุมเอง: สร้าง Static File หรือ Health Check Endpoint
  • อย่าลืมเรื่องความปลอดภัย เช่น การตั้ง Permission และ Rate Limiting

หวังว่าบทความนี้จะช่วยให้ Developer และ SysAdmin ทุกคนมีแนวทางในการตรวจสอบ Internet ของระบบตัวเองได้อย่างมั่นใจนะครับ! 😊

Read more

การทำ Data Migration และ Seeder: คู่มือสำหรับ Developer

การทำ Data Migration และ Seeder: คู่มือสำหรับ Developer

ถ้าพูดถึงการพัฒนาแอปพลิเคชันที่เชื่อมต่อกับ Database หนึ่งในความยุ่งยากที่สุดคือการจัดการ Database structure ที่เปลี่ยนไปตามฟีเจอร์ใหม่ๆ ที่เพิ่มเข้ามา เช่น เพิ่มตาราง (Table) เปลี่ยนชนิดข้อมูล (Data type) หรือลบฟิลด์ (Field) ออกไป และแน่นอนว่

By maimem
Rust Series #2 - รู้จัก Cargo: ผู้ช่วยส่วนตัวของโปรเจกต์ Rust!

Rust Series #2 - รู้จัก Cargo: ผู้ช่วยส่วนตัวของโปรเจกต์ Rust!

ถ้าคุณเริ่มต้นเขียน Rust แล้วรู้สึกว่า “เฮ้ย! Rust เจ๋งแหะ” ก็ขอแสดงความยินดีครับ คุณเพิ่งเจอเพื่อนแท้ในโลกโปรแกรมมิ่ง! แต่เดี๋ยวก่อน... ถ้าต้องเขียนโค้ดโปรเจกต์ใหญ่ ๆ บริหารไลบรารี ดูแลไฟล์ต่าง ๆ หรือทดสอบโค้ดทุกวั

By maimem
ซ่อน Credential ใน AWS CodeBuild ให้ปลอดภัยด้วย Parameter Store

ซ่อน Credential ใน AWS CodeBuild ให้ปลอดภัยด้วย Parameter Store

ทำไมต้องซ่อน Credential? ในโลกของ DevOps และ Cloud Computing การจัดการ Credential (ข้อมูลรับรอง เช่น API Keys, Passwords, หรือ Secrets ต่างๆ) เป็นเรื่องที่สำคัญอย่างยิ่ง เพราะ Credential เปรียบเสมือนกุญแจที่เปิดประตูไปสู่ทรัพยากรสำคัญในระบบ เช่น ฐานข้อมูล

By maimem
Session ไม่ตาม! เพราะ Load Balancer บน Magento2

Session ไม่ตาม! เพราะ Load Balancer บน Magento2

เมื่อเร็วๆนี้ ผมได้ทำงานเกี่ยวกับพวก Marketplace บน Magento2 ซึ่งเป็นแพลตฟอร์มอีคอมเมิร์ซที่ใช้งานมากในระดับองค์กร โครงสร้างของระบบนี้อยู่บน Server-side architecture ที่ต้องจัดการปัญหาและความท้าทายหลายด้าน โดยเฉพาะการทำให้ระบบ Load Balancer และ Auto Scaling ทำงานได้ราบรื่น เพื่อรองรับจำนวนผู้ใช้งานที่เปลี

By maimem