Как настроить перенаправление на другой сервер в случае, если первый не работает?

Здравствуйте! У меня есть вопрос о настройке переключения между серверами. У нас есть сервер1, на котором развернут сайт с использованием nginx и php-fpm, и сервер2, на котором хранится бэкап того же сайта. 

Если сайт на сервере1 недоступен, как организовать автоматическое перенаправление на сайт на сервере2? 

ДоменноеИмя.ру уже настроено на сервер1. Нужно ли создавать отдельный домен для сервер2? 

Я интересуюсь готовым решением этой задачи. Я предполагаю, что это можно реализовать с помощью скрипта на php-fpm, который будет проверять доступность серверов (например, пинговать сервер1) и, в случае недоступности, осуществлять загрузку сайта с сервер2. Правильно ли я понимаю?
  • 24 сентября 2024 г. 10:33
Ответы на вопрос 3
Здравствуйте!

Для организации автоматического переключения между серверами, как вы описали, можно использовать несколько подходов. Давайте рассмотрим основные варианты, которые могут помочь вам реализовать это перенаправление.

### 1. Настройка DNS с высоким доступом

Один из простейших способов – использовать DNS с поддержкой управления с высокой доступностью. Некоторые DNS-провайдеры позволяют настроить "умное" разрешение имен, где они могут проверять работоспособность серверов и перенаправлять запросы на доступный сервер. Однако это может занять довольно много времени из-за кэша DNS, и это не всегда самый быстрый способ переключения.

### 2. Использование балансировщика нагрузки

Можно использовать внешний балансировщик нагрузки (например, Nginx или HAProxy), который будет проверять состояние серверов и направлять трафик к доступному. Это может быть локальный балансировщик, который устанавливается перед вашими серверами.

#### Пример настройки Nginx как балансировщика:

```nginx
http {
    upstream backend {
        server server1.com weight=1;
        server server2.com weight=1 backup;  # Это будет резервный сервер
    }

    server {
        listen 80;
        server_name ваш_домен.ру;

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

### 3. Скрипт на php

Если по каким-то причинам вам нужно использовать скрипт на PHP, который будет проверять доступность серверов, то это можно реализовать. Код может выглядеть примерно так:

```php
$server1 = 'http://server1.com';
$server2 = 'http://server2.com';

// Проверяем доступность server1
$response = @file_get_contents($server1);

if ($response === FALSE) {
    // Если server1 недоступен, подгружаем server2
    header("Location: $server2");
    exit();
}

// Если server1 доступен, отображаем его содержимое
echo $response;
```

### 4. Куда указывать DNS

Для вашей основной доменной зоны (ДоменноеИмя.ру) вы можете оставить ссылку на сервер1. Если сервер1 не доступен и вы осуществляете перенаправление через PHP или балансировщик, то отдельный домен для сервер2 не нужен. Однако, если вы планируете управлять трафиком в зависимости от доступности серверов, может быть удобно иметь отдельные домены или поддомены.

### Заключение

Таким образом, использование балансировщика нагрузки будет наиболее надежным и эффективным способом, способным обеспечивать автоматическое переключение между серверами. PHP-скрипт также может работать, но имейте в виду, что он не идеален по производительности по сравнению с специализированными решениями.
Ставим nginx  и настраиваем его как прокси. 

http {
    upstream backend {
        server primary_server.example.com;  # Основной сервер
        server backup_server.example.com backup;  # Резервный сервер
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            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_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 10s; # Тайм-аут ожидания ответа от сервера
        proxy_send_timeout 10s; # Тайм-аут на отправку данных к серверу
        proxy_next_upstream error timeout http_502 http_503 http_504; # Условия перехода на резервный сервер
        }
    }
}


1. upstream backend - блокирует определение пула серверов для балансировки нагрузки.
2. server primary_server.example.com - это основной сервер, на который Nginx будет отправлять запросы.
3. server backup_server.example.com backup - это резервный сервер, на который запросы будут направляться только тогда, когда основной сервер недоступен.
4. proxy_pass - используется для передачи запросов к пулу серверов.
Делается без скриптов с помощью апстримов nginx. Nginx, разумеется, должен стоять перед вашими серверами. 

Можно ещё через Cloudflare, например.
Похожие вопросы