prokoptsev
@prokoptsev

Как настроить Nginx для внутреннего перенаправления контента?

Доброго времени суток.
Есть 2 проекта на django. Оба проекта - api для мобильного приложения. Первый проект - первая версия api, второй вторая. Вторая версия находится на стадии разработки.
Для тестирования некоторого функционала заготовлены заглушки, в виде json-файлов.

Нужно реализовать такую схему запросов:
При обращении по url второй версии api нужно проверить готов ли данный функционал. Если оно отвечает 404, то проверить есть ли что-то в заглушках, если и там нет, то попробовать запросить у первой версии api. Если первая версия тоже вернет 404 то только тогда вернуть ошибку клиенту.

Я примерно представляю себе это так:
upstream api_v1 {
  server unix:///tmp/api_v1_gunicorn.sock fail_timeout=0;
}

upstream api_v2 {
  server unix:///tmp/api_v2_gunicorn.sock fail_timeout=0;
}

server {
  listen 80;

#### API V2
  location /api/v2/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://api_v2;
    error_page 404 = @mock_api_v2;
  }

#### MOCK API V2
  location @mock_api_v2 {

    index index.json;
    root /path/to/dir/with/mock/files/;
    error_page 404 = @backend;
  }

#### REWRITE TO V1
  location @backend {
    rewrite           /api/v2/(.+)      /api/v1/$1 break;

    proxy_set_header  Host              $host;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;

    proxy_pass        http://api_v2;
    proxy_redirect    off;
  }

#### API V1
  location / {
    include proxy_params;
    proxy_pass http://api_v2;
  }
}


Но почему-то ничего из этого ничего не выходит.
Когда я делаю такой запрос:
GET /api/v2/old_method/
То вместо того что бы отдать мне то что лежит по адресу /api/v1/old_method/ сразу возвращается 404.

Если кто-то знает как почему так происходит, или что я делаю не так, или как это сделать по другому - посоветуйте.
  • Вопрос задан
  • 3380 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Micher
location @api_v1 {
  include proxy_params;
  proxy_pass http://api_v1;
}

location @api_v2 {
  include proxy_params;
  proxy_pass http://api_v2;
}

location @mock_api_v2 {
  index index.json;
  root /path/to/dir/with/mock/files/;
}

location /api/v2/ {
  try_files @api_v2 @mock_api_v2 @api_v1;
}
Ответ написан
Комментировать
Lynn
@Lynn
nginx, js, css
#### API V2
  location /api/v2/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://api_v2;
    proxy_intercept_errors on; # <=====================
    error_page 404 = @mock_api_v2;
  }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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