การกำหนดค่า Apache 2.4 mod_proxy_wstunnel สำหรับ Socket.IO 1.0


15

ฉันกำลังพยายามกำหนดค่า Apache 2.4 สำหรับการเชื่อมต่อกับ websocket สำหรับ socket.io กับเซิร์ฟเวอร์ websocket node.js โดยใช้ mod_proxy_wstunnel เราใช้งานได้ดีกับ socket.io 0.9 แต่ด้วยรีลีส 1.0 พวกเขาเปลี่ยนจุดสิ้นสุดของซ็อกเก็ตเป็นพารามิเตอร์การค้นหาและตอนนี้ฉันมีปัญหาในการกำหนดค่า apache ด้วยคำสั่งพร็อกซีที่ถูกต้อง

คำขอทั้งหมด/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/

ฉันได้รวบรวมจาก googling ของฉันว่า ProxyPass และสถานที่ตั้งไม่สามารถกำหนดเป้าหมายสตริงการสืบค้นได้ดังนั้นมีตัวเลือกอื่นที่นี่หรือไม่ เส้นทางนั้นเขียนลงใน 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

หมายเหตุตามที่ Mark W ระบุไว้ด้านล่าง สิ่งเหล่านี้ต้องถูกป้อนที่ระดับ vhost และไม่ใช่ที่ระดับเซิร์ฟเวอร์หรือ. htaccess

นอกจากนี้คุณยังสามารถอ้างอิง balancer:

<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

นี่อาจเป็นสาเหตุ: problems.apache.org/bugzilla/show_bug.cgi?id=55598ดูเหมือนว่ามีการเพิ่มการรองรับโปรโตคอลใน Apache 2.5
ChiperSoft

5
หมายเหตุ : บล็อกเหล่านี้ควรอยู่ใน<VirtualHost>บล็อกตามลำดับที่อธิบายแม้ว่าคุณจะใช้รูทเอกสาร (เช่น/var/www/html) ฉันใช้เวลาเกือบ 2 ชั่วโมงเพื่อหาสาเหตุที่การเปลี่ยนแปลงเหล่านี้ไม่ทำงานอย่างถูกต้องเพียงเพื่อพบว่าการRewriteRuleทำงานนั้นไม่ทำงานที่ระดับรากของhttpd.conf(แม้ว่าจะProxyPassใช้งานได้) ProxyPassสั่งจะไม่ได้ทำงานใน<Directory>บล็อกหรือ.htaccessไฟล์ (แม้ว่าRewriteRule's ทำ) <VirtualHost>ดังนั้นสถานที่ตรรกะไปยังกลุ่มการเปลี่ยนแปลงเหล่านี้อยู่ใน
Mark W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.