Socket.IO 1.0에 대한 Apache 2.4 mod_proxy_wstunnel 구성


15

mod_proxy_wstunnel을 사용하여 socket.io의 websocket 연결을 node.js 웹 소켓 서버에 프록시 처리하도록 Apache 2.4를 구성하려고합니다. 우리는 socket.io 0.9에서 잘 작동했지만 1.0 릴리스에서는 소켓 끝점을 쿼리 매개 변수로 변경했으며 이제 올바른 프록시 지침으로 아파치를 구성하는 데 문제가 있습니다.

에 대한 모든 요청 /socket.io/?EIO=N&transport=websocket(여기서 N은 임의의 숫자, 일반적으로 2 임)은로 전달해야 ws://localhost:8082/socket.io/하지만 다른 모든 요청은로 전달되어야 http://localhost:8082/socket.io/합니다.

다음 구성 모두의 변형을 시도했습니다.

ProxyPass /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket
ProxyPassReverse /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

.

RewriteRule /socket.io/?EIO=([0-9]+)&transport=websocket ws://localhost:8082/socket.io/ [QSA,P]

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

내 인터넷 검색에서 ProxyPass 및 Locations가 쿼리 문자열을 대상으로 할 수 없다는 것을 모았습니다. 여기에 다른 옵션이 있습니까? 경로는 socket.io에 하드 코드되어 있으므로 전체 라이브러리를 포크하지 않아서 변경할 수 없습니다.

답변:


39

이 특별한 경우에 맞게 재 작성 조건을 사용하십시오.

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://localhost:8082/$1 [P,L]

ProxyPass        /socket.io http://localhost:8082/socket.io
ProxyPassReverse /socket.io http://localhost:8082/socket.io

참고 마크 W가 아래에 언급 한대로. 이들은 서버 또는 .htaccess 레벨이 아닌 vhost 레벨에서 입력 해야합니다 .

밸런서를 참조 할 수도 있습니다.

<Proxy balancer://http-localhost/>
    BalancerMember http://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember http://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

<Proxy balancer://ws-localhost/>
    BalancerMember ws://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember ws://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io                [NC]
RewriteCond %{QUERY_STRING} transport=websocket        [NC]
RewriteRule /(.*)           balancer://ws-localhost/$1 [P,L]

ProxyPass        /socket.io balancer://http-localhost/socket.io
ProxyPassReverse /socket.io balancer://http-localhost/socket.io

+100000 당신은 내 하루를 만들었습니다. 이것에 몇 시간 동안 있었다. 첫 번째 코드 스 니펫을 사용했습니다. 지금은 밸런서가 필요하지 않습니다.
Eamorr

이 기능을 작동시킬 수 없습니다. Apache는 404 코드로 계속 응답합니다. 마치 일반 파일을로드하려고하는 것처럼 액세스 로그에 표시되며 소켓 노드 프로세스는 요청을 수신 할 징후가 표시되지 않습니다 (socket.io.js 파일에 대한 호출을 표시 함)
ChiperSoft

1
mod_rewrite가 ws : // 프로토콜을 모르는 것 같습니다. 내 재 작성 로그에서 볼 : forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/(domain.dev
ChiperSoft

아마도 그 이유는 다음 과 같습니다 . issues.apache.org/bugzilla/show_bug.cgi?id=55598 프로토콜에 대한 지원이 Apache 2.5에서 추가 된 것
같습니다

5
참고 : 문서 루트 (예 :)를 사용하더라도 이러한 블록은 <VirtualHost>설명 된 순서대로 블록 내에 배치해야합니다 . 난 단지 것을 알아, 이러한 변화가 제대로 작동하지 않은 이유를 알아 내려고 거의 2 시간 동안 의이의 루트 수준에서 작동되지 않았다 (비록 일하고 있었다). 지시문에서 작동하지 않음 블록 또는 합니다 (비록 파일을 논리적 장소 때문에 이러한 변화에 그룹에의 할) . /var/www/htmlRewriteRulehttpd.confProxyPassProxyPass<Directory>.htaccessRewriteRule<VirtualHost>
Mark W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.