ในระบบพัฒนาซอฟต์แวร์ที่มีหลายโปรเจกต์รันอยู่พร้อม ๆ กัน (เช่น WordPress และ Laravel) การจัดการ Web Server และพอร์ตต่าง ๆ มักจะยุ่งยากหากต้องเปิดพอร์ตชนกันหลายตัว แนวทางที่ดีและเป็นระเบียบคือการสร้าง Nginx ตัวกลาง (Centralized Reverse Proxy) ขึ้นมาทำหน้าที่เป็นเซิร์ฟเวอร์หลักที่คอยรับทราฟฟิกจากภายนอก แล้วส่งต่อ (Proxy) ไปยังคอนเทนเนอร์ของแต่ละโปรเจกต์ผ่านเครือข่าย Docker ภายในที่ปลอดภัย
ในบทความนี้เราจะมาดูวิธีการจัดโครงสร้างโปรเจกต์และเขียนไฟล์คอนฟิกสำหรับรัน Nginx ตัวกลางในรูปแบบ Sidecar Architecture ครับ
โครงสร้างโปรเจกต์ (Project Structure)
เราสามารถแยกโฟลเดอร์สำหรับ Nginx ตัวกลางไว้อย่างเป็นระเบียบ เช่น /Users/common/Docker/reverse_proxy/ โดยมีโครงสร้างไฟล์ดังนี้
/Users/common/Docker/
├── .env <-- ไฟล์ตั้งค่าส่วนกลาง
.
└── server_nginx_1_30 <-- โครงสร้างฝั่ง Nginx ตัวกลาง
├── docker-compose.yml
├── nginx.conf
└── conf.d/
└── default.conf
ตัวอย่างไฟล์ docker-compose.yml
ไฟล์คอนฟิกหลักสำหรับสั่งรัน Nginx โดยดึงซอร์สโค้ดของแต่ละโปรเจกต์เข้ามาเชื่อมโยง (Mount) และเชื่อมต่อเข้ากับเครือข่ายภายนอกชื่อ magi ที่แชร์ร่วมกับสแต็กอื่น ๆ
services:
server_nginx:
image: nginx:1.31-alpine
container_name: serv_nginx_1_31
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
- ./logs:/var/log/nginx
- ../wordpress_71_dev/src:/var/www/wordpress_71:ro
- ../laravel_app_13_0/src:/var/www/laravel_13:ro
networks:
- magi
networks:
magi:
name: magi
external: true
วิธีการใช้งานและการเปิดระบบ
1. เข้าไปยังโฟลเดอร์ Nginx ตัวกลาง
เปิด Terminal แล้วเปลี่ยนเส้นทางไปยังโฟลเดอร์ที่เก็บไฟล์คอนฟิกของ Nginx
cd /Users/common/Docker/server_nginx_1_30
2. สั่งรันคอนเทนเนอร์
ใช้งาน Docker Compose เพื่อเปิดเซอร์วิส Nginx ขึ้นมาทำงานในรูปแบบ Background
docker compose up -d
จุดเด่นของสถาปัตยกรรมนี้
- Single Entry Point
ใช้พอร์ต80และ443บนเครื่องโฮสต์เพียงจุดเดียว ควบคุมทุกเว็บไซต์ได้จากที่นี่ - Isolated & Shared Network
ใช้ Docker Networkmagiร่วมกับเซอร์วิส PHP และ Database ของแต่ละโปรเจกต์ ทำให้ Nginx สามารถส่งต่อคำขอไปยัง PHP-FPM ของแต่ละโปรเจกต์ได้อย่างแม่นยำ - Clean Management
แยกการจัดการ Web Server ออกจากตัวซอร์สโค้ดโปรเจกต์อย่างเด็ดขาด ทำให้สามารถรีสตาร์ท ปรับแต่ง หรืออัปเดต Nginx โดยไม่กระทบกับไฟล์ระบบข้างเคียงครับ
อ่านเพิ่มเติม