Nginx
NGINX เป็น web server ที่สามารถนำมาทำเป็น Reverse Proxy หรือ Load Balancer ได้ โดยที่มีความสามารถในการทำงานที่มีประสิทธิภาพสูง และมีความยืดหยุ่นในการกำหนดค่าต่าง ๆ
Edition
NGINX ถูกพัฒนาออกมาหลากหลายเวอร์ชั่น ซึ่งก็จะมีคุณสมบัติที่แตกต่างกัน ในการนำมาใช้งานเป็น Reverse Proxy กับ container จะมีเวอร์ชั่นหลัก ๆ อยู่ 2 เวอร์ชั่น ได้แก่
1. NGINX Open Source
เป็น web server แบบ open source ที่มีการใช้งานกว่า 400 ล้านเว็บไซต์ทั่วโลก สามารถดูข้อมูลเพิ่มเติมได้ที่ NGINX Open Source
2. NGINX Plus
เป็น NGINX ที่รวมคุณสมบัติต่าง ๆ ไว้ให้เรียบร้อยแล้วไม่ว่าจะเป็น load balancer, reverse proxy, web server, content cache และ API gateway สามารถดูข้อมูลเพิ่มเติมได้ที่ NGINX Plus
NGINX Reverse Proxy for Docker
ในการนำ NGINX มาใช้งานกับ container เราจะใช้ image nginxproxy/nginx-proxy ที่มีการแปลง NGINX มาสำหรับการทำ Reverse Proxy ให้เรียบร้อยแล้ว
- Source Code: https://github.com/nginx-proxy/nginx-proxy
- Docker Image: https://hub.docker.com/r/nginxproxy/nginx-proxy
Installation
ในการติดตั้ง Nginx Proxy นั้นเราสามารถใช้ Docker Compose ช่วยติดตั้งได้ง่าย ๆ โดยทำการสร้างไฟล์ docker-compose.yml ดังนี้
version: '3.7'
services:
nginx-proxy:
image: 'nginxproxy/nginx-proxy:1.0.1-alpine'
container_name: 'nginx-proxy'
restart: 'always'
networks:
- frontend
ports:
- '80:80'
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
frontend:
external: trueNote
⚠️ อย่าลืมสร้าง network สำหรับจัดการ traffic ที่จะให้เข้ามาในแอพที่เป็น container เช่นในตัวอย่างใช้ network ชื่อ
frontendซึ่งเราสามารถสร้างได้ด้วยคำสั่งdocker network create frontend
หลังจากนั้นให้รันคำสั่ง docker-compose up -d เพื่อสร้าง container ขึ้นมา
Application Configuration
ในการสร้าง container ขึ้นมาเพื่อใช้งานเป็นแอพพลิเคชั่น ให้เพิ่ม environment variable ชื่อ VIRTUAL_HOST และ VIRTUAL_PORT ให้กับ container นั้น ๆ โดยให้กำหนด domain ที่ต้องการให้เป็น domain หลักของแอพพลิเคชั่นนั้น ๆ โดยที่ domain นั้นต้องมีการ resolve ไปยัง IP ของ container ที่เป็น Nginx Proxy นั้น ๆ ดังตัวอย่าง
version: '3.7'
services:
webservice:
image: 'portal-atlasx.cdg.co.th:8123/atlasx/webservice:${WEBSERVICE_VERSION}'
container_name: webservice
networks:
- frontend
environment:
- VIRTUAL_HOST=${WEBSERVICE_URL}
- VIRTUAL_PORT=80
- ASPNETCORE_BASEPATH=/${WEBSERVICE_NAME}
restart: unless-stopped
webapp:
image: 'portal-atlasx.cdg.co.th:8123/atlasx/webapp:${WEBAPP_VERSION}'
container_name: webapp
networks:
- frontend
environment:
- VIRTUAL_HOST=${WEBAPP_URL}
- VIRTUAL_PORT=80
restart: unless-stopped
networks:
frontend:
external: trueหลังจากรัน docker compose up -d Nginx Proxy จะค้นหา container ให้โดยอัตโนมัติ
Nginx Proxy Configuration
Note
⚠️ สำหรับการใช้งาน Nginx Proxy นั้น container ที่จะให้ reverse proxy ไปหา ไม่ต้องกำหนด base href แต่จะมากำหนดผ่าน nginx config แทน
AtlasX Web Application ไม่ต้องใส่
--build-args BASE_HREF=ในการ build image
1. Create config file
เราสามารถกำหนดค่าของ NGINX ได้ โดยทำการสร้างไฟล์ custom.conf ขึ้นมา
nginx-proxy
├── custom.conf
└── docker-compose.yml2. Add config to custom.conf
จากนั้นให้กำหนดค่าในไฟล์ custom.conf ดังนี้
server {
listen 80;
listen [::]:80;
location / {
try_files $uri $uri/ =404;
}
location /axwa {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://webapp;
}
location /axws {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://webservice;
}
}- ในส่วนของ
locationให้กำหนด path ที่ต้องการให้ proxy ไป - ในส่วนของ
proxy_passให้กำหนดชื่อของ container และ port ที่ต้องการให้ proxy ไป
Note
ระบบ Network ของ Docker สามารถใช้ชื่อ container ที่อยู่ใน network เดียวกันในการติดต่อสื่อสารกันได้ เนื่องจาก Docker มี DNS ที่ทำการ resolve ชื่อ container ให้เป็น IP ของ container นั้น ๆ อัตโนมัติ
- เราสามารถกำหนด proxy setting อื่น ๆ ได้ สามารถดูรายละเอียดได้จาก Nginx Full Example Configuration
3. Mount config file to container
และทำการ mount ไฟล์ custom.conf ไปยัง container ของ Nginx Proxy ดังนี้
version: '3.7'
services:
nginx-proxy:
image: 'nginxproxy/nginx-proxy:1.0.1-alpine'
container_name: 'nginx-proxy'
restart: 'always'
networks:
- frontend
ports:
- '80:80'
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./custom.conf:/etc/nginx/conf.d/custom.conf
networks:
frontend:
external: trueหลังจากนั้นให้ทำการรัน docker-compose up -d เพื่ออัพเดท container
SSL Configuration
กำลังเตรียมเนื้อหาในส่วนนี้