Обратный прокси-сервер Nginx: попробуйте несколько восходящих серверов параллельно и верните первый успешный ответ
Я настроил nginx как обратный прокси-сервер для загрузки программных артефактов (например, файлов JAR) и хочу ускорить его, параллельно проксируя каждый запрос на несколько вышестоящих серверов.
В настоящее время работает следующее: с nginx, работающим на localhost:8080, я прошу localhost:8080/com/foo/bar.jar
, nginx последовательно проверяет наличие файла com/foo/bar.jar
на каждом хосте в предварительно настроенном списке (например, repo1.org/com/foo/bar.jar
, repo2.org/com/foo/bar.jar
и т. д.) и возвращает первый соответствующий артефакт (т.е. первый, вернувший статус 200).
Конфигурация ниже делает эту работу для репозиториев на maven.org и osgeo.org:
events {}
http {
server {
listen 8000;
location / {
proxy_pass https://repo1.maven.org/maven2/;
}
}
server {
listen 8001;
location / {
proxy_pass https://repo.osgeo.org/repository/release/;
}
}
upstream repositories {
server localhost:8000;
server localhost:8001;
}
server {
location / {
proxy_next_upstream error timeout http_404;
proxy_pass http://repositories;
}
}
}
Чтобы уменьшить задержку, я бы хотел, чтобы nginx выполнял запросы параллельно, возвращал первый, который дает 200, а в противном случае возвращал код ошибки 404.
Я не уверен, какие директивы (если есть) могут включить такое поведение. Я ценю любые советы.
1 ответ
Согласно документации nginx, можно использовать nginx plus. Как указано в документации nginx plus, метод балансировки нагрузки, который вы ищете, - это метод наименьшего времени.
Если вы используете nginx по умолчанию, вы можете использовать документацию nginx
tldr;
- Конфигурация балансировки нагрузки по умолчанию (Round Robin)
- Балансировка нагрузки с наименьшим количеством подключений
- Взвешенная балансировка нагрузки
- Сохранение сеанса