เมื่อคุณรัน Container หลายตัวบนเซิร์ฟเวอร์เดียว แต่ละตัวรันบน Port ที่ต่างกัน เช่น :8080, :8081, :3000 การให้ผู้ใช้เข้าถึงด้วย URL แบบนั้นไม่ใช่วิธีที่ดี นั่นคือเหตุผลที่ต้องมี Reverse Proxy ซึ่งทำหน้าที่เป็นตัวกลางรับ Request จาก Internet แล้วส่งต่อไปยัง Container ที่ถูกต้อง พร้อม HTTPS บทความนี้จะอธิบายแนวคิดและวิธีการทำงานของ Reverse Proxy ก่อนที่เราจะลงมือติดตั้งในบทถัดไป
Reverse Proxy คืออะไร?
Reverse Proxy คือเซิร์ฟเวอร์ที่อยู่ระหว่าง Client (Browser) กับ Backend Server (Container) โดยรับ Request ทั้งหมดที่เข้ามาก่อน แล้วจึงส่งต่อไปยัง Service ที่เหมาะสม ชื่อ “Reverse” เพราะทำงานตรงข้ามกับ Forward Proxy ที่ Client ใช้ซ่อนตัวเอง — Reverse Proxy ซ่อน Backend Server แทน
Internet
│
▼
[Reverse Proxy :443]
│
├──► blog.example.com ──► [WordPress Container :8080]
├──► app.example.com ──► [Node.js Container :3000]
└──► api.example.com ──► [API Container :5000]
ปัญหาที่เกิดขึ้นโดยไม่มี Reverse Proxy
หากไม่มี Reverse Proxy คุณจะพบปัญหาเหล่านี้:
- Port ชน — แต่ละ Container ต้องใช้ Port ที่ต่างกัน (80 มีแค่หนึ่ง Port)
- URL ไม่สวย — ผู้ใช้ต้องพิมพ์ http://ip:8080 แทน https://blog.example.com
- ไม่มี HTTPS — ต้องจัดการ SSL Certificate แยกกันทุก Container
- ไม่มี Load Balancing — ไม่สามารถกระจาย Traffic ระหว่างหลาย Container ได้
- Security — Container ถูก Expose ตรงสู่ Internet
ประโยชน์ของ Reverse Proxy
| ประโยชน์ | รายละเอียด |
|---|---|
| Single Entry Point | Traffic ทั้งหมดผ่าน Port 80/443 เพียงจุดเดียว |
| SSL Termination | จัดการ HTTPS ที่ Proxy แล้วส่งต่อเป็น HTTP ภายใน |
| Virtual Hosting | รัน domain ต่างๆ บนเซิร์ฟเวอร์เดียวกัน |
| Load Balancing | กระจาย Request ไปหลาย Container |
| Security | ซ่อน Backend Container จาก Internet |
| Caching | Cache Response เพื่อลด Load |
วิธีทำงานของ Reverse Proxy กับ Docker
ใน Docker Environment การทำงานของ Reverse Proxy มีลักษณะพิเศษ เพราะ Container แต่ละตัวอยู่ใน Network ภายใน:
- Reverse Proxy Container อยู่ใน Network เดียวกับ Container อื่นๆ
- ผูก Port 80 และ 443 กับ Host Machine
- รับ Request จาก Internet ผ่าน Domain Name
- ส่งต่อไปยัง Container ปลายทางโดยใช้ชื่อ Service (ไม่ใช่ IP)
- Container อื่นๆ ไม่ต้อง Expose Port สู่ภายนอก
# ตัวอย่าง: WordPress ไม่ต้อง expose port สู่ภายนอก
services:
wordpress:
image: wordpress:latest
# ไม่มี ports: section!
networks:
- proxy_network
nginx-proxy-manager:
image: jc21/nginx-proxy-manager
ports:
- "80:80"
- "443:443"
networks:
- proxy_network
ตัวเลือก Reverse Proxy ยอดนิยมสำหรับ Docker
| Tool | จุดเด่น | เหมาะสำหรับ |
|---|---|---|
| Nginx Proxy Manager | มี Web UI ใช้งานง่าย | ผู้เริ่มต้น, Home Lab, VPS |
| Traefik | Auto-detect Docker Container | DevOps, Microservices |
| Caddy | HTTPS อัตโนมัติ, Config ง่าย | โปรเจกต์ขนาดกลาง |
| HAProxy | Performance สูง, Load Balancing | Production Scale ใหญ่ |
| Nginx (ตรงๆ) | ควบคุมได้ทุกอย่าง | Advanced Users |
SSL Termination คืออะไร?
SSL Termination (หรือ SSL Offloading) คือการที่ Reverse Proxy รับ HTTPS Request จาก Client แล้วถอดรหัส (Decrypt) ก่อนส่งต่อเป็น HTTP ธรรมดาไปยัง Container ภายใน ข้อดีคือ:
- Container ภายในไม่ต้องจัดการ SSL ให้ยุ่งยาก
- จัดการ Certificate ที่จุดเดียว
- ลด CPU Load บน Application Container
- Network ภายใน Docker ปลอดภัยอยู่แล้ว ไม่จำเป็นต้อง Encrypt ซ้ำ
Client ──HTTPS──► [Reverse Proxy] ──HTTP──► [Container]
(443) SSL Termination (80) ภายใน Docker Network
สรุป
| แนวคิด | ความหมาย |
|---|---|
| Reverse Proxy | ตัวกลางรับ Request แล้วส่งต่อ Container ที่ถูกต้อง |
| SSL Termination | จัดการ HTTPS ที่ Proxy แทน Container |
| Virtual Hosting | หลาย Domain บนเซิร์ฟเวอร์เดียว |
| ความปลอดภัย | Container ไม่ถูก Expose ตรงสู่ Internet |
บทความถัดไป เราจะลงมือติดตั้ง Nginx Proxy Manager ซึ่งเป็น Reverse Proxy ที่ใช้งานง่ายที่สุด มี Web UI สวยงาม และรองรับ Let’s Encrypt SSL อัตโนมัติ เหมาะสำหรับ VPS ทั่วไป

