![]()
![]()
ช่วงสัปดาห์ที่ผ่านมามีการพูดถึง
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
มีคำสั่งดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="install.txt"]
คำอธิบาย
ติดตั้ง curl กับ vim ไว้ทดสอบกับแก้ไข config
ทำการติดตั้ง NGINX Unit ตามเอกสารเลย
เมื่อการติดตั้งเรียบร้อย ทำการตรวจสอบ service นิดหน่อยด้วยคำสั่ง
[code]
$service unitd status
* unitd is running
[/code]
โดยค่า 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 มีอะไรบ้าง ?
แน่นอนว่าต้องไม่มีอะไรเลยดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="check.txt"]
ดังนั้นเรามาสร้าง application แรกดีกว่า (Hello World)
ซึ่งความต้องการเป็นดังนี้
- พัฒนาด้วยภาษา PHP
- ทำการ run ด้วย port 8100
- Path ของระบบอยู่ที่ /www/hello
- ไฟล์ index ชื่อว่า index.php
สามารถทำการเขียนไฟล์ configuration ได้ดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="php_config.json"]
ทำการ configuration หรือ re-configuration ผ่าน REST API ด้วยคำสั่งดังนี้
ง่ายสุด ๆ
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="php.txt"]
ตรวจสอบการ configuration ด้วยคำสั่งเดิม
แต่ผลที่ได้ต่างออกไปดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="check2.txt"]
แน่นอนว่าก็ต้องเตรียม code ของระบบงานไว้ให้พร้อมด้วยนะ
จากนั้นทดสอบผลการทำงาน ได้ดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="index.txt"]
เพียงเท่านี้ก็สามารถ run php แบบง่าย ๆ บน NGINX Unit ได้แล้ว
แต่งานจริง ๆ ก็เตรียมเยอะกว่านี้นะ !!
คำถามต่อมา สร้างได้ก็ต้องลบได้สิ
เท่าที่ดูสามารถลบ Listener ได้ดังนี้
ส่วนลบ application ยังหาไม่เจอ
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="delete.txt"]
เมื่อ PHP ผ่านไป ก็มาถึง Python และ Go กันบ้างสิ
มาดูว่า NGINX Unit มันสนับสนุนจริงไหม ?
มาดูกันนิดหน่อย
สามารถแก้ไข configuration นิดหน่อยดังนี้
- Python จะมี path และ module ที่จะใช้ run ซึ่งใช้ wsgi
- Go จะมี executable สำหรับ binary ของระบบ โดยต้องติดตั้ง go ด้วยนะ เพราะว่าในการพัฒนาต้องใช้ library ข อง Unit ด้วย
ตัวอย่างให้มี PHP และ Python ในเครื่องเดียวกัน หรือ Unit เดียวกัน
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="config.json"]
โดยสำหรับ python จะสร้างไฟล์หลักชื่อว่า wsgi.py ใน path ที่กำหนดดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="wsgi.py"]
จากนั้นสามารถเข้าถึงผ่าน port 8200 ได้เลยดังนี้
[gist id="1cc7d811329f86cb642ca4f5311c3486" file="python.txt"]
ปล.
ทั้ง 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