Как настроить Nginx для одновременной работы двух веб-серверов?

Как настроить Nginx, чтобы обеспечить одновременное подключение к серверам вебсокетов и авторизации на домене syqq.ru, если при текущей конфигурации подключение удается только к серверу, определенному первым в файле nginx.conf? Оба сервера работают исправно на своих портах.
  • 5 декабря 2023 г. 16:20
Ответы на вопрос 3
Если вы хотите настроить Nginx таким образом, чтобы один домен (syqq.ru в вашем случае) мог обрабатывать обычные HTTP запросы и вебсокет соединения, вам нужно добавить конфигурации для каждого типа соединения.

Вот как может выглядеть базовая конфигурация server-блока в nginx для вашего сценария:

```nginx
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream websocket_backend {
    server 127.0.0.1:PORT_WEBSOCKET;
}

upstream authorization_backend {
    server 127.0.0.1:PORT_AUTHORIZATION;
}

server {
    listen       80;
    server_name  syqq.ru;

    # Обычные HTTP запросы
    location / {
        proxy_pass http://authorization_backend;
        
        # Стандартные параметры проксирования для установления корректного соединения
        proxy_set_header Host $http_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;
    }

    # Путь для вебсокет соединений
    location /ws {
        proxy_pass http://websocket_backend;
        proxy_http_version 1.1;

        # Устанавливаем заголовки для обработки вебсокетов
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # Стандартные параметры проксирования для установления корректного соединения
        proxy_set_header Host $http_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;
    }
}
```

Важные моменты в этой конфигурации:

1. `map` директива используется для определения значения переменной `$connection_upgrade` на основе заголовка `Upgrade` из клиентского запроса, который используется для вебсокетов.

2. `upstream` директивы определяют группы серверов (ваш локальный сервер авторизации и вебсокет сервер). Вам потребуется заменить `PORT_WEBSOCKET` и `PORT_AUTHORIZATION` на реальные порты, где работают ваши серверы.

3. В `location /ws` блоке настраивается проксирование для вебсокет соединений. Этот блок указывает на то, что все запросы на путь `/ws` должны быть перенаправлены на вебсокет сервер. Заголовки `Upgrade` и `Connection` настроены для поддержки вебсокет протокола.

4. В остальном `location /` блоке настраивается проксирование для всех остальных HTTP запросов, которые будут направлены на сервер авторизации.

Не забудьте заменить `PORT_WEBSOCKET` и `PORT_AUTHORIZATION` на собственные порты, а также проверьте, что пути (`/` для авторизации и `/ws` для вебсокетов) не конфликтуют между собой. После применения этих изменений не забудьте перезагрузить Nginx:

```bash
sudo systemctl reload nginx
```

или

```bash
sudo service nginx reload
```

Эти изменения позволят одновременно работать с серверами авторизации и вебсокетов на том же домене с использованием Nginx в качестве прокси-сервера.
Если есть совпадениеserver_nameв одном из серверных блоков, их очерёдность не важна.На первый взгляд, выглядит как ситуация с подключением по IP или к домену, для которого нет серверного блока.
sovok2, Если там реально websocket то nginx рекомендует делать через upstreamhttps://www.nginx.com/blog/websocket-nginx/Если сайт находится на том же сервере, то почему бы не сделать вот так, зачем использовать sub домены? У тебя сертификат wildcard ?http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
 
    upstream websocket {
        server 0.0.0.0:8831;
    }
}

server {  
   listen 443 ssl;
   ssl_certificate /etc/ssl/nginx/syn-q.ru.crt;
   ssl_certificate_key /etc/ssl/nginx/syn-q.ru.key;
   server_name syqq.ru;
  
   location /websocket { 
     proxy_pass         http://websocket;
     proxy_http_version 1.1;
     proxy_set_header   Upgrade $http_upgrade;
     proxy_set_header   Connection "upgrade";
     proxy_set_header   Host $host;
   }
 }
 
 server {
  listen 443 ssl;
  ssl_certificate /etc/ssl/nginx/syn-q.ru.crt;
         ssl_certificate_key /etc/ssl/nginx/syn-q.ru.key;
         server_name syqq.ru;
         
         location /auth { 
     proxy_set_header        X-Real-IP        $remote_addr; 
     proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for; 
     proxy_set_header        Host $host; 
    
     proxy_pass         http://localhost:3000; 
    }
 }
Похожие вопросы