Reverse proxy แบบอีซี่ๆ ด้วย NPM: Nginx proxy manager
ก่อนอื่นมาเล่ากันก่อนเลยว่า Proxy คืออะไร. Proxy นั้นมีอยู่สองประเภทคือ 1. Forward proxy 2. Reverse proxy
Proxy?
ก่อนอื่นมาเล่ากันก่อนเลยว่า Proxy คืออะไร. Proxy นั้นมีอยู่สองประเภทคือ 1. Forward proxy 2. Reverse proxy
Forward proxy
หรือที่เรียกกันว่า Proxy เฉยๆ แต่ก่อนเราใช้กันเยอะมาก ยิ่งในเฉพาะองค์กร หรือชาวเกมเมอร์ช่วง Ragnarok inter ดังๆ เราก็ต้องไปหา proxy มาใช้เพื่อเข้าเซิฟอินเตอร์ (ใช้ IP ที่ GEO เป็นไทยไม่ได้) flow ของมันก็ตามรูปนี้ (ขึ้นอยู่กับ proxy server อยู่ตรงไหน ในหรือนอก) เมื่อเราวิ่งผ่าน proxy เราจะซ่อนไอพีของเราไว้ แล้วให้ proxy server ของเราเป็นนายหน้าทำงานแทนทุกอย่าง (โดยที่ server ไม่รู้ว่าเรา proxy อยู่) แต่ก็มีข้อควรระวังอย่างเช่น ไม่มีการเข้ารหัส (Server ที่เราวิ่งผ่าน จะเห็นทั้งหมด) หรือตอบสนองช้ากว่าปกติ (เพราะต้องมี hop เพิ่มนั่นเอง) ปัจจุบันนั้นถูกแทนที่ด้วย NAT และ VPN ครับ แต่ก็ยังมีการใช้อยู่บ้างในเฉพาะภารกิจ

Reverse proxy
กับ Reverse proxy นั้นกลับกันเพราะ Reverse proxy จะถูกใช้ในการจัดการ request ที่เข้ามาแล้วทำการจำแนกไปยัง server/host ต่างๆ แต่ทั้งนี้ก็ยังทำตัวเป็นนายหน้าเหมือนเดิมคือ Requester/user จะไม่รู้ว่าเรา serve เขาด้วย proxy (บทความเกี่ยวกับ reverse proxy แท้ๆ ดันเขียนสั้นกว่า forward proxy อีก)

Why?
มาเล่าข้อดีกันก่อนว่าทำไมเราถึงต้องใช้ เห็นข้อดีแล้วจะได้อยากทำกัน (ว่าไปนั่น) เคยไหม มี Domain name อยู่อันเดียว แต่ดันมีหลายเว็บหลาย service หลาย server ที่ต้องการใช้ Domain นี้ ไอ้การจะไปใช้ Domain แล้วห้อยด้วย port เช่น https://utilitee.me:4019, https://utilitee.me:8081 มันก็ไม่เท่ไม่จ๊าบเอาซะเลย ไหนจะขอ cert ไม่ได้อีก
จะดีกว่าไหมถ้าเราสามารถใช้ 1 domain หลาย service ได้ เช่น https://blog.utilitee.me, https://website.utilitee.me, https://gitlab.utilitee.me บร๊ะ มันคงจะเท่ไม่หยอก
เจ้าตัว Reverse proxy นี่แหละครับ ที่จะมาช่วยเรื่องนี้ ซึ่งวันนี้ผมจะมาแนะนำ NPM:Nginx Reverse Proxy Manager เพราะมี GUI เหมาะสำหรับผู้เริ่มต้นและไม่ถนัด command/coding และมี feature ครบครัน ใช้งานง่าย และ docker supported
Howto
เราจะมาติดตั้ง NPM ผ่าน docker กันครับโดยขั้นแรกเครื่องของท่านต้องติดตั้ง docker และ compose ก่อน (จริงๆ จะติดตั้งผ่าน docker run ก็ได้ แต่ผมแนะนำ docker-compose) และอีกอย่างคือต้อง forward router port 80 และ 443 ไปที่ server ตัวนี้ ซึ่งวิธีการก็แตกต่างออกไปแต่ละรุ่นละยี่ห้อ เพราะฉะนั้นผมจะไม่แนะนำในส่วนนี้ ให้หาเองได้เลย ด้วย keyword "ยี่ห้อ router forward port" เมื่อทุกอย่างพร้อมแล้ว มาเริ่มกัน
# สร้าง dir
mkdir npm-1 && cd npm-1
mkdir -p {data,letsencrypt}
# structure จะประมาณนี้
npm-1
├── data
├── docker-compose.yml
└── letsencrypt
มา compose file กัน
touch docker-compose.yamlversion: '2.0'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencryptจากนั้น
# -d หมายถึง detach ลองศึกษาเพิ่มเติมได้ที่ docker document
docker-compose up -d จากนั้นเช็ค container ว่าทำงานปกติหรือไม่
docker psดูเหมือนจะพร้อมแล้วนะ ลองเช็คที่ localhost:81 และ login ด้วย admin@example.com/ changeme

เมื่อ login เข้ามา จะเจอหน้าตาประมาณนี้ เราจะมา config service แรกกันนะครับ click ที่ Proxy Hosts > Add proxy host จะเจอหน้าต่างแบบนี้ ทีนี้ผมสมมุติว่า web ผมอยู่บน host 10.10.10.100 ด้วย HTTP port 8085

ส่วนต่อไป SSL ส่วนนี้ตามนี้ครับ

จากนั้นกดเซฟ ถ้าไม่มีอะไรผิดพลาด เราก้จะได้ service ที่เป็น HTTPs + cert กันแล้ว
Summary
นอกจากนี้ยังมี feature อื่นๆ เช่น steam ที่สามารถ redirect port ได้เลย และเครื่องมือที่ทำงานประเภทนี้มีอยู่อีกหลายตัว เช่นที่ผมใช้ในการทำงานก็ haproxy