0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng dẫn Triển khai NGINX trên Local và Production với Docker Compose

Đăng vào 1 tháng trước

• 6 phút đọc

Chủ đề:

Development

Hướng dẫn Triển khai NGINX trên Local và Production với Docker Compose

Bài viết này sẽ hướng dẫn bạn chi tiết cách triển khai ứng dụng web bằng NGINX trên cả môi trường phát triển (localhost) và môi trường sản xuất (production). Chúng ta sẽ sử dụng docker-compose để đơn giản hóa quy trình triển khai qua chỉ một lệnh duy nhất.

NGINX là gì?

NGINX là một máy chủ web được thiết kế để có khả năng xử lý nhiều kết nối đồng thời, phục vụ cho việc phục hồi nội dung web một cách hiệu quả. Ngoài ra, NGINX cũng có khả năng hoạt động như một proxy ngược, giúp chuyển tiếp yêu cầu giữa các máy chủ khác nhau.

Những điểm chính của bài viết

  • Triển khai ứng dụng web bằng NGINX trong cả môi trường phát triển và sản xuất.
  • Đơn giản hóa việc triển khai thông qua cấu hình tự động với Docker Compose.

Triển khai trên Amazon EC2

Nếu bạn muốn triển khai ứng dụng trên máy chủ EC2, dưới đây là ví dụ chi tiết từng bước với cấu hình docker-compose.

Tệp Docker Compose

yaml Copy
version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    volumes:
      - /data/test-change-streams:/data/db
    ports:
      - "27017:27017"
    networks:
      - app-network
    command: mongod --replSet test-change-streams --logpath /data/db/mongodb.log --dbpath /data/db --port 27017

  mongodb-setup:
    image: mongo:latest
    depends_on:
      - mongodb
    networks:
      - app-network
    command: >
      bash -c "
      sleep 10 &&
      mongosh --host mongodb:27017 --eval \"
      rs.initiate({
        _id: 'test-change-streams',
        members: [
          {_id: 0, host: 'mongodb:27017'}
        ]
      })
      \"
      "

  fastapi-app:
    image: multilanguage_invoice_ocr-fastapi-app
    build:
      context: .
      dockerfile: Dockerfile
    container_name: fastapi-app
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - EMAIL_USER=${EMAIL_USER}
      - EMAIL_PASSWORD=${EMAIL_PASSWORD}
      - SECRET_KEY=${SECRET_KEY}
      - ALGORITHM=${ALGORITHM}
      - ACCESS_TOKEN_EXPIRE_MINUTES=${ACCESS_TOKEN_EXPIRE_MINUTES}
    volumes:
      - ./config:/app/config
      - ./src:/app/src
    ports:
      - "8149:8149"
    networks:
      - app-network
    depends_on:
      - mongodb
      - mongodb-setup

  jwt-frontend:
    image: multilanguage_invoice_ocr-jwt-frontend
    build:
      context: ./jwt-auth-frontend
      dockerfile: Dockerfile
    container_name: jwt-frontend
    volumes:
      - ./jwt-auth-frontend/src:/app/src
    ports:
      - "3000:3000"
    networks:
      - app-network
    depends_on:
      - fastapi-app

  nginx:
    build:
      context: ./nginx
    container_name: nginx
    volumes:
      - ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template:ro
    ports:
      - "80:80"
    networks:
      - app-network
    depends_on:
      - fastapi-app
      - jwt-frontend
      - mongodb
    environment:
      - CLIENT_MAX_BODY_SIZE=${CLIENT_MAX_BODY_SIZE}
      - SERVER_IP=${SERVER_IP}

networks:
  app-network:
    driver: bridge

Giải thích về cấu hình NGINX

Trong cấu hình trên, dịch vụ nginx hoạt động như một proxy ngược kết nối tới:

  • Giao diện (jwt-frontend)
  • Phần cuối (fastapi-app)
  • Cơ sở dữ liệu (mongodb)

Những tính năng chính của NGINX trong Docker Compose bao gồm:

  • Tên dịch vụ: nginx
  • Xây dựng bối cảnh: Xây dựng hình ảnh Docker từ ./nginx
  • Tên container: nginx
  • Volumes: Gắn kết file nginx.conf.template với chế độ chỉ đọc
  • Cổng: Chuyển tiếp đến cổng 80
  • Mạng: Kết nối với mạng tùy chỉnh app-network
  • Biến môi trường: Truyền các biến như CLIENT_MAX_BODY_SIZESERVER_IP

Cấu trúc Thư mục Cấu hình NGINX

Để thiết lập NGINX, bạn cần tạo một thư mục với tên nginx và thêm các cấu hình liên quan như sau:

1. Tệp Dockerfile

dockerfile Copy
FROM nginx:latest

COPY start-nginx.sh /start-nginx.sh
RUN chmod +x /start-nginx.sh
ENTRYPOINT ["/start-nginx.sh"]

2. Tập lệnh khởi động (start-nginx.sh)

bash Copy
#!/bin/bash
envsubst '${CLIENT_MAX_BODY_SIZE} ${SERVER_IP}' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
nginx -g 'daemon off;'

3. Mẫu cấu hình NGINX (nginx.conf.template)

nginx Copy
events {
       worker_connections 1024;
   }

http {
       client_max_body_size ${CLIENT_MAX_BODY_SIZE};

       server {
           listen 80;
           server_name localhost ${SERVER_IP};

           location / {
               proxy_pass http://jwt-frontend:3000/;
               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-Forwarded-Proto $scheme;
           }

           location /api/ {
               proxy_pass http://fastapi-app:8149/;
               proxy_read_timeout 300s;
               proxy_connect_timeout 75s;
           }

           location /mongo/ {
               proxy_pass http://mongodb:27017/;
           }
       }
   }

Xử lý Nhiều Môi Trường

Khi triển khai trong sản xuất, bạn có thể cần các cấu hình khác so với môi trường phát triển. Dưới đây là một số điểm khác biệt:

  • Môi trường sản xuất: Thường yêu cầu HTTPS trên cổng 443.
  • Môi trường phát triển: Sử dụng cấu hình HTTP đơn giản hơn trên cổng 80.

Tệp Dockerfile cho Nhiều Môi Trường

dockerfile Copy
FROM nginx:latest

RUN mkdir -p /etc/nginx/dev /etc/nginx/prod
COPY dev/nginx.conf.template /etc/nginx/dev/
COPY prod/nginx.conf.template /etc/nginx/prod/
COPY start-nginx.sh /start-nginx.sh
RUN chmod +x /start-nginx.sh
ENTRYPOINT ["/start-nginx.sh"]

Đã Cập Nhật Tập lệnh khởi động (start-nginx.sh)

bash Copy
#!/bin/bash

if [ "$DEBUG" = "True" ]; then
    CONFIG_PATH="/etc/nginx/dev/nginx.conf.template"
else
    CONFIG_PATH="/etc/nginx/prod/nginx.conf.template"
fi

envsubst '${CLIENT_MAX_BODY_SIZE} ${SERVER_IP}' < $CONFIG_PATH > /etc/nginx/nginx.conf
exec nginx -g 'daemon off;'

Ví dụ .env

.env Copy
DEBUG=True
CLIENT_MAX_BODY_SIZE=5
SERVER_IP=12.13.13.14

Kết Luận

Với thiết lập này, bạn có thể triển khai NGINX chỉ bằng một lệnh duy nhất:

bash Copy
docker compose up -d

Ứng dụng của bạn sẽ hoạt động mượt mà trong cả môi trường phát triển và sản xuất. Hy vọng bài viết đã mang đến cho bạn thông tin hữu ích để triển khai thành công ứng dụng của mình!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào