Docker

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 PointTraffic ทั้งหมดผ่าน Port 80/443 เพียงจุดเดียว
SSL Terminationจัดการ HTTPS ที่ Proxy แล้วส่งต่อเป็น HTTP ภายใน
Virtual Hostingรัน domain ต่างๆ บนเซิร์ฟเวอร์เดียวกัน
Load Balancingกระจาย Request ไปหลาย Container
Securityซ่อน Backend Container จาก Internet
CachingCache 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
TraefikAuto-detect Docker ContainerDevOps, Microservices
CaddyHTTPS อัตโนมัติ, Config ง่ายโปรเจกต์ขนาดกลาง
HAProxyPerformance สูง, Load BalancingProduction 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 ทั่วไป