ติดตั้ง NATS Server ระบบ Message Broker บน VPS

ติดตั้ง NATS Server ระบบ Message Broker บน VPS

มิถุนายน 2026 · อ่าน 9 นาที

NATS Server เป็นระบบ message broker ที่มีความเร็วสูงและเบา น้อยการใช้หน่วยความจำ ออกแบบมาสำหรับสถาปัตยกรรม microservices และระบบการสื่อสารแบบ real-time โดยรองรับ publish/subscribe messaging request/reply pattern และ JetStream streaming ที่ให้ความเชื่อมั่นว่าข้อมูลจะถูกส่งถึงปลายทาง บทความนี้จะอธิบายวิธีติดตั้งและกำหนดค่า NATS Server บน VPS ของคุณ

NATS Server คืออะไร

NATS (Neural Autonomic Transport System) เป็น message broker แบบ open-source ที่พัฒนาโดย Synadia Communications มีความเร็วสูง latency ต่ำ และใช้ทรัพยากรน้อย ทำให้เหมาะสำหรับการเชื่อมต่อระบบ microservices ดังนี้

ติดตั้ง NATS Server

วิธีที่ง่ายที่สุดในการติดตั้ง NATS คือการดาวน์โหลดไบนารี่ที่สร้างไว้แล้ว เข้าไปที่เซิร์ฟเวอร์ของคุณแล้วเรียกใช้งาน

1. ดาวน์โหลดและติดตั้งไบนารี่

# ตรวจสอบเวอร์ชันล่าสุด
curl -s https://api.github.com/repos/nats-io/nats-server/releases/latest | grep browser_download_url | grep linux-amd64 | head -1

# ดาวน์โหลด NATS Server
cd /tmp
wget https://github.com/nats-io/nats-server/releases/download/v2.10.0/nats-server-v2.10.0-linux-amd64.zip
unzip nats-server-v2.10.0-linux-amd64.zip

# ย้ายไฟล์ไปยังตำแหน่งที่เหมาะสม
sudo mv nats-server-v2.10.0-linux-amd64/nats-server /usr/local/bin/
sudo chmod +x /usr/local/bin/nats-server

# ยืนยันการติดตั้ง
nats-server --version

2. ติดตั้งผ่าน Package Manager (Ubuntu/Debian)

# เพิ่ม repository NATS
curl -1sLf 'https://open.synadia.com/install.sh' | sudo -E bash -

# ติดตั้ง NATS Server
sudo apt-get install nats-server

# ยืนยันการติดตั้ง
nats-server --version

3. ติดตั้งโดยใช้ Docker

# ดึง Docker image
docker pull nats:latest

# รัน NATS Server ใน container
docker run -d --name nats-server \
  -p 4222:4222 \
  -p 8222:8222 \
  nats:latest -js

# ตรวจสอบว่า container ทำงาน
docker logs nats-server
หมายเหตุ: ตัวเลือก -js เปิดใช้งาน JetStream ซึ่งเป็นฟีเจอร์ streaming ที่มีประสิทธิภาพ

การกำหนดค่า NATS Server

สร้างไฟล์การกำหนดค่า NATS ในตำแหน่ง /etc/nats/nats.conf เพื่อควบคุมพฤติกรรมของ NATS Server

ไฟล์การกำหนดค่าพื้นฐาน

# การตั้งค่าพอร์ต
port: 4222

# ความจุสูงสุดของหน่วยความจำ (MB)
max_payload: 1MB

# เปิดใช้งาน monitoring
monitor_port: 8222

# บันทึก
logfile: "/var/log/nats/nats.log"
loglevel: INFO

# JetStream storage
jetstream {
  store_dir: "/var/lib/nats/jetstream"
  max_memory_store: 256MB
  max_file_store: 2GB
}

สร้างไดเรกทอรี่ที่จำเป็น

sudo mkdir -p /etc/nats
sudo mkdir -p /var/lib/nats/jetstream
sudo mkdir -p /var/log/nats
sudo chown -R nobody:nogroup /var/lib/nats
sudo chown -R nobody:nogroup /var/log/nats

Publish/Subscribe Messaging

Pattern นี้อนุญาตให้ publisher ส่งข้อความไปยังหลาย subscriber พร้อมกัน โดยไม่จำเป็นต้องรู้ว่า subscriber คือใคร

ตัวอย่างการ Publish

# ติดตั้ง NATS CLI client
go install github.com/nats-io/natscli/cmd/nats@latest

# ส่งข้อความไปยัง subject "events.order"
nats pub events.order "New order received"

ตัวอย่างการ Subscribe

# เปิด subscriber ที่ subscribe ไปยัง subject "events.order"
nats sub "events.order"

# หรือ subscribe ทั้งหมดใน namespace
nats sub "events.*"

# subscribe ด้วยการบันทึกลงไฟล์
nats sub "events.>" -f events.log

Request/Reply Pattern

Pattern นี้ใช้สำหรับการสื่อสารแบบ synchronous โดย requester จะรอรับการตอบกลับจาก responder

ตั้งค่า Responder

# เปิด responder ที่รอการคำขอ
nats reply "support.tickets" "Ticket processed"

# หลายตัว responders สามารถทำงานพร้อมกันเพื่อ load balancing
for i in {1..3}; do
  nats reply "service.requests" "Response from instance $i" &
done

ส่งคำขอ

# ส่งคำขอแล้วรอการตอบกลับ
nats request "service.requests" "Hello" --timeout 5s

# ส่งคำขอหลายครั้งพร้อมกัน
for i in {1..10}; do
  nats request "service.requests" "Request $i" &
done
wait

JetStream Streaming

JetStream เป็นฟีเจอร์ที่ให้ความเชื่อมั่นว่าข้อมูลจะถูกเก็บและส่งถึงปลายทาง แม้ว่า subscriber อาจจะออฟไลน์

สร้าง Stream

# สร้าง stream ชื่อ "ORDERS"
nats stream create ORDERS --subjects "orders.*"

# ดูรายละเอียด stream
nats stream info ORDERS

# เพิ่มข้อมูลลงใน stream
nats pub orders.new "Order #1001: $50.00"
nats pub orders.new "Order #1002: $75.50"
nats pub orders.new "Order #1003: $120.00"

สร้าง Consumer

# สร้าง consumer เพื่อใช้ข้อมูลจาก stream
nats consumer create ORDERS

# รับข้อมูลจาก consumer
nats consumer next ORDERS

# ดึงข้อมูลแบบ batch
nats sub orders.* --stream ORDERS

ตั้งค่า Cluster

การตั้งค่า cluster ทำให้ NATS Server สามารถขยาย และมี high availability ได้

ไฟล์การกำหนดค่า Node 1

# /etc/nats/nats-node1.conf
port: 4222
monitor_port: 8222

cluster {
  port: 6222
  name: "nats-cluster"
  routes: [
    nats-route://localhost:6223,
    nats-route://localhost:6224
  ]
}

jetstream {
  store_dir: "/var/lib/nats/jetstream-1"
  max_memory_store: 256MB
}

logfile: "/var/log/nats/nats-node1.log"

ไฟล์การกำหนดค่า Node 2 และ Node 3

# /etc/nats/nats-node2.conf
port: 4223
monitor_port: 8223

cluster {
  port: 6223
  name: "nats-cluster"
  routes: [
    nats-route://localhost:6222,
    nats-route://localhost:6224
  ]
}

jetstream {
  store_dir: "/var/lib/nats/jetstream-2"
  max_memory_store: 256MB
}

logfile: "/var/log/nats/nats-node2.log"

เรียกใช้ Cluster

# เปิดเซิร์ฟเวอร์ 3 ตัว
nats-server -c /etc/nats/nats-node1.conf &
nats-server -c /etc/nats/nats-node2.conf &
nats-server -c /etc/nats/nats-node3.conf &

# ตรวจสอบสถานะ cluster
nats server list --all

Authentication และ TLS

การตั้งค่า authentication และ TLS ทำให้ NATS Server ปลอดภัยและควบคุมการเข้าถึงได้

สร้าง TLS Certificates

# สร้าง private key
openssl genrsa -out /etc/nats/nats-key.pem 2048

# สร้าง certificate
openssl req -new -x509 -key /etc/nats/nats-key.pem \
  -out /etc/nats/nats-cert.pem -days 365 \
  -subj "/CN=localhost"

# เปลี่ยนสิทธิ์เข้าถึง
sudo chmod 600 /etc/nats/nats-key.pem
sudo chmod 644 /etc/nats/nats-cert.pem

ไฟล์การกำหนดค่า TLS และ Authentication

# /etc/nats/nats-secure.conf
port: 4222
monitor_port: 8222

# TLS configuration
tls: {
  cert_file: "/etc/nats/nats-cert.pem"
  key_file: "/etc/nats/nats-key.pem"
}

# Authentication
authorization: {
  default_user: "user"
  default_permission: {
    publish: ">"
    subscribe: ">"
  }

  users: [
    {
      user: "admin"
      password: "SecurePassword123!"
      permissions: {
        publish: ">"
        subscribe: ">"
      }
    },
    {
      user: "app1"
      password: "AppPassword456!"
      permissions: {
        publish: ["orders.*"]
        subscribe: ["orders.*", "events.*"]
      }
    }
  ]
}

jetstream {
  store_dir: "/var/lib/nats/jetstream"
  max_memory_store: 256MB
}

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

ทำการตรวจสอบหลายวิธีเพื่อให้แน่ใจว่า NATS Server ทำงานได้อย่างถูกต้อง

ตรวจสอบสถานะเซิร์ฟเวอร์

# ตรวจสอบว่า NATS process ทำงาน
ps aux | grep nats-server

# ตรวจสอบพอร์ตที่ใช้
netstat -tlnp | grep 4222

# ดู logs ของ NATS
tail -f /var/log/nats/nats.log

ทดสอบการเชื่อมต่อ

# ทดสอบการเชื่อมต่อแบบธรรมดา
nc -zv localhost 4222

# ใช้ curl เพื่อตรวจสอบ monitoring endpoint
curl -s http://localhost:8222/varz | jq .

# ดูจำนวน connections
curl -s http://localhost:8222/connz | jq '.connections | length'

ทดสอบ Pub/Sub

# ทดสอบการส่งและรับข้อความ
nats pub test.topic "Hello NATS"
nats sub "test.>"

# ทดสอบด้วย nats cli
nats context list
nats pub bench.test "Test message" --count 10
nats stats --raw
เคล็ดลับ: ใช้ nats server list เพื่อดูเซิร์ฟเวอร์ทั้งหมดในการเชื่อมต่อของคุณ

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

ต่อไปนี้คือปัญหาทั่วไปที่อาจพบเจอเมื่อใช้งาน NATS Server

ข้อผิดพลาด: Address already in use

ข้อผิดพลาดนี้เกิดขึ้นเมื่อพอร์ต 4222 ถูกใช้งานโดยโปรแกรมอื่นแล้ว

# ค้นหาโปรแกรมที่ใช้พอร์ต
lsof -i :4222
sudo netstat -tlnp | grep 4222

# หยุดโปรแกรมที่ใช้พอร์ต (ตัวอย่าง)
sudo kill -9 12345

# หรือเปลี่ยนพอร์ตใน config
port: 4223

ข้อผิดพลาด: Permission denied

เมื่อ NATS ไม่สามารถเข้าถึงไดเรกทอรี่ที่กำหนดไว้

# ตรวจสอบสิทธิ์เข้าถึง
ls -la /var/lib/nats/
ls -la /var/log/nats/

# แก้ไขสิทธิ์
sudo chown -R nobody:nogroup /var/lib/nats
sudo chown -R nobody:nogroup /var/log/nats
sudo chmod 755 /var/lib/nats
sudo chmod 755 /var/log/nats

ข้อผิดพลาด: Client could not connect

เมื่อ client ไม่สามารถเชื่อมต่อกับ NATS Server

# ตรวจสอบว่า firewall เปิดพอร์ต
sudo ufw allow 4222
sudo ufw allow 8222

# ตรวจสอบการกำหนดค่า NATS
nats-server -c /etc/nats/nats.conf --verify-config

# ตรวจสอบ logs
tail -50 /var/log/nats/nats.log | grep error

ข้อผิดพลาด: JetStream not enabled

เมื่อพยายามใช้ JetStream แต่ยังไม่ได้เปิดใช้งาน

# เพิ่ม JetStream ในไฟล์ config
jetstream {
  store_dir: "/var/lib/nats/jetstream"
  max_memory_store: 256MB
  max_file_store: 2GB
}

# เริ่มต้น NATS ใหม่
sudo systemctl restart nats-server

# ตรวจสอบว่า JetStream เปิดใช้งาน
curl -s http://localhost:8222/varz | jq '.jetstream'

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

NATS Server และ RabbitMQ ต่างกันอย่างไร

NATS Server มีน้ำหนักเบากว่า RabbitMQ มีความเร็วสูงกว่า และใช้หน่วยความจำน้อยกว่า เหมาะสำหรับ microservices ที่ต้องการความเร็วสูง ในขณะที่ RabbitMQ มีความยืดหยุ่นและเสถียรภาพมากกว่า เหมาะสำหรับระบบที่ต้องการความเชื่อมั่นสูง

ฉันสามารถเชื่อมต่อจากเครื่องลูกข่ายอื่นได้หรือไม่

ได้ แต่ต้องเปิดพอร์ต 4222 สำหรับการเชื่อมต่อและพอร์ต 8222 สำหรับ monitoring ใช้คำสั่ง nats context save --url nats://server-ip:4222 เพื่อเพิ่มเซิร์ฟเวอร์ remote แล้วใช้ nats context select เพื่อสลับไป

ฉันจะเก็บข้อมูลไว้นานเท่าไหร่ได้

ขึ้นอยู่กับการกำหนดค่า JetStream ของคุณ สามารถกำหนด retention policy ได้โดยสำหรับจำนวนข้อความ เวลา หรือขนาด ตัวอย่างเช่น nats stream create ORDERS --retention limits --max-msgs 10000