Бывает, что нужно спрятать основной API, разнести нагрузку или просто построить надёжный промежуточный слой между клиентом и основным сервисом. В одном из таких случаев я подняла VPS как API-ретранслятор с использованием Flask и Nginx. Расскажу, как я это делала, на реальном примере. Писать буду, как всегда, от души и по-человечески — без заумностей, но с практикой.
Когда и зачем нужен API-ретранслятор
Я впервые начала использовать VPS как API-прокси, когда у клиента был закрытый внутренний API, а мобильное приложение требовало открытой точки входа. Основные задачи были:
- защитить основной API от перегрузки;
- добавить промежуточную авторизацию;
- кэшировать часть запросов;
- логировать трафик.
Проще всего в таких случаях использовать связку Flask + Nginx. Flask — для обработки логики, авторизации, ограничения доступа и пр., Nginx — для балансировки и отдачи статики, если надо.
Шаг 1: Готовим VPS
Я взяла обычный VPS на Ubuntu 22.04, 1 vCPU, 1 ГБ RAM — больше не надо. Убедитесь, что установлен Python:
python3 --version
Если нет — ставим:
sudo apt update sudo apt install python3 python3-pip
Шаг 2: Пишем Flask-приложение
Создаём минимальный прокси-сервер на Flask. Пусть он просто принимает запросы и пересылает их дальше:
from flask import Flask, request, jsonify import requests app = Flask(__name__) UPSTREAM_API = 'https://api.example.com' @app.route('/api/<path:path>', methods=['GET', 'POST']) def proxy(path): headers = dict(request.headers) if request.method == 'GET': r = requests.get(f"{UPSTREAM_API}/{path}", headers=headers, params=request.args) else: r = requests.post(f"{UPSTREAM_API}/{path}", headers=headers, data=request.data) return (r.content, r.status_code, r.headers.items()) if __name__ == '__main__': app.run(host='127.0.0.1', port=5000)
Сохраняем как
app.py
python3 app.py
Можно протестировать запросом:
curl http://localhost:5000/api/ping
Шаг 3: Настройка Gunicorn + systemd
Чтобы Flask работал как сервис, поднимаем его через Gunicorn:
pip3 install gunicorn gunicorn -w 2 -b 127.0.0.1:5000 app:app
Теперь добавим systemd-сервис:
sudo nano /etc/systemd/system/flask-proxy.service
[Unit] Description=Flask Proxy Service After=network.target [Service] User=root WorkingDirectory=/root ExecStart=/usr/bin/gunicorn -w 2 -b 127.0.0.1:5000 app:app Restart=always [Install] WantedBy=multi-user.target
Активируем:
sudo systemctl daemon-reexec sudo systemctl enable flask-proxy sudo systemctl start flask-proxy
Проверяем:
sudo systemctl status flask-proxy
Шаг 4: Настройка Nginx
Теперь всё направим через Nginx. Устанавливаем:
sudo apt install nginx
Добавляем конфиг:
sudo nano /etc/nginx/sites-available/flask-proxy
server { listen 80; server_name your.domain.com; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
Активируем:
sudo ln -s /etc/nginx/sites-available/flask-proxy /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
Как я использую эту схему
Я запускала такую прокси-связку для:
- ретрансляции запросов к Telegram API, скрывая токен;
- добавления кэширования на уровне Flask + Redis;
- ограничения скорости и логирования через custom middleware.
Однажды это реально спасло прод — основной API упал, а я быстро подменила
UPSTREAM_API
Примеры задач, где работает идеально:
Задача | Решается ретранслятором |
---|---|
Скрытие приватного API | ✅ Да |
Кэширование на уровне запроса | ✅ Да |
Добавление авторизации | ✅ Да |
Балансировка нагрузки | ⚠️ Только через Nginx |
Защита от DDoS | ❌ Лучше использовать Cloudflare |
Что можно улучшить
- Подключить HTTPS через Let’s Encrypt — просто и бесплатно.
- Добавить Redis для кэша и ограничения частоты.
- Вынести конфиги в .env-файл — не жёстко хардкодить.
Попробуйте VPS с запасом
Оплачиваете год — получаете +1 месяц в подарок.