سؤال

لدي وكيل Apache لتطبيق Meteor ويوجد Apache وMeteor على جهازين منفصلين.أحتاجه بهذه الطريقة حيث أن Apache يجب أن يخدم الكثير من مواقع الويب الحقيقية ولن يكون تثبيت تطبيق Meteor على هذا الجهاز فكرة جيدة نظرًا لموارده المحدودة.

ومع ذلك، تفشل مصافحة WebSocket مع رمز الاستجابة 400 "يمكن الترقية إلى websocket فقط" إذا حاولت الاتصال من الخارج عبر الوكيل.كل شيء يعمل بشكل جيد عندما أقوم بالاتصال من داخل الشبكة المحلية مباشرة بجهاز النيزك.عندما يفشل WebSocket، يعود SockJS/Meteor إلى XHR ولكن لسوء الحظ يؤدي هذا إلى ظهور بعض الأخطاء في التطبيق المعني.لذلك أحتاج حقًا إلى WebSocket للعمل في معظم الحالات.

لقد قمت بتصحيح تثبيت Apache الخاص بي باستخدام التصحيح المذكور هنا: https://stackoverflow.com/a/16998664يبدو أن الأمور سارت على ما يرام، لكن لم يتغير شيء..

توجيهات وكيل Apache الخاصة بي حاليًا هي كما يلي:

ProxyRequests Off
ProxyPreserveHost On
ModPagespeed Off
<proxy>
Order deny,allow
Allow from all
</proxy>
ProxyPass / http://10.0.2.6:3000/
ProxyPassReverse / http://10.0.2.6:3000/

وأنا أعرف حتى ما الذي يثير المشكلة.يعبث وكيل Apache بالرأس.يبدو رأس الطلب الأصلي للحزمة المعنية التي تترك جهازي كما يلي:

GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent

أثناء إعادة توجيه الحزمة من وكيل Apache مثل هذا:

GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
X-Forwarded-For: 24.xxx.xxx.xxx
X-Forwarded-Host: example.com
X-Forwarded-Server: example.com
Connection: Keep-Alive

لذلك تتم إزالة "الترقية" وتغيير "الاتصال" وبالتالي تفشل مصافحة websocket.الآن يمكنني دائمًا محاولة تعيين "الترقية" إلى "websocket" باستخدام توجيه RequestHeader.ولكن هذا لا يبدو صحيحا وأعتقد أنه سيثير مشاكل أخرى ولذا كنت أتساءل عما إذا كان هناك حل حقيقي لهذه المشكلة؟أم أن هذا شيء من التصحيح https://stackoverflow.com/a/16998664 ينبغي معالجة وحدث خطأ ما في نهايتي تطبيقه؟

مما قرأته أن التبديل إلى nginx يمكن أن يجعل هذا الإعداد أسهل.سأفكر في هذا ولكن عندما يكون ذلك ممكنًا، أود القيام بذلك باستخدام apache لأن nginx من شأنه أن يجعل الأمور الأخرى أكثر تعقيدًا ويكلفني الكثير من الوقت.

هل كانت مفيدة؟

المحلول

نحن نستخدم هذا لـ Apache وتطبيق SockJS خلف Apache.يقوم Apache بتشغيل وكيل WebSocket تلقائيًا، ولكن يتعين عليك إعادة كتابة المخطط إلى ws وإلا فإنه سيرجع إلى XHR.ولكن فقط إذا كان الاتصال عبارة عن مصافحة WebSocket.ستؤدي إضافة ما يلي إلى حل مشكلتك :) (ملاحظة:غير ال localhost:3000 وفقًا لعنوان URL الخلفي الخاص بك.

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]

نصائح أخرى

هذه الإجابة مبنية على إجابة الفاتح.يفشل الحل الخاص به بالنسبة للمتصفحات التي ترسل رأس طلب اتصال بخلاف "الترقية"، مثل "البقاء على قيد الحياة، الترقية".كان هذا هو الحال بالنسبة لي مع Firefox 42.

لمعالجة مشكلة Firefox أيضًا، قم بتغيير RewriteCond لـ Apache كما يلي:

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]

(^ ترقية$ يصبح ترقية$)

أردت أن أضع هذا كتعليق على إجابة فاتح، لكنني أفتقر إلى السمعة اللازمة.

بعد قراءة العديد من الإجابات، والنشر على منتدى النيزك، والكثير من التجارب هنا هي الحفرة بأكملها التي عملت بالنسبة لي.كانت الإجابات الأخرى غير مكتملة إلى حد ما، أو على الأقل لم تنجح بالنسبة لي.

اضطررت إلى القيام به:

giveacodicetagpre. كان على

أيضا إضافة proxypass و proxypassreverse وتغيير ^ ترقية $ للترقية $ من آخر حتى الإجابة.

giveacodicetagpre.

ثم أعد تشغيل Apache.

قمت بفحصها على وحدة التحكم وليس هناك خطأ الآن ولا طلبات XHR.لذلك أفترض أنه يعمل بشكل صحيح

أتمنى أن أكون قادرا على تقديم رد مباشر مع تعليمات Apache ولكن نظرا لأنك ذكرت Nginx وأن الحقيقة هي أنه من الصعب تكوينها، أود أن أزن بديل يستخدم فعليا Nginx ولكنيمنعك من جميع التعقيدات.

البرنامج التعليمي في https://github.com/ushusion/الراكب / Wiki / Phusion-painergrerger: -Meteor-Tutorial يمشي من خلال الخطوات لإعداد phusion passenger مع أو بدون Nginx (يستخدم Nginx داخليا على أي حال) لنشرات نيزك نيزك الإنتاج متعدد الأمثلة يمكن أن تغطي استخدام جميع النوى في الخادم الخاص بك.

هو سهل مثل:

giveacodicetagpre.

href="https://stackoverflow.com/users/462233/fatih-arslan"> إجابة fatih-alslan مع تعديل derwiwie التعديل مثل سحر. شيء واحد اضطررت للاستخدام كان وضع wss بدلا من ws ، لأن خدمتي تعمل فقط في HTTPS.

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top