Как использовать VPS как API-ретранслятор (Flask + Nginx)

ГлавнаяКак использовать VPS как API-ретранслятор (Flask + Nginx)

Содержание

Бывает, что нужно спрятать основной 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-файл — не жёстко хардкодить.

Попробуйте VPS с запасом

Оплачиваете год — получаете +1 месяц в подарок.

Месяц в подарок
COPIED
NEWCOMM COPIED