Skip to content

Tag: websocket

Config Reverse Proxy สำหรับ Apache 2.4 เพื่อใช้งาน WebSocket

ผมเคยเจอคำถามและได้รับอีเมลบ่อยๆ ว่า “สามารถใช้ PHP กับ Node.js ได้หรือเปล่า?” คุยกันถึงรายละเอียดแล้วก็พบอีกว่าส่วนใหญ่พัฒนาเว็บด้วย PHP รันบน Apache web server กันอยู่แล้วแต่ต้องการใช้งาน WebSocket ซึ่งเขียนด้วย Node.js

ถามว่าใช้งานด้วยกันได้ไหม? ทำได้ครับแต่ต้องใช้กำลังภายในกันนิดนึง

ผมอยากมีหนังสือ NodeJS Tutorial ของตัวเองสักเล่ม จะเป็นไปได้ไหมนะ

หนังสืือ NodeJS Tutorial
NodeJS

ทำไมผมถึงอยากเขียนหนังสือ NodeJS Tutorial

ความคิดนี้ไม่ใช่เพิ่งเกิดครับ ผมคิดถึงมันอยู่เสมอ เคยบล็อกถึงในบล็อกเก่าเมื่อหลายปีมาแล้วด้วย (ตอนนี้บล็อกนั้นหายไปแล้ว)

บล็อกก่อนผมเขียนถึงมุมหนังสือ 3 มุมของผม ซึ่งก็อย่างที่บอกไปครับว่าประเภทของหนังสือและแนวหนังสือที่ผมอ่านมันขึ้นอยู่กับวัย ซึ่งช่วงที่ผมใช้เวลากับมันมากที่สุดและพอที่จะถ่ายทอดออกมาได้ก็คือช่วงที่ผมขลุกอยู่กับหนังสือคอมพิวเตอร์ IT และโปรแกรมมิ่ง

ผมเดินสังเกตตามชั้นหนังสือคอมพิวเตอร์ตามร้านหนังสือต่างๆ มาหลายที่ หลายปี แล้วก็พบว่าหนังสือเกี่ยวกับคอมพิวเตอร์ไม่ค่อยหลากหลาย ที่เพิ่มขึ้นมาเยอะในช่วงหลังคือหนังสือเกี่ยวกับ Social Network และ Mobile app แต่ทางด้านโปรแกรมมิ่งแล้วความหลากหลายแทบไม่มีเลยเคยเป็นมายังไงก็เป็นอยู่อย่างนั้น ภาษาโปรแกรมมิ่งที่เห็นหนังสือมากหน่อยคือด้านเว็บอย่าง PHP และภาษาที่มีการเรียนการสอนในห้องเรียนอย่าง C/C++, Java ภาษาใหม่ (ใหม่สำหรับเมืองไทย) เช่น Python และ Ruby ก็เคยเห็น แต่ออกมาแค่เพียงเล่มเดียวก็หายไปซะแล้ว

Config HAProxy เพื่อใช้งาน Nodejs, Socket.io ร่วมกับ Apache web server

โพสต์ก่อนๆ ผมเขียนถึงการพัฒนา application ด้วย Nodejs และ Socket.io และจำเป็นต้องใช้ร่วมกันกับ PHP ที่รันบน Apache ปัญหาที่พบก็ตามข้อ 3 ในโพสต์เก่านั่นแหละครับคือทำ ProxyPass จาก port 80 ของ Apache ไปที่ app ที่รันไว้ port อื่นไม่ได้เพราะ Apache ไม่รองรับ Websockets

1.Infrastructure

เนื่องจาก Websockets ยังเป็นเรื่องใหม่อยู่ web server ส่วนมากยังไม่รองรับ ลองเสิร์ชหาวิธีแก้ปัญหาตามเว็บต่างๆ ส่วนมากถ้าเป็น PHP, Apache นิยมใช้ HAProxy  เป็น proxy ถ้าเป็น Ubuntu สามารถติดตั้งผ่าน APT ได้เลย

เราต้องการติดต่อกับ internet ด้วย port 80 ซึ่งเดิมรัน Apache web server ไว้อยู่แล้วเลยต้องเปลี่ยน architecture ของ server นิดหน่อยคือวาง HAProxy ขวาง server, app ตัวอื่นๆ และให้ listen ที่ port 80 แล้วค่อยกระจาย request ไปที่ port ต่างๆ ตามรูปข้างล่าง

ทำไมต้อง Websocket ?

ทำไมต้อง Websocket ? ก่อนหาคำตอบของคำถามนี้คงต้องเล่าย้อนกลับไปถึงวิวัฒนาการของเว็บก่อน ถ้านับแล้วน่าจะมี 3 ยุค (ผมเดาเอง) คือ

  1. Static web เว็บยุคแรกๆ ยังทำอะไรไม่ได้มากนอกจากแสดงข้อมูลสร้างด้วย HTML, CSS เป็นหน้าๆ มีแต่ markup อย่างเดียว ผู้ใช้เข้ามาอ่านได้อย่างเดียวไม่มี interactive ระหว่าง client และ server
  2. Dynamic web มีภาษาโปรแกรมเข้ามาเกี่ยวข้องแรกๆ เป็น Javascript  ทำงานฝั่ง client ต่อมามีการใช้ CGI พวก Perl, PHP เขียนโปรแกรมทำงานฝั่ง server ด้วยทำให้มีการ interactive ระหว่าง client กับ server
  3. Real-time web ถ้าใช้การ interactive ระหว่าง client-server มันน่าจะอยู่กลุ่มเดียวกันกับข้อ 2 แต่ต่างกันนิดนึงคือมีการรับ-ส่งข้อมูลกันตลอดเวลาถ้า server มีการ PUSH ข้อมูลมาที่ client ก็จะแสดงผลทันทีไม่ต้อง request ไปที่ server ใหม่ การ request ไปที่ server ใหม่เช่นการ refresh หน้าเว็บต้อง request ข้อมูลที่ server ใหม่ทั้งหมดทำให้เกิด overhead ในการรับ-ส่งข้อมูล ถ้ายังนึกไม่ออกให้คิดถึงเฟซบุ๊กที่เวลาเพื่อนคอมเม้นต์ แล้วจะมีแจ้งเตือนเราเกือบจะทันที หรือ inbox ในหน้าเว็บ Gmail เวลามีอีเมลเข้าก็จะแจ้งเตือน unread เกือบจะทันทีเหมือนกัน