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
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_SIZE
vàSERVER_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
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
#!/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
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
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
#!/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
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
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