Skip to content

Instantly share code, notes, and snippets.

@DELAGREEN
Created April 20, 2025 19:14
Show Gist options
  • Select an option

  • Save DELAGREEN/51dee5ed86e6ae6dd13c3d0fffbac368 to your computer and use it in GitHub Desktop.

Select an option

Save DELAGREEN/51dee5ed86e6ae6dd13c3d0fffbac368 to your computer and use it in GitHub Desktop.
fastapi in nginx
Как запустить написанный web сервер на fast api на nginx и вообще необходимо ли это
profile
Qwen2.5-Max
Для запуска веб-сервера на FastAPI с использованием Nginx важно понимать, зачем это делается и как это работает. Давайте разберем вопрос пошагово.
1. Зачем использовать Nginx с FastAPI?
FastAPI — это современный фреймворк для создания API, который по умолчанию использует ASGI-сервер (например, Uvicorn или Hypercorn). Однако:
FastAPI не предназначен для работы напрямую с внешними запросами :
ASGI-серверы, такие как Uvicorn, оптимизированы для обработки бизнес-логики, но они не предназначены для работы с высокой нагрузкой, SSL/TLS, балансировкой трафика и другими задачами.
Nginx решает эти задачи :
Nginx выступает как обратный прокси, принимая внешние HTTP/HTTPS-запросы и перенаправляя их на ваш FastAPI-приложение.
Он также может:
Обрабатывать статические файлы (например, изображения, CSS, JavaScript).
Управлять SSL/TLS-сертификатами (например, через Let's Encrypt).
Балансировать нагрузку между несколькими экземплярами вашего приложения.
Защищать приложение от DDoS-атак и других угроз.
Таким образом, использование Nginx с FastAPI рекомендуется, особенно если вы планируете развернуть приложение в production-среде.
2. Как запустить FastAPI с Nginx?
Шаг 1: Настройка FastAPI
Убедитесь, что ваше FastAPI-приложение готово к работе. Например, создайте файл main.py:
python
Копировать
1
2
3
4
5
6
7
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
Запустите приложение с помощью Uvicorn:
bash
Копировать
1
uvicorn main:app --host 0.0.0.0 --port 8000
Приложение будет доступно на http://localhost:8000.
Шаг 2: Установка и настройка Nginx
Установите Nginx :
bash
Копировать
1
2
sudo apt update
sudo apt install nginx
Настройте конфигурацию Nginx :
Создайте новый конфигурационный файл для вашего приложения, например, /etc/nginx/sites-available/fastapi:
nginx
Копировать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
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 /static/ {
root /path/to/your/static/files;
}
}
proxy_pass указывает, куда Nginx должен перенаправлять запросы (в данном случае на ваш FastAPI-сервер).
server_name — доменное имя вашего сервера. Если домена нет, можно использовать IP-адрес.
Активируйте конфигурацию :
Создайте символическую ссылку на активную конфигурацию:
bash
Копировать
1
sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/
Проверьте конфигурацию и перезапустите Nginx :
bash
Копировать
1
2
sudo nginx -t
sudo systemctl restart nginx
Шаг 3: Настройка HTTPS (опционально)
Для безопасного подключения рекомендуется настроить SSL/TLS с помощью Certbot и Let's Encrypt:
Установите Certbot:
bash
Копировать
1
sudo apt install certbot python3-certbot-nginx
Получите SSL-сертификат:
bash
Копировать
1
sudo certbot --nginx -d your_domain.com
Certbot автоматически настроит Nginx для использования HTTPS.
3. Необходимость использования Nginx
Если ваш проект небольшой и используется только для тестирования или разработки, то Nginx может быть избыточным. В таких случаях можно запустить FastAPI напрямую через Uvicorn:
bash
Копировать
1
uvicorn main:app --host 0.0.0.0 --port 80
Однако для production-среды использование Nginx настоятельно рекомендуется, так как оно обеспечивает:
Безопасность (SSL/TLS, защита от атак).
Производительность (балансировка нагрузки, кэширование).
Гибкость (обработка статических файлов, маршрутизация).
4. Итог
Для production-среды: используйте Nginx как обратный прокси перед FastAPI.
Для разработки: достаточно запустить FastAPI напрямую через Uvicorn.
Если у вас есть дополнительные вопросы или специфические требования (например, Docker, Kubernetes), уточните, и я помогу адаптировать решение под ваш случай.
А как мне поднимать несколько экземпляров моего приложения развернутых в докер контейнерах
profile
Qwen2.5-Max
Для запуска нескольких экземпляров вашего FastAPI-приложения в Docker-контейнерах и их интеграции с Nginx можно использовать несколько подходов. Рассмотрим пошагово, как это сделать.
1. Почему нужны несколько экземпляров?
Запуск нескольких экземпляров приложения позволяет:
Увеличить производительность за счет распределения нагрузки.
Обеспечить отказоустойчивость (если один экземпляр упадет, другие продолжат работать).
Эффективно использовать многоядерные процессоры (FastAPI работает асинхронно, но каждый контейнер может быть привязан к отдельному ядру).
2. Подходы к организации
А. Использование Docker Compose
Docker Compose — это простой способ описать и запустить несколько контейнеров. В нашем случае мы будем запускать несколько экземпляров FastAPI и один Nginx для балансировки трафика.
Б. Использование оркестратора (например, Kubernetes)
Если вам нужно масштабировать приложение до большого количества экземпляров или управлять сложной инфраструктурой, лучше использовать Kubernetes. Однако это более сложный вариант, и его стоит рассматривать только для крупных проектов.
В данном ответе мы сосредоточимся на Docker Compose, так как это проще и подходит для большинства случаев.
3. Развертывание с Docker Compose
Шаг 1: Создайте Dockerfile для FastAPI
Создайте файл Dockerfile в корне вашего проекта:
dockerfile
Копировать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Используем официальный образ Python
FROM python:3.9-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем зависимости
COPY requirements.txt .
# Устанавливаем зависимости
RUN pip install --no-cache-dir -r requirements.txt
# Копируем код приложения
COPY . .
# Команда для запуска приложения
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Убедитесь, что у вас есть файл requirements.txt с зависимостями, например:
Копировать
1
2
fastapi
uvicorn
Шаг 2: Создайте docker-compose.yml
Создайте файл docker-compose.yml в корне проекта:
yaml
Копировать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3.8'
services:
app1:
build: .
container_name: fastapi_app1
ports:
- "8001:8000"
restart: always
app2:
build: .
container_name: fastapi_app2
ports:
- "8002:8000"
restart: always
nginx:
image: nginx:latest
container_name: nginx_proxy
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app1
- app2
restart: always
app1 и app2 — два экземпляра вашего FastAPI-приложения.
nginx — контейнер с Nginx, который будет балансировать нагрузку между app1 и app2.
Шаг 3: Настройте Nginx
Создайте файл nginx.conf в корне проекта:
nginx
Копировать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream fastapi_backend {
server app1:8000;
server app2:8000;
}
server {
listen 80;
location / {
proxy_pass http://fastapi_backend;
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;
}
}
}
upstream fastapi_backend определяет группу серверов, которые будут обрабатывать запросы.
proxy_pass перенаправляет запросы на эту группу.
Шаг 4: Запустите контейнеры
Запустите все контейнеры с помощью Docker Compose:
bash
Копировать
1
docker-compose up --build
Теперь:
FastAPI-приложение доступно на портах 8001 и 8002.
Nginx принимает запросы на порту 80 и балансирует их между двумя экземплярами.
4. Масштабирование через Docker Compose
Если вам нужно больше экземпляров, вы можете использовать команду scale:
bash
Копировать
1
docker-compose up --scale app=3
Это создаст три экземпляра вашего приложения (app1, app2, app3). Однако учтите, что вам нужно будет настроить уникальные порты для каждого экземпляра, если вы не используете внутреннюю сеть Docker.
5. Альтернатива: Использование Docker Swarm
Если вам нужно горизонтальное масштабирование, можно использовать Docker Swarm. Например:
bash
Копировать
1
2
docker swarm init
docker stack deploy -c docker-compose.yml myapp
Docker Swarm автоматически управляет репликами ваших сервисов.
6. Проверка работы
Чтобы убедиться, что Nginx правильно балансирует нагрузку, вы можете добавить логирование в ваше FastAPI-приложение:
python
Копировать
1
2
3
4
5
6
7
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/")
def read_root(request: Request):
return {"message": "Hello from server", "host": request.client.host}
Теперь, отправляя запросы на http://localhost, вы увидите, что они распределяются между разными экземплярами.
7. Итог
Для небольших проектов используйте Docker Compose с несколькими экземплярами FastAPI и Nginx как обратный прокси.
Для больших проектов рассмотрите использование Docker Swarm или Kubernetes.
Убедитесь, что ваша конфигурация Nginx правильно настроена для балансировки нагрузки.
Если у вас есть дополнительные вопросы или специфические требования (например, мониторинг, CI/CD), уточните, и я помогу адаптировать решение.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment