Бывает, что нужно спрятать основной 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 в Flask на резервный адрес. Клиенты даже не заметили.
Примеры задач, где работает идеально:
| Задача | Решается ретранслятором |
|---|---|
| Скрытие приватного API | ✅ Да |
| Кэширование на уровне запроса | ✅ Да |
| Добавление авторизации | ✅ Да |
| Балансировка нагрузки | ⚠️ Только через Nginx |
| Защита от DDoS | ❌ Лучше использовать Cloudflare |
Что можно улучшить
- Подключить HTTPS через Let’s Encrypt — просто и бесплатно.
- Добавить Redis для кэша и ограничения частоты.
- Вынести конфиги в .env-файл — не жёстко хардкодить.