กำหนดค่า Apache2 ให้กับพร็อกซี WebSocket หรือไม่


40

โปรโตคอล WebSocket เป็นส่วนเสริมของโปรโตคอล HTTP อย่างไรก็ตามโมดูลพร็อกซี่ของ Apache2 ดูเหมือนจะไม่ทราบเกี่ยวกับเรื่องนี้และทิ้งส่วนหัวที่สำคัญไปแล้วแปลงการโทรเป็นการโทร HTTP มาตรฐาน

มีวิธีทำให้ Apache2 ทั้ง (1) เข้าใจ WebSocket หรือ (2) เพียงแค่สุ่มสี่สุ่มห้าผ่านสิ่งที่ได้รับมาหรือไม่?

คำตอบ:


23

ขณะนี้มีโมดูลใน Apache trunk ชื่อ mod_proxy_wstunnel ซึ่งอนุญาตให้ mod_proxy (ProxyPass / ProxyPassReverse) ส่งผ่านทราฟฟิก WebSocket มีคนเขียนโพสต์บล็อกเกี่ยวกับback-porting mod_proxy_wstunnel ไปยัง Apache 2.4 / 2.2และจัดให้มีโปรแกรมปะแก้

ฉันหาคำแนะนำที่เป็นรูปธรรมเพื่อตั้งค่า mod_proxy_wstunnel บน Ubuntu (ทดสอบกับ Ubuntu Server 11.10 และ Apache 2.2.20) แล้วโพสต์ไว้ในบล็อกของฉัน ฉันได้คัดลอกไว้ด้านล่าง:

# 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
เมื่อฉันทำตามคำแนะนำของคุณมีขั้นตอนที่คุณไม่ได้มี หลังจากทำการตรวจสอบ apr ฉันต้องทำงาน./buildconfigเพื่อสร้างไฟล์กำหนดค่า และมีการอ้างอิงสองสามอย่างที่บอกให้ฉันติดตั้ง
notbad.jpeg

ไม่เบ็ดนี้ขึ้นกับ Glassfish 4 มากกว่า WSS: (SSL)
อาร์คิ Trajano

1
@ notbad.jpeg: คุณอาจหมายถึง. / buildconf (ไม่ใช่ ./buildconfig) :-)
Erik Forsberg

1
เพียงแค่ข้อเสนอแนะของฉัน ... สิ่งนี้ติดตั้งและโหลดใน apache 2.2.22-1ubuntu1.10 จาก Ubuntu 12.04 แต่มันก็ไม่ได้ผลสำหรับฉันในที่สุด พร็อกซีถูกลบส่วนหัว "อัปเกรด" (ซอร์สโค้ดบอกว่า "RFC2616 13.5.1 บอกว่าเราควรถอดส่วนหัวเหล่านี้") ซึ่งเป็นส่วนหัวที่เซิร์ฟเวอร์คาดหวังไม่ใช่แค่การฟ้อนรำเพียงครั้งเดียวดังนั้นมันจึงไม่ได้ผลสำหรับฉัน และฉันได้แทนที่ด้วยกฎ ipatables DNAT แทน
ปีเตอร์

11

มีอะไรที่จะบ่งบอกถึง Apache httpd จะสนับสนุนพวกเขาในเร็ว ๆ นี้

หากคุณต้องเรียกใช้ WebSockets ผ่าน Apache ลองmod_pywebsocket ฉันลองแล้วและใช้งานได้

นี่เป็นทางเลือกที่ฉันชอบ:

  • ให้บริการ websockets บนพอร์ตอื่นหลีกเลี่ยง Apache httpd โดยสิ้นเชิง
  • ลองhaproxyเป็นข้อเสนอแนะที่นี่
  • สลับไปNginxใช้TCP โมดูลพร็อกซี่ , บทความอ่าน


3

โปรดดูที่http://github.com/disconnect/apache-websocket

โมดูล apache-websocket เป็นโมดูลเซิร์ฟเวอร์ Apache 2.x ที่อาจใช้ในการประมวลผลคำขอโดยใช้โปรโตคอล WebSocket โดยเซิร์ฟเวอร์ Apache 2.x


ฉันมองไปที่โครงการ GitHub ด้านบน มันไม่ได้ทำหน้าที่เป็นตัวแทน อ้างThe module consists of a plugin architecture ...
guettli

1

ส่วนเสริมนี้สำหรับ@Andrew Moss 'เป็นวิธีการกำหนดค่าการVirtualHostทำงานกับ socket.io 1.0 อย่างถูกต้อง! อย่าลังเลที่จะข้ามส่วนเกี่ยวกับ CentOS!


หากคุณติดอยู่บน CentOS 6 นี่คือวิธีการ:

  1. ดาวน์โหลดแหล่งข้อมูลย้อนกลับสำหรับmod_proxy_wstunnelโมดูลที่นี่ (คัดลอก Gist หรือดาวน์โหลดไฟล์ทีละรายการ)
  2. ติดตั้งทุกสิ่งที่จำเป็นในการสร้าง: yum install make gcc httpd-devel
  3. ตั้งค่าสภาพแวดล้อม RPM Build (โดยทั่วไปคือผู้ใช้ที่ไม่มีสิทธิ์และบางไดเร็กทอรี)
  4. คัดลอก.c-file ลงในSOURCESโฟลเดอร์ย่อยของสภาพแวดล้อมและ.spec-file ลงในSPECSโฟลเดอร์ย่อย
  5. วิ่ง rpmbuild -ba mod_proxy_wstunnel.spec
  6. แพ็คเกจนี้อยู่ในSRPMSโฟลเดอร์ย่อย
  7. ติดตั้งแพ็คเกจ: rpm -i /path/to/package.rpm
  8. กำไร

นอกจากนี้ยังจะโหลดโดยอัตโนมัติโมดูลใน Apache service httpd restartดังนั้นคุณก็ต้องเริ่มต้นใหม่กับ


การตั้งค่า a VirtualHostเพื่อให้บริการเซิร์ฟเวอร์ Socket.io และไคลเอนต์สคริปต์ (ซึ่งโดยค่าเริ่มต้นพร้อมใช้งานhttp://your.server/socket.io/socket.io.js) จะซับซ้อนกว่าเล็กน้อยใน Apache 2.2 เนื่องจากBug ในmod_proxyโมดูล :

รับกฎการเขียนซ้ำต่อไปนี้:

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

mod_rewrite ปฏิบัติต่อ filepath นี้เพื่อให้บันทึกการเข้าถึงแสดง:

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

ดังนั้นคุณไม่สามารถใช้ws-protocol ในกฎการเขียนซ้ำได้เนื่องจากจะเปลี่ยนเป็นการร้องขอ HTTP GET ภายใน

มีวิธีแก้ปัญหาคือ:

<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>

สิ่งนี้ทำให้แน่ใจได้ว่าทุกสิ่งที่ส่ง/socket.ioไปยังws://-protocol ยกเว้นคำร้องขอการทำโพลแบบยาว (ซึ่งเป็นกลไกทางเลือกเมื่อ WebSockets ไม่พร้อมใช้งาน) และคำขอสำหรับไคลเอนต์ - ไลบรารี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.