ช่วงสัปดาห์ที่ผ่านมามีการพูดถึง NGINX Unit เยอะพอควร
ดังนั้นเลยลองศึกษาแบบผิว ๆ หน่อยสิว่า
มันคืออะไร
ทำงานอย่างไร
ใช้งานอย่างไร
น่าจะมีประโยชน์ต่อการพัฒนาและ deploy ระบบงานต่อไป

ปล. จะเรียก NGINX Unit ว่า Unit

NGINX Unit คืออะไร ?

จากเอกสารอธิบายว่า

  • Lightweight application server
  • Dynamic web application server
  • ออกแบบมาเพื่อให้ง่ายต่อการ run หลาย ๆ ภาษาโปรแกรมได้ หลาย ๆ version ได้บนเครื่อง หรือ server เดียวกัน
  • ตอนนี้สนับสนุน PHP, Python และ Go ก่อน ส่วน Java, JavaScript และ Ruby ก็รอนิดนึง

โดยแต่ละ Unit ทำการออกแบบได้ดังรูป
นั่นคือแต่ละ Unit จะ run อะไรก็ได้ตามที่สนับสนุน
แต่ว่าการ run ภาษาเดียวแต่หลาย version ยังไม่ได้ลอง
ซึ่งมองแล้วมันมีประโยชน์มาก ๆ ไว้ต้องทดลองดูบ้าง !!

สิ่งที่น่าสนใจมาก ๆ คือ สามารถทำการ configuration หรือ ปรับแต่งค่าต่าง ๆ ของระบบ

ผ่าน REST API (JSON) ที่กำหนดไว้ ดังนั้นจึงง่ายต่อทีมพัฒนาและ operation
ไม่ต้องมานั่ง config บน server เอง
อยากเปลี่ยนก็ทำผ่าน REST API ไปเลยเช่น

  • จำนวน worker ของ NGINX
  • Path ของระบบหรือ service ต่าง ๆ
  • Port หรือ Listener ของแต่ละ server ว่าจะเปิดให้เข้าถึงผ่าน port อะไร

อ่านไปก็งง มาลองใช้งานกันดูดีกว่า

จากเอกสารการติดตั้งดูแล้วเหนื่อย
ดังนั้นเพื่อความง่ายเลยใช้ Docker ดีกว่า
หลังจากนั้นค่อยมาสร้าง Image ไว้ใช้งานกัน !!
มาเริ่มกันเลย

สร้าง container ด้วย Ubuntu image
มีคำสั่งดังนี้

คำอธิบาย
ติดตั้ง curl กับ vim ไว้ทดสอบกับแก้ไข config
ทำการติดตั้ง NGINX Unit ตามเอกสารเลย

เมื่อการติดตั้งเรียบร้อย ทำการตรวจสอบ service นิดหน่อยด้วยคำสั่ง

$service unitd status
* unitd is running

โดยค่า default แล้วนั้น Unit API จะอยู่ในไฟล์ control.unit.sock

สามารถเรียกใช้งานและส่ง configuration ในรูปแบบ JSON เข้าไปได้
ซึ่งจะประกอบไปด้วย

  • Applications ทำการกำหนดแต่ละ application ใน Unit ว่าเป็นอย่างเช่น ภาษาโปรแกรม จำนวน worker process ที่ทำงาน Path หรือ directory ของ application และ ไฟล์ index และอื่น ๆ ตามภาษาโปรแกรม
  • Listeners สำหรับ application ที่ให้เข้าถึงผ่าน HTTP (ส่วน HTTPS ยังไม่สนับสนุนนะ) จะต้องกำหนด listenter ให้เสมอ หรือเปิด port นั่นเอง เพื่อให้ผู้ใช้งานเรียกใช้งานได้

เพื่อความเข้าใจมาลองใช้งานกันดีกว่า

เริ่มจากการดูว่าตอนนี้มี applicaition และ listener มีอะไรบ้าง ?
แน่นอนว่าต้องไม่มีอะไรเลยดังนี้

ดังนั้นเรามาสร้าง application แรกดีกว่า (Hello World)

ซึ่งความต้องการเป็นดังนี้

  • พัฒนาด้วยภาษา PHP
  • ทำการ run ด้วย port 8100
  • Path ของระบบอยู่ที่ /www/hello
  • ไฟล์ index ชื่อว่า index.php

สามารถทำการเขียนไฟล์ configuration ได้ดังนี้

ทำการ configuration หรือ re-configuration ผ่าน REST API ด้วยคำสั่งดังนี้
ง่ายสุด ๆ

ตรวจสอบการ configuration ด้วยคำสั่งเดิม
แต่ผลที่ได้ต่างออกไปดังนี้

แน่นอนว่าก็ต้องเตรียม code ของระบบงานไว้ให้พร้อมด้วยนะ
จากนั้นทดสอบผลการทำงาน ได้ดังนี้

เพียงเท่านี้ก็สามารถ run php แบบง่าย ๆ บน NGINX Unit ได้แล้ว
แต่งานจริง ๆ ก็เตรียมเยอะกว่านี้นะ !!

คำถามต่อมา สร้างได้ก็ต้องลบได้สิ
เท่าที่ดูสามารถลบ Listener ได้ดังนี้
ส่วนลบ application ยังหาไม่เจอ

เมื่อ PHP ผ่านไป ก็มาถึง Python และ Go กันบ้างสิ

มาดูว่า NGINX Unit มันสนับสนุนจริงไหม ?
มาดูกันนิดหน่อย

สามารถแก้ไข configuration นิดหน่อยดังนี้

  • Python จะมี path และ module ที่จะใช้ run ซึ่งใช้ wsgi
  • Go จะมี executable สำหรับ binary ของระบบ โดยต้องติดตั้ง go ด้วยนะ เพราะว่าในการพัฒนาต้องใช้ library ข อง Unit ด้วย

ตัวอย่างให้มี PHP และ Python ในเครื่องเดียวกัน หรือ Unit เดียวกัน

โดยสำหรับ python จะสร้างไฟล์หลักชื่อว่า wsgi.py ใน path ที่กำหนดดังนี้

จากนั้นสามารถเข้าถึงผ่าน port 8200 ได้เลยดังนี้

ปล.
ทั้ง PHP และ Python นั้นผมยังไม่ได้ติดตั้งอะไรนอกจาก NGINX Unit นะ

มาถึงตรงนี้น่าจะพอเห็นภาพคร่าว ๆ ของ NGINX Unit กันบ้างนะครับ

น่าจะมีประโยชน์ต่อการพัฒนาระบบงานกันบ้าง
แต่ทำไปทำมานี่มันแนวคิด container เลยนะ
แถมยังทำให้การพัฒนาและการ deploy ระบบในลักษณะ Microservice ง่ายขึ้นไปอีก
และสุดท้ายก็เอาไป integrate หรือทำงานร่วมกับ NGINX ต่อไปได้เลย
มองไปมองมา มันคือการ lock technology หรือเปล่านะ ?

ส่วนเรื่องของ performance นั้นยังคงต่ำกว่าวิธีการอื่น ๆ นะ
แต่มันยังคง beta version เท่านั้น
ดังนั้นต้องติดตามอย่างใกล้ชิดนะ

ขอให้สนุกกับเขียน code ครับ

Reference Websites
https://www.nginx.com/blog/introducing-nginx-application-platform/
http://unit.nginx.org/docs-nginx-unit.html