edge-api5 / nginx.conf
dothien1710's picture
Create nginx.conf
c6303c6 verified
Raw
History Blame Contribute Delete
5.13 kB
# Định nghĩa file lưu trữ Process ID (PID) của Nginx.
# Đặt ở /run/ để đảm bảo user thường (không phải root) có quyền ghi sau khi được cấp phép ở Dockerfile.
pid /run/nginx.pid;
events {
# Số lượng kết nối tối đa mà một worker process có thể xử lý cùng một lúc
worker_connections 1024;
}
http {
# Cấu hình bản đồ biến (map) để hỗ trợ kết nối WebSocket (Dành cho JupyterLab Terminal & Kernel real-time)
# Nếu Header 'Upgrade' từ client gửi lên có giá trị, Nginx sẽ tự động nâng cấp kết nối sang WebSocket.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# CẤU HÌNH DUNG LƯỢNG UPLOAD TỐI ĐA
# Mặc định Nginx chỉ cho phép 1M. Dòng này nâng lên 1000M (1GB) để bạn upload file âm thanh, video, model AI thoải mái.
client_max_body_size 10000M;
server {
# Cổng chính đón traffic từ môi trường Hugging Face Spaces
listen 7860;
# DNS nội bộ của Docker giúp Nginx phân giải các biến số proxy_pass động một cách chính xác
resolver 127.0.0.11 valid=30s;
# =======================================================================
# KHỐI 1: ĐIỀU HƯỚNG PORT ĐỘNG QUA URL (Ví dụ: /7861/, /8001/, /8002/...)
# =======================================================================
# Regex kiểm tra nếu đường dẫn bắt đầu bằng một chuỗi số (4-5 chữ số)
location ~ "^/(\d+)(.*)$" {
# Tách số port từ URL nhóm 1 gán vào biến $target_port (Ví dụ: 7861)
set $target_port $1;
# Tách phần đường dẫn còn lại nhóm 2 gán vào biến $remaining_url (Ví dụ: /assets/main.js)
set $remaining_url $2;
# Tiến hành chuyển tiếp request về ứng dụng chạy ngầm ở port tương ứng
proxy_pass http://127.0.0.1:$target_port$remaining_url$is_args$args;
# Giữ nguyên thông tin Header gốc của người dùng gửi lên
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ÉP CỨNG GIAO THỨC HTTPS: Sửa lỗi (blocked:mixed-content) trên trình duyệt.
# Ép các framework như FastAPI/Gradio tự động sinh link file tĩnh dạng https:// thay vì http://
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Scheme https;
# Cấu hình giúp ứng dụng web nhận diện được nó đang chạy dưới một đường dẫn phụ (Sub-path)
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /$target_port;
proxy_set_header X-Original-URI $request_uri;
# Cấu hình bắt buộc để giữ kết nối WebSocket không bị ngắt quãng giữa chừng
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 86400; # Giữ kết nối tối đa 1 ngày (tránh sập kernel/terminal)
}
# =======================================================================
# KHỐI 2: MẶC ĐỊNH (ĐƯỜNG DẪN GỐC /) - JUPYTERLAB & NƠI VÁ FILE LẠC ĐƯỜNG
# =======================================================================
location / {
# --- CƠ CHẾ VÁ LỖI CÁC FILE TĨNH BỊ HARDCODE NHẢY VỀ GỐC ---
# Nếu một file (như /theme.css) gọi trực tiếp về gốc nhưng Header 'Referer' chứng minh
# nguồn gọi của nó xuất phát từ một trang chứa port phụ (Ví dụ: từ trang /7861/)
if ($http_referer ~* /([0-9]+)/) {
set $referer_port $1;
# Nginx lẳng lặng "tóm" file đó gửi trả về đúng port phụ xử lý kèm theo đầy đủ URI ban đầu
proxy_pass http://127.0.0.1:$referer_port$request_uri;
}
# --- MẶC ĐỊNH: ĐẨY TOÀN BỘ TRAFFIC CÒN LẠI VỀ JUPYTERLAB ---
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Ép giao thức HTTPS cho JupyterLab để đồng bộ bảo mật với Hugging Face
proxy_set_header X-Forwarded-Proto https;
# Cấu hình WebSocket dành riêng cho JupyterLab Terminal và Kernel chạy code
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 86400;
}
}
}