Nginx (BETA)

Nginx

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 ให้เรียบร้อยแล้ว

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: true
Note

⚠️ อย่าลืมสร้าง 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.yml

2. 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

กำลังเตรียมเนื้อหาในส่วนนี้