Socket.IO 1.0 के लिए Apache 2.4 mod_proxy_wstunnel कॉन्फ़िगर करना


15

मैं mod_proxy_wstunnel का उपयोग करके एक नोड के लिए websocket नोड के लिए socket.io के लिए वेबस्केट कनेक्शन को जोड़ने के लिए Apache 2.4 को कॉन्फ़िगर करने का प्रयास कर रहा हूं। हमने सॉकेट.आईओ 0.9 के साथ यह ठीक काम किया था, लेकिन 1.0 रिलीज के साथ उन्होंने सॉकेट एंडपॉइंट को एक क्वेरी पैरामीटर में बदल दिया, और अब मुझे सही प्रॉक्सी निर्देशों के साथ अपाचे को कॉन्फ़िगर करने में परेशानी हो रही है।

सभी अनुरोधों /socket.io/?EIO=N&transport=websocket(जहां एन कोई भी अंक है, आमतौर पर 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 और स्थान क्वेरी स्ट्रिंग्स को लक्षित नहीं कर सकते, तो क्या यहां कोई अन्य विकल्प है? रास्तों को सॉकेट.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

नोट के रूप में मार्क डब्ल्यू नीचे उल्लेख किया है। इन्हें vhost स्तर पर दर्ज किया जाना चाहिए न कि सर्वर या .htaccess स्तर पर।

आप एक बैलेंसर का संदर्भ भी ले सकते हैं:

<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 आपने मेरा दिन बना दिया। घंटों तक इस पर रहा। मैंने पहले कोड स्निपेट का इस्तेमाल किया। मुझे इस समय एक बैलेंसर की आवश्यकता नहीं है।
15

मैं यह काम करने में सक्षम नहीं हूं। अपाचे 404 कोड के साथ जवाब देता रहता है। यह एक्सेस लॉग में दिखाता है जैसे कि यह एक सामान्य फ़ाइल को लोड करने की कोशिश कर रहा है, और सॉकेट नोड प्रक्रिया अनुरोध प्राप्त करने का कोई संकेत नहीं दिखाती है (यह सॉकेट के लिए कॉल दिखाता है। jio फ़ाइल)
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 में जोड़ा गया था
ChiperSoft

5
ध्यान दें : इन ब्लॉकों को <VirtualHost>वर्णित सटीक क्रम में ब्लॉक के भीतर रखा जाना चाहिए , भले ही आप दस्तावेज़ रूट (जैसे /var/www/html) का उपयोग कर रहे हों । मैंने यह जानने में लगभग 2 घंटे बिताए कि ये बदलाव ठीक से काम क्यों नहीं कर रहे हैं, केवल यह पता लगाने के लिए कि यह (हालांकि काम कर रहा था) RewriteRuleके मूल स्तर पर काम नहीं कर रहा था। निर्देशों में काम नहीं करते ब्लॉक या फ़ाइलें (हालांकि इतना तार्किक जगह समूह इन परिवर्तनों में है करने के लिए की है), । httpd.confProxyPassProxyPass<Directory>.htaccessRewriteRule<VirtualHost>
मार्क डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.