Как использовать 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-файл — не жёстко хардкодить.