Apache2'nin proxy WebSocket'a yapılandırılması?


40

WebSocket protokolü, HTTP protokolünün bir uzantısıdır. Ancak, Apache2'nin proxy modülü bunu bilmiyor gibi görünüyor ve aramayı standart bir HTTP aramasına dönüştürerek önemli başlıkları atar.

Apache2'yi ya (1) WebSocket'ı (ya da 2) anlayabilmesi için basitçe ne olursa olsun geçmesini sağlamanın bir yolu var mı?

Yanıtlar:


23

Artık Apache bagajında ​​mod_proxy_wstunnel adlı mod_proxy'nin (ProxyPass / ProxyPassReverse) WebSocket trafiğinden geçmesine izin veren bir modül var. Birisi Apache 2.4 / 2.2'ye back-porting mod_proxy_wstunnel hakkında bir blog yazısı yazdı ve bunu yapmak için bir yama sağladı.

Ubuntu'da mod_proxy_wstunnel'i (Ubuntu Server 11.10 ve Apache 2.2.20 ile test edildi) kurmak için somut talimatlar buldum ve blogumda yayınladım. Onları aşağıda kopyaladım:

# Check apache version (should be 2.2.20 as of writing, if not adjust the next step)
dpkg -s apache2

# Checkout apache source
svn checkout http://svn.apache.org/repos/asf/httpd/httpd/tags/2.2.20/ httpd-2.2.20

# Get patch and apply it
wget http://cafarelli.fr/gentoo/apache-2.2.24-wstunnel.patch
cd httpd-2.2.20
patch -p1 < ../apache-2.2.24-wstunnel.patch

# Build Apache 
svn co http://svn.apache.org/repos/asf/apr/apr/branches/1.4.x srclib/apr
svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.3.x srclib/apr-util
./buildconf
./configure --enable-proxy=shared --enable-proxy_wstunnel=shared
make

# Copy the module and recompiled mod_proxy (for new symbols) to the ubuntu apache installation and update the permissions to match the other modules
sudo cp modules/proxy/.libs/mod_proxy{_wstunnel,}.so /usr/lib/apache2/modules/
sudo chmod 644 /usr/lib/apache2/modules/mod_proxy{_wstunnel,}.so
echo -e "# Depends: proxy\nLoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so" | sudo tee -a /etc/apache2/mods-available/proxy_wstunnel.load

# Enable the module (also make any configuration changes you need)
sudo a2enmod proxy_wstunnel
sudo service apache2 restart

2
Rehberini takip ettiğimde, sahip olmadığın bir adım vardı. Nisan kontrollerini yaptıktan sonra ./buildconfigconfigure dosyası oluşturmak için koşmam gerekiyordu . Ve benim yüklememi söyleyen birkaç bağımlılık vardı.
notbad.jpeg 28:13

bu, Glassfish 4 ile wss üzerinden bağlantı kurar: (SSL)
Arşimet Trajano

1
@ notbad.jpeg: Muhtemelen ortalama ./buildconf :-) (./buildconfig değil)
Erik Forsberg

1
Sadece benim geribildirim ... bu yüklü ve Apache 2.2.22-1ubuntu1.10 Ubuntu 12.04 yüklü, ama sonunda benim için işe yaramadı. Proxy "Yükseltme" başlığını kaldırıyordu (kaynak kodu "RFC2616 13.5.1 diyor ki bu başlıkları çıkarmalıyız" diyor), bu da sunucunun beklediği bir başlık, sadece bir atlama değil, bu yüzden benim için işe yaramadı. ve bunun yerine iptables DNAT kuralıyla değiştirdim.
Peter,



3

Lütfen http://github.com/disconnect/apache-websocket adresine bakınız.

Apache-websocket modülü, bir Apache 2.x sunucusu tarafından WebSocket protokolünü kullanarak istekleri işlemek için kullanılabilecek bir Apache 2.x sunucu modülüdür.


Yukarıdaki github projesine baktım. Proxy gibi davranmaz. alıntıThe module consists of a plugin architecture ...
guettli

1

Bu eklenti, @Andrew Moss'un ' VirtualHostsocket.io 1.0 ile çalışacak şekilde nasıl doğru bir şekilde yapılandırılacağı konusundaki cevabına! CentOS ile ilgili kısmı atlamaktan çekinmeyin!


CentOS 6’da kalmışsanız, işte nasıl yapılacağı:

  1. mod_proxy_wstunnelModül için desteklenen kaynağı buradan indirin (Gist'i klonlayın veya dosyaları tek tek indirin)
  2. Oluşturmak için gereken her şeyi yükleyin: yum install make gcc httpd-devel
  3. Bir Kurulum RPM Yapı ortamı (temelde ayrıcalığı olmayan bir kullanıcı ve bazı dizinleri)
  4. Kopya .ciçine -Dosya SOURCESortamının alt klasör ve .speciçine -Dosya SPECSalt klasöründe.
  5. Çalıştırmak rpmbuild -ba mod_proxy_wstunnel.spec
  6. Paket şimdi SRPMSalt klasörde
  7. Paketi yükleyin: rpm -i /path/to/package.rpm
  8. kâr

Bu aynı zamanda modülü otomatik olarak Apache'ye yükleyecektir, bu yüzden onu yeniden başlatmanız gerekir service httpd restart.


VirtualHostAslında Socket.io sunucusuna ve istemci betiğine hizmet etmek için (varsayılan olarak mevcut olan) a ayarlanması http://your.server/socket.io/socket.io.js, Apache 2.2'de, modüldeki bir Hatamod_proxy nedeniyle biraz daha karmaşıktır :

Aşağıdaki yeniden yazma kuralı verildiğinde:

RewriteRule    ^/ws(.*)$  ws://localhost:9000/ws  [P]

mod_rewrite Erişim günlüğünün gösterdiği şekilde buna bir dosya yolu olarak davranır:

[26/Sep/2013:09:46:07 -0400] "GET /ws://localhost:9000/ws HTTP/1.1" 400 317

Bu nedenle, yeniden yazma kuralında -protocol'u kullanamazsınızws , çünkü bu dahili olarak bir HTTP GET isteğine dönüşür.

Yine de bir geçici çözüm var:

<VirtualHost *:80>
        ServerName your.server

        # Proxy socket.io Websocket
        RewriteEngine On

        # socket.io 1.0+ starts all connections with an HTTP polling request
        RewriteCond %{QUERY_STRING} transport=polling       [NC]
        RewriteRule /(.*)           http://localhost:8081/$1 [P]

        ProxyRequests Off

        # Explicitly send the request for the client-script to HTTP:
        ProxyPass /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
        ProxyPassReverse /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js

        # Anything else goes to the WebSocket protocol:
        ProxyPass /socket.io/ ws://localhost:8081/socket.io/
        ProxyPassReverse /socket.io/ ws://localhost:8081/socket.io/

        # Any additional stuff (the actual site) comes here
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/
</VirtualHost>

Bu her şeyin gönderilmesi emin kılan /socket.iogider ws://ve istemci kütüphanesi için isteğini (WebSockets kullanılmadığı bir geri dönüş mekanizması olan) uzun yoklama için istek dışında -Protokolü.

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.