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

NGINX: как проксировать http (s) трафик на один сервер и ws (s) трафик на другой?

Я новичок в nginx и том, как он обрабатывает locatoins, и надеялся получить помощь по проблеме, с которой я столкнулся:

На том же сервере у меня есть веб-сервер Apache и сервер веб-сокетов. Apache работает на порту 8080, а сервер websocket работает на 9090. Я хотел бы поставить прокси nginx впереди, чтобы трафик http / https передавался через прокси на apache, а трафик ws / wss проксировался на сервер websocket.

У меня такая конфигурация:

location /ws* {
    proxy_pass ws://127.0.0.1:9090;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
}

Это работает нормально, но проблема, с которой я сталкиваюсь, заключается в том, что все запросы ws * также перенаправляются на сервер apache, в то время как я хочу, чтобы они перенаправлялись только на сервер ws. Я читал, что nginx берет только первое совпадающее местоположение, но в моем случае это кажется неправильным.

Итак, вопрос в том, как я могу проксировать http (s) трафик ТОЛЬКО на apache и ws (s) трафик ТОЛЬКО на сервер веб-сокетов?

Ваш синтаксис местоположения не похож на то, что вы пытаетесь сделать.

Если вы пытаетесь выполнить регулярное выражение с URL-адресом местоположения, правильный синтаксис:

location ~ /ws.* {

Если вы пытаетесь делать все в каталоге ws, у вас должно быть:

location /ws/ {

Вы можете просмотреть документацию для получения дополнительной информации о местоположении. http://nginx.org/en/docs/http/ngx_http_core_module.html#location