역방향 프록시 뒤의 동일한 포트 및 도메인에 있는 HTTP 및 웹소켓

역방향 프록시 뒤의 동일한 포트 및 도메인에 있는 HTTP 및 웹소켓

Node-Red를 사용해 보고 싶었고 Ubuntu 서버에 설치했습니다. 이 서버는 Apache 역방향 프록시를 실행하지만 제대로 작동하도록 할 수 없습니다. HTTP 연결을 위한 가상 호스트를 생성하면 Node-Red 인터페이스에 제대로 액세스할 수 있지만 온라인 MQTT 서버나 디버그 메시지와 같은 활동은 표시되지 않습니다. 인터넷 검색을 한 후에 이것이 웹 소켓도 사용하고 그것도 통과해야 하기 때문이라는 것을 알았습니다.

그리고 여기에 제가 풀지 못한 퍼즐이 있습니다. HTTP나 웹소켓을 통과할 수 있지만 동시에 통과할 수는 없습니다. HTTP를 통과하고 Node-Red 웹 인터페이스를 로드한 다음 역방향 프록시 설정을 WS 패스스루로 변경하면 모든 기능을 사용할 수 있습니다. 그러나 HTTP 패스스루가 제거되었기 때문에 Node-Red 페이지를 다시 로드하거나 다시 연결할 수 없습니다.

동일한 도메인과 포트에 둘 다 추가하려면 어떻게 해야 합니까? 아니면 전혀 불가능합니까? 내 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

Apache 역방향 프록시를 통해 Node-Red에 대해 HTTP 및 WebSocket 트래픽을 모두 활성화하려면 Apache 구성을 일부 수정해야 합니다. 시도해 볼 수 있는 방법은 다음과 같습니다.

  1. Node-Red의 VirtualHost 섹션에 다음 줄을 추가하여 WebSocket 프록시를 활성화합니다.
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

이는 Apache가 모든 WebSocket 트래픽을 Node-Red로 프록시하도록 지시합니다.

  1. WebSocket 엔드포인트를 제외하도록 기존 ProxyPass 및 ProxyPassReverse 지시문을 수정합니다. 이전 단계의 태그 뒤에 다음 줄을 추가합니다.
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

이는 Apache가 WebSocket 엔드포인트를 제외하고 모든 HTTP 트래픽을 Node-Red로 프록시하도록 지시합니다.

수정된 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 트래픽은 모두 Apache 역방향 프록시를 통해 Node-Red로 올바르게 프록시되어야 합니다.

관련 정보