HTTP и веб-сокет на одном порту и домене за обратным прокси-сервером

HTTP и веб-сокет на одном порту и домене за обратным прокси-сервером

Я хотел попробовать Node-Red и установил его на своем сервере Ubuntu. Этот сервер запускает обратный прокси Apache, но я не могу заставить его работать правильно. Если я создаю виртуальный хост для HTTP-соединения, я могу получить доступ к своему интерфейсу Node-Red, но он не показывает мне никакой активности, такой как онлайн-серверы MQTT или отладочные сообщения. После некоторого гугления я выяснил, что это потому, что он также использует веб-сокеты, и их тоже нужно пропускать.

И вот головоломка, которую мне не удалось решить: я могу пройти через HTTP или веб-сокеты, но не одновременно. Если я пройду через HTTP, загружу веб-интерфейс Node-Red, а затем изменю настройки обратного прокси на WS passthrough, я получу полную функциональность. Однако я не могу перезагрузить или переподключиться к странице Node-Red, потому что HTTP passthrough был удален.

Как мне добавить оба на одном домене и порту? или это вообще невозможно? Вот часть моей конфигурации apache2:

<VirtualHost *:80>
ServerName nr.domain.com
Redirect permanent / https://nr.domain.com/
RewriteEngine on
RewriteCond %{SERVER_NAME} =nr.domain.com
RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
ServerName nr.domain.com
SSLEngine On
<Location />
ProxyPass http://localhost:1880/
ProxyPassReverse http://localhost:1880/
</Location>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Если я добавлю местоположение с ProxyPass ws:// и т. д., то живая информация и отладчик будут работать, но веб-интерфейс больше не будет доступен. Как мне изменить мой файл конфигурации apache таким образом, чтобы оба работали?

решение1

Похоже, вам также необходимо проксировать соединения через веб-сокеты, основываясь наэтот предыдущий ответ.

Попробуйте что-то подобное для своей конфигурации.

<VirtualHost *:80>
  ServerName nr.domain.com
  Redirect permanent / https://nr.domain.com/
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =nr.domain.com
  RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On
  <Location />
    ProxyPass http://localhost:1880/
    ProxyPassReverse http://localhost:1880/
  </Location>

  # New web socket proxy
  <Location /comms>       
    ProxyPass ws://localhost:1880/comms
    ProxyPassReverse ws://localhost:1880/comms
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

решение2

Чтобы включить трафик HTTP и WebSocket для Node-Red через ваш обратный прокси Apache, вам нужно внести некоторые изменения в конфигурацию Apache. Вот что вы можете попробовать:

  1. Включите проксирование WebSocket, добавив следующие строки в раздел VirtualHost для Node-Red:
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

Это указывает Apache на необходимость проксирования всего трафика WebSocket на Node-Red.

  1. Измените существующие директивы ProxyPass и ProxyPassReverse, чтобы исключить конечную точку WebSocket. Добавьте следующую строку после тега из предыдущего шага:
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

Это указывает Apache на необходимость проксирования всего HTTP-трафика в Node-Red, за исключением конечной точки WebSocket.

Измененный раздел VirtualHost должен выглядеть следующим образом:

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On

  <Location /ws>
    ProxyPass ws://localhost:1880/ws
    ProxyPassReverse ws://localhost:1880/ws
  </Location>

  <Location />
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"
    ProxyPassReverse http://localhost:1880/
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Перезапустите Apache, чтобы изменения вступили в силу:

sudo systemctl restart apache2

Благодаря этим изменениям трафик HTTP и WebSocket должен корректно передаваться в Node-Red через обратный прокси-сервер Apache.

Связанный контент