meteor / sockjs 및 websocket에 대한 Apache 프록시를 설정하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/22002744

문제

유성 앱 및 Apache 및 Meteor가 두 개의 별도의 컴퓨터에있는 아파치 프록시가 있습니다. Apache가 많은 실제 웹 사이트를 봉사 해야하는 방식이 필요하며 제한된 자원으로 인해이 컴퓨터에 유성 앱을 설치하는 것이 좋습니다.

그러나 외부에서 프록시를 통해 연결하려고하면 웹베이터 핸드 셰이크가 응답 코드 400 "에서만 업그레이드 할 수 있습니다". LAN 내에서 Meteor 기계에 직접 연결할 때 모든 것이 잘 작동합니다. WebSocket이 실패 할 때 Sockjs / Meteor가 XHR로 돌아갑니다. 그러나 불행히도 이것은 문제의 앱에서 몇 가지 버그를 가져옵니다. 그래서 대부분의 경우에 일하기 위해 웹 소켓이 필요합니다.

여기에 언급 한 패치와 함께 Apache 설치를 패치했습니다. https://stackoverflow.com/a/16998664 그게 잘 어울리지 만 아무 것도 바뀌지 않았지만 ...

내 아파치 프록시 지시문은 현재 다음과 같습니다.

ProxyRequests Off
ProxyPreserveHost On
ModPagespeed Off
<proxy>
Order deny,allow
Allow from all
</proxy>
ProxyPass / http://10.0.2.6:3000/
ProxyPassReverse / http://10.0.2.6:3000/
.

그리고 문제가 무엇인지 알고 있습니다. Apache 프록시는 헤더와 함께 엉망이됩니다. 내 컴퓨터를 떠나는 문제의 패킷의 원래 요청 헤더는 다음과 같습니다.

GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
.

이처럼 패킷이 Apache 프록시에서 전달되는 동안 다음과 같이 :

GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
X-Forwarded-For: 24.xxx.xxx.xxx
X-Forwarded-Host: example.com
X-Forwarded-Server: example.com
Connection: Keep-Alive
.

그래서 "업그레이드"가 제거되고 "연결"이 변경되었으므로 WebSocket 핸드 셰이크가 실패합니다. 이제 RequestHeader 지시문을 사용하여 "WebSocket"을 항상 "업그레이드"할 수 있습니다. 그러나 이것은 옳지 않아서 다른 문제를 일으킬 것이라고 생각하지 않으므로이 문제에 대한 실제 해결책이 있는지 궁금해하고 있었습니까? 또는 https://stackoverflow.com/a/16998664 의 패치는 뭔가를 해결해야하며 끝내야합니다. 그것?

nginx로 읽은 읽기 전환 에서이 설정을 쉽게 할 수 있습니다. 나는 이것을 고려할 것입니다. 그러나 가능한 한 nginx가 다른 일을 더 복잡하게 만들고 많은 시간을 비용으로하는 것처럼 아파치 로이 작업을하고 싶습니다.

도움이 되었습니까?

해결책

Apache 및 Apache 뒤에있는 SockJS 앱을 사용합니다.Apache는 WebSocket 프록시를 자동으로 수행하고 있지만, 그렇지 않으면 XHR에 대한 Fallback을 WS로 다시 작성해야합니다.그러나 연결이 WebSocket 핸드 셰이크 인 경우에만.다음을 추가하면 문제가 해결됩니다.

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
.

다른 팁

이 답변은 FATIH의 대답을 기반으로합니다."Keep-Alive, Upgrade"와 같이 "업그레이드"가외의 연결 요청 헤더를 보내는 브라우저에서 그의 솔루션이 실패합니다.이것은 Firefox 42를 가진 나에게있는 경우였습니다.

Firefox 문제를 해결하려면 다음과 같이 Apache Rewritecond를 변경하십시오.

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
.

( ^ $ 업그레이드 $ 업그레이드)

나는 이것을 fatih의 대답에 대한 의견으로두고 싶었지만, 필요한 평판이 부족합니다.

여러 답변을 읽은 후 유성 포럼에 게시하고 많은 재판은 저를 위해 일한 전체 enchilada입니다.다른 답변은 다소 불완전했거나 적어도 저에게 일하지 않았습니다.

나는해야했다 :

sudo a2enmod proxy_wstunnel 
.

또한 ProxyPass와 ProxyPassRevery를 추가하고 다른 $에서 $ 업그레이드를 위해 $ 업그레이드 $를 변경해야했습니다.

<VirtualHost *:80>
    ServerName  some-domain.com

    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
    RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]

    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

</VirtualHost>
.

다음 아파치를 다시 시작하십시오.

콘솔에서 확인하면 지금 오류가없고 xhr 요청이 없습니다.그래서 나는 그것이 올바르게 작동한다고 가정한다

Apache 지침을 통해 직접 회신을 제공 할 수 있었지만 Nginx를 언급 했으므로 사실은 구성하기가 어렵습니다. 실제로 Nginx를 사용하는 대안으로 체중을 측정하고 싶습니다.모든 복잡성에서 당신을 보호합니다.

https://github.com/pholusion/승객 / 위키 / 폰 (Phusion-Passenger) : -meteor-튜토리얼 Phusion Partsenger 를 설정하는 단계를 통해 걷습니다.NGINX의 유무에 관계없이 또는 서버의 모든 코어를 활용하도록 확장 할 수있는 다중 인스턴스 생산 유역 배포에 대해서는 NGINX를 내부적으로 사용합니다.

그것은 다음과 같습니다 :

$ cd meteor-app-directory
$ mkdir public tmp
$ passenger start
.

fatih-arslan"> Derwiwie 의 개정안은 매력처럼 작동했습니다. 내가 사용해야했던 한 가지는 WS 대신 wss 대신 wss

RewriteEngine on  
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]  
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]  
RewriteRule .* wss://localhost:3000%{REQUEST_URI} [P]
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top