Назад | Перейти на главную страницу

Активный / пассивный обратный прокси с nginx

У меня есть два сервера Websocket, которые работают с Zookeeper & Curator как активный / пассивный, если один сервер выходит из строя, то второй бэкэнд оживает.

Я настроил его так:

upstream backend  {
  server 172.31.9.1:8080 max_fails=1 fail_timeout=5s;
  server 172.31.9.0:8080 max_fails=1 fail_timeout=5s;
}

server {
    listen 443;

    # host name to respond to
    server_name xxxxxx.compute.amazonaws.com;

    ssl on;
    ssl_certificate /etc/ssl/certs/wildcard.dev.xxxx.net.crt;
    ssl_certificate_key /etc/ssl/certs/wildcard.dev.xxxx.net.key;

    location / {
        # switch off logging
        access_log off;

        proxy_pass http://backend;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # WebSocket support (nginx 1.4)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Я ожидаю, что когда активный и пассивный серверы поменяются местами, Nginx потребуется 5 секунд, чтобы распознать сбой и перенаправить весь трафик на активный сервер.

На самом деле происходит то, что на распознавание активного сервера и переключение всего трафика требуется до 25 секунд.

В реальном сценарии я могу выдержать до 10 секунд простоя между перенаправлениями.

Что мне не хватает?

fail_timeout из документации NGINX:

Наборы:

  • время, в течение которого должно произойти указанное количество неудачных попыток связи с сервером, чтобы сервер считался недоступным;
  • и период времени, в течение которого сервер будет считаться недоступным.

Таким образом, установка 5 будет означать всего 10 секунд (5 таймаутов, 5 ожидания перед повторным контактом)

Кстати, по умолчанию для max_fails уже равно 1, поэтому вам не нужно его устанавливать.


Если вы действительно хотите активную / пассивную настройку, вы должны вместо этого использовать эту конфигурацию:

upstream backend  {
  server 172.31.9.1:8080;
  server 172.31.9.0:8080 backup;
}