Apache 2.4 mod_proxy_wstunnel'i Socket.IO 1.0 için yapılandırma


15

Mod_proxy_wstunnel kullanarak bir node.js websocket sunucusuna socket.io için websocket bağlantısı proxy için Apache 2.4 yapılandırmaya çalışıyorum. Bu çalışmayı socket.io 0.9 ile yaptık, ancak 1.0 sürümünde soket uç noktasını bir sorgu parametresine değiştirdiler ve şimdi apache'yi doğru proxy talimatları ile yapılandırmada sorun yaşıyorum.

Tüm isteklerin /socket.io/?EIO=N&transport=websocket(burada N herhangi bir basamaktır, genellikle 2'dir) ws://localhost:8082/socket.io/, ancak diğer tüm isteklerin yönlendirilmesi gerekir http://localhost:8082/socket.io/.

Aşağıdaki yapılandırmaların her ikisinin varyasyonlarını denedim:

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/

Google'ımdan ProxyPass ve Locations'ın sorgu dizelerini hedefleyemediğini öğrendim, bu yüzden burada başka bir seçenek var mı? Yollar socket.io içine sabit kodlanmıştır, bu yüzden tüm kütüphaneyi çatallamaktan kısa onları değiştiremem.

Yanıtlar:


39

Bu özel durumla eşleşmek için Yeniden Yazma koşullarını kullanın:

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

NOT Aşağıda belirtildiği gibi Mark W. Bunlar gerekir sankonun seviyede değil sunucu veya .htaccess seviyede girilebilir.

Bir dengeleyiciye de başvurabilirsiniz:

<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 Günümü yaptın. Bu saatlerdir. İlk kod snippet'ini kullandım. Şu anda bir dengeleyiciye ihtiyacım yok.
Eamorr

Bunu çalıştıramadım. Apache 404 koduyla yanıt vermeye devam ediyor. Erişim günlüğünde normal bir dosya yüklemeye çalışıyormuş gibi görünür ve soket düğümü işlemi isteği almanın hiçbir izini göstermez (socket.io.js dosyasının çağrısını gösterir)
ChiperSoft

1
Mod_rewrite'ın ws: // protokolünü bilmediği anlaşılıyor. Bunu yeniden yazma forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/günlüğümde görüyorum : (domain.dev
ChiperSoft

Muhtemelen bu yüzden: issue.apache.org/bugzilla/show_bug.cgi?id=55598 Görünüşe göre Protokol desteği Apache 2.5
ChiperSoft

5
NOT : Bu bloklar , belge kökü kullanıyor olsanız bile (ör. ) <VirtualHost>Blok içerisinde açıklanan sırayla yerleştirilmelidir . Bu değişikliklerin neden düzgün çalışmadığını anlamaya çalışmak için yaklaşık 2 saat harcadım, sadece 'nin kök seviyesinde (çalışmama rağmen ) çalışmadığını öğrenmek için . Direktifler iş yok blokları veya (her ne kadar dosya mantıksal bir yerde bu yüzden bu değişiklikler olduğu gruba, 'ler yapmak) . /var/www/htmlRewriteRulehttpd.confProxyPassProxyPass<Directory>.htaccessRewriteRule<VirtualHost>
Mark W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.