ติดตั้ง NGINX Reverse Proxy ด้วย Docker ฉบับผู้เริ่มต้นแบบภาษาคน

Toun Toon
3 min readNov 14, 2020

--

มาเริ่มกันเลย….อย่างเเรกเราก็ควรเข้าใจ Concept ของ proxy กันก่อนนะ

Proxy คืออะไร ?

ผมเดาว่าทุกคนเคยเห็นหรือได้ยินคำว่า proxy กันมาบ้าง เเต่อาจจะยังไม่เข้าใจว่ามันคืออะไร ทำงานอย่างไร เพื่อไม่เป็นการเสียเวลาเรามาเริ่มกันเลย…

งั้นผมขอยกตัวอย่างสถานการ์ณหนึ่ง เป็นสถานการณ์เกี่ยวข้องกับความรัก บ๊อบและอลิซนั้นได้ทำการจ้างบริษัท Matching คู่เพื่อเดทกัน โดยที่ทั้งคู่ไม่รู้จักกัน แต่จะมีแด๊กที่เป็น Operator คอยดูแลทั้งสองฝ่ายเพื่อแลกเปลี่ยนข้อมูลซึ่งกัน

รูปที่ 1 (ภาพประกอบสำหรับ Proxy)

🧝🏻 บ๊อบ: อายุเท่าไร? (บ็อบฝากให้เเด๊กไปถาม)

🧛🏻‍♂️ แด๊ก: อายุเท่าไร? (แด๊กนำคำถามจากบ๊อบไปถามอลิซ)

จากนั้นอลิซก็ตอบกลับว่า “อายุ 18 ปี” ให้กับแด๊ก แล้วเเด๊กค่อยไปบอกบ๊อบอีกที โดยที่อลิซก็ไม่รู้ว่าผู้ชายคนไหนเป็นคนฝากถามมา และบ๊อบก็ไม่รู้เช่นกันว่าผู้หญิงคนที่ถามไปนั้นคือใคร

จากตัวอย่าง แด๊กคือ Proxy นั้นเอง ทำหน้าที่สำหรับการรับ request แล้วส่งไปต่อไปยัง server ปลายทาง (เป็นตัวคั่นกลางระหว่าง client กับ server ปลายทาง) เมื่อปลายทางได้รับ request และประมวลผลเสร็จสิ้นแล้ว จะทำการ response ไปหา เครื่อง Proxy เพื่อทำการส่ง response ต่อไปยัง client ต้นทางทางอีกทีนั้นเอง สรุปแล้ว client จะไม่ได้คุยกับ server ปลายทางตรงๆ แต่จะคุยกับเครื่อง proxy serverนั้นเอง (เราจะมองเห็นแค่ ip proxy server แต่เราจะมองไม่เห็น ip ของ server ปลายทาง Protect Privacy) แถมมันยังทำ caching ได้ด้วยนะ ลองหาข้อมูลเพิ่มเติม

Forward Proxy คืออะไร ?

Forward Proxy ทำหน้าที่ในการส่ง request จากภายในสู่ภายนอก เช่นคุณอยากเข้าเว็บ example.com โดยเครื่องของคุณ IP: 1.1.1.1 แล้ว proxy server IP: 2.2.2.2 แน่นอนว่าเมื่อคุณส่ง request ไป server ปลายทาง (example.com) จะมองเห็น IP ของคุณเป็น 2.2.2.2 เพราะเมื่อ Proxy มันส่ง request ออกไปยังภายนอกทุก IP ภายใน private network จะเป็น IP ของเครื่อง Proxy (ใครสายมุดก็จะรู้ดี🤣)

รูปที่ 3 (ภาพประกอบสำหรับ Forward Proxy)

“Forward proxy is the intermediary that the client puts forward between itself and any server”

Reverse Proxy คืออะไร ?

Reverse Proxy นั้นจะทำกลับกันกับ Forward Proxy (ชื่อมันก็บอกอยู่แล้ว) คือทำหน้าที่ในการควบคุมการเข้าถึง server ภายใน private network กล่าวคือ reverse proxy ทำหน้าที่ในการรับ request จากภายนอกเพื่อทำการส่งต่อให้ server ภายในประมวลผล ก่อนจะทำการ response กลับไป แน่นอนว่ามันสามารถทำ load balancing ในการกระจายรับส่งข้อมูลให้กับ server เครื่องอื่นๆภายในได้ และยังสามารถทำ Cache static content เพื่อช่วยในการลด load ของ server ภายในได้อีกด้วย

รูปที่ 2 (ภาพประกอบสำหรับ Reverse Proxy)

“Reverse proxy is a gateway to a server or group of servers.

เข้าใจ concept ของ Proxy แล้ว งั้นเรามาลุยทำ Reverse Proxy with NGINX Docker กันเถอะ

  1. ทำสร้างไฟล์ my-app.conf เพื่อทำการ config reverse proxy (ตรง proxy_pass ให้ใส่ ชื่อ container name ที่จะให้ forward);
  server {
listen 80;
server_name netflix.local;
location / {
proxy_pass http://netflix-demo;
}
}
server {
listen 80;
server_name postman-csv.local;
location / {
proxy_pass http://postman-example-to-csv;
}
}

2. สร้าง docker-compose.yaml เพื่อ create container 3 ตัว คือ

version: 3.7
services:
reverse-proxy:
image: nginx:alpine
container_name: nginx-reverse-proxy
volumes:
- /my-app.conf:/etc/nginx/nginx.conf
ports:
- 80:80
netflix-app:
image: mrtompkin/netflix-demo
container_name: netflix-demo
ports:
- 90:80
csv-app:
image: mrtompkin/postman-example-to-csv
container_name: postman-example-to-csv
ports:
- 70:80

3. ทำการรัน docker-compose

docker-compose up -d .

4. แก้ไฟล์ /etc/hosts ที่เครื่องของคุณ

5. เมื่อรันตาม step เสร็จแล้ว ลองเข้าไปที่ http://netflix.local และ http://postman-csv.local/ เป็นอันสำเร็จ

--

--