Reverse Proxy คืออะไร? ทำไมถึงต้องใช้กับ Docker

เมื่อคุณรัน 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 ภายใน:

  1. Reverse Proxy Container อยู่ใน Network เดียวกับ Container อื่นๆ
  2. ผูก Port 80 และ 443 กับ Host Machine
  3. รับ Request จาก Internet ผ่าน Domain Name
  4. ส่งต่อไปยัง Container ปลายทางโดยใช้ชื่อ Service (ไม่ใช่ IP)
  5. 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 ทั่วไป