@alenov
Программист

Можно ли настроить проксирование в nginx, анализируя метод заголовка: GET, POST...?

Стоит задача проксировать запросы к nginx, выполняя балансировку на основе заголовка.
Например, в REST API есть ресурсы, которые занимаются только отдачей контента. Их запросы проходят методом GET. Такие запросы можно отдавать на зеркала, которые read only.
И есть некоторые ресурсы, которые пишут в БД. Они принимают запросы методами POST, PUT, DELETE. Их нужно перенаправлять на мастер-сервер, где идёт запись в БД.
И есть засада: некоторые ресурсы обрабатывают сразу все методы. Т.е. по заголовку определяют, читать или писать.
Может ли nginx разрулить такую балансировку? Какие есть варианты?
Про HAProxy знаю, это крайний вариант: не хочется лишнего зверя в зоопарк тащить.
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
@alenov Автор вопроса
Программист
Кажется, что-то есть по этому вопросу.
Есть переменная $request_method, по ней можно выполнять балансировку. Пробую такую конфигурацию:

upstream master {
    server unix:/tmp/flask.sock;
}

upstream read_api {
    server api.service.ru;
}

map $request_method $upstream_location {
    GET         read_api;
    default     master;
}

server {
    listen 80;
    server_name service.ru;

    root /home/web/service;
    include uwsgi_params;
    include proxy_params;

    location / {
        if ($http_referer !~* ^($|http://) ){
             return 403;
        }
        uwsgi_pass unix:/tmp/flask.sock;
    }

    location /restapi/v1/ {
        if ($upstream_location = "master") {
            uwsgi_pass unix:/tmp/flask.sock;
        }
        if ($upstream_location != "master") {
            proxy_pass https://$upstream_location;
        }
    }
}

Работает. Возможно, есть другой путь. Если кто-то подскажет - буду признателен.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы