Reverse proxy แบบอีซี่ๆ ด้วย NPM: Nginx proxy manager

ก่อนอื่นมาเล่ากันก่อนเลยว่า Proxy คืออะไร. Proxy นั้นมีอยู่สองประเภทคือ 1. Forward proxy 2. Reverse proxy

Reverse proxy แบบอีซี่ๆ ด้วย NPM: Nginx proxy manager
Photo by maxim bober / Unsplash

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.yaml
version: '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

Read more

Restore MySQL DB ด้วย Binlog file

Restore MySQL DB ด้วย Binlog file

สวัสดีครับ วันนี้พลาดครับ เรื่องของเรื่องคือผมจะกลับมาเขียน blog เลยมาเช็ต blog ที่ผมรันไว้ ซึ่งผมรัน Ghost CMS blog บน docker แต่ดั๊นใช้ tag <:latest> ซึ่งใน compose file มีทั้ง ghost และ mysql ด้วยความที่รันไว้นานแล้ว และไม่ได้บันทึกอะไรไว้ มาถึงผมก็จัดแจง restart .... ไม่ขึ้นครับ

By Akachai Bunsorn