ওয়েবসকেটস এবং অ্যাপাচি প্রক্সি: মোড_প্রক্সি_ওয়াস্টুনেল কীভাবে কনফিগার করবেন?


101

আমার আছে :

  1. Apache(v2.4) জন্য আমার সার্ভারে বন্দর 80 www.domain1.com, সঙ্গে mod_proxy এবং mod_proxy_wstunnel সক্রিয়

  2. node.js + socket.io একই সার্ভারের 3001 পোর্টে।

অ্যাক্সেসিং www.domain2.com(পোর্ট 80 সহ) 2 এ পুনর্নির্দেশ করে here এখানে বর্ণিত পদ্ধতির জন্য ধন্যবাদ । আমি এটি অ্যাপাচি কনফিগারেশনে সেট করেছি:

<VirtualHost *:80>
    ServerName www.domain2.com
    ProxyPass / http://localhost:3001/
    ProxyPassReverse / http://localhost:3001/
    ProxyPass / ws://localhost:3001/
    ProxyPassReverse / ws://localhost:3001/
</VirtualHost>

এটি ওয়েবসকেট অংশ ব্যতীত সমস্ত কিছুর জন্য কাজ করে: ws://...প্রক্সি দিয়ে যেমন করা হয় তেমন সঞ্চারিত হয় না।

আমি যখন পৃষ্ঠাটি অ্যাক্সেস করি তখন আমার www.domain2.comকাছে:

Impossible to connect ws://www.domain2.com/socket.io/?EIO=3&transport=websocket&sid=n30rqg9AEqZIk5c9AABN.

প্রশ্ন: অ্যাপাচি প্রক্সিকে ওয়েবসকেটগুলি কীভাবে তৈরি করবেন?

উত্তর:


164

আমি অবশেষে এটি করতে পেরেছি, এই বিষয়টির জন্য ধন্যবাদ ।

করতে:

1) অ্যাপাচি ২.৪ ইনস্টল করুন (২.২ এর সাথে কাজ করে না) এবং করুন:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

2) nodejs3001 বন্দরে চলছে

3) অ্যাপাচি কনফিগারেশনে এটি করুন

<VirtualHost *:80>
  ServerName www.domain2.com

  RewriteEngine On
  RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
  RewriteCond %{QUERY_STRING} transport=websocket    [NC]
  RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]

  ProxyPass / http://localhost:3001/
  ProxyPassReverse / http://localhost:3001/
</VirtualHost>

দ্রষ্টব্য: আপনার যদি একই সার্ভারে একাধিক পরিষেবা রয়েছে যা ওয়েবসকেট ব্যবহার করে, আপনি তাদের আলাদা করতে এটি করতে চাইতে পারেন ।


CentOS 7.1 এফডাব্লুআইডাব্লু, অ্যাপাচি ২.৪ এ এই বাগটি রয়েছে তাই পুনর্লিখন ডাব্লুএস: // প্রোটোকলকে স্বীকৃতি দেবে না এবং সাব্রেক্সটি প্রেরণের আগে ডোমেনটি প্রিপেন্ড করে। আপনি [পি] রক্সি পতাকাটি [আর] এডাইরেক্টারে পরিবর্তন করে নিজেকে পরীক্ষা করতে পারেন।
Andor

4
এটি করার সময় আমি আমার ডাব্লুএস: // রুটের 502 টি খারাপ গেটওয়ে পেয়েছি। উবুন্টু 14.04 এ অ্যাপাচি 2.4 চালানো
অ্যালেক্স মুরো 10'15

4
এটি কাজ করে কারণ সমস্ত এইচটিটিপি ট্র্যাফিকও ফরোয়ার্ড করা হচ্ছে, তবে আপনি যদি কেবল নিজের সকেট ট্র্যাফিকই ফরোয়ার্ড করতে চান তবে দয়া করে নোট করুন যে সকেট.ইও একটি HTTP পোলিংয়ের অনুরোধের সাথে যোগাযোগ শুরু করে। আরও তথ্য এখানে
এরিক কোওপম্যানস

4
443 ডাব্লুএসএস থেকে ডাব্লুএসে কীভাবে ফরোয়ার্ডিং করবেন? পুনর্লিখনের পরিবর্তন হয়?
হার্নান এচে

4
শর্তটি RewriteCond %{QUERY_STRING} transport=websocket [NC]আমার সঠিকভাবে কাজ করে নি। RewriteCond %{HTTP:Upgrade} =websocket [NC]পরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছে ।
মার্টিন

103

ইউআরএল দ্বারা ফিল্টারিংয়ের পরিবর্তে, আপনি এইচটিটিপি শিরোনাম দ্বারাও ফিল্টার করতে পারেন। এই কনফিগারেশনটি কোনও ওয়েব অ্যাপ্লিকেশনগুলির জন্য কাজ করবে যা ওয়েবসকেট ব্যবহার করে, এমনকি যদি তারা সকেট ব্যবহার না করে:

<VirtualHost *:80>
  ServerName www.domain2.com

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /(.*)           http://localhost:3001/$1 [P,L]

  ProxyPassReverse / http://localhost:3001/
</VirtualHost>

এটি আমার পক্ষে ভাল কাজ করছে তবে আমি একটি সাবপ্যাথ প্রক্সিং করছি এবং রেজেক্স একটি সাবস্ট্রিংয়ের সন্ধান করছে বলে আমি অ্যাঙ্কর যুক্ত করা জরুরী। উদাহরণস্বরূপ RewritRule ^ [^ /] * / foo /(.*) http: // $ OO FOO_HOST} / $ 1 [পি, এল] (অন্যথায় / বার / ফুও একই জায়গায় / foo হিসাবে নির্দেশিত হবে)
স্টিভ লিলি

এই কনফিগারটি আলিবাবার ক্লাউডে সেরা কাজ করে। তদ্ব্যতীত, এটি ত্রুটি জালটি ঠিক করবে :: ERR_RESPONSE_HEADERS_TRUNCATED "আশা করি কেউ এই
উপকারটি পেয়েছেন

সিগন্যালআর ব্যবহার করে, আমি বলতে পারি, এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে +1 ধন্যবাদ
ভোজটাচ মিরিজ

18

হতে পারে দরকারী হবে। কেবলমাত্র সমস্ত প্রশ্ন ডাব্লুএস এর মাধ্যমে নোডে প্রেরণ করে

<VirtualHost *:80>
  ServerName www.domain2.com

  <Location "/">
    ProxyPass "ws://localhost:3001/"
  </Location>
</VirtualHost>

ধন্যবাদ @ সার্জি এটি যখন আমাকে কেবল ডকুমেন্টের রুটে সমস্ত রাউটিংয়ের পরিবর্তে ডাব্লু ডাব্লু দ্বারা নির্দেশিত প্রত্যক্ষ পাথটি ব্যবহার করেছিল তখন এটি আমাকে সাহায্য করেছিল। নীচের উত্তরে আমি অন্যের উপকারের জন্য যা করেছি তা আমি প্রদর্শন করেছি।
আনোয়ারুল্লাহ

এই উত্তরটি সাধারণ ওয়েব সকেটের জন্য কাজ করে (কোনও সকেট.ইও নেই) তাই আমার জন্য এটি আরও ভাল উত্তর
টমাস

অসাধারণ! এটি আমার জন্য তাত্ক্ষণিকভাবে কাজ করছে যখন অন্যান্য পুনর্লিখন এবং প্রক্সি প্রচেষ্টা আমার সমস্যার সমাধান করতে পারেনি।
স্টিফান

ধন্যবাদ!! বেসিক ব্যবহারের ক্ষেত্রে উপযুক্ত, ডাব্লুএসএস ব্যবহার করে কেবল একটি সাধারণ ওয়েব সকেট: //
অ্যান্টোনিয়া ব্লেয়ার

18

সকেট.আইও 1.0 (মে 2014) হিসাবে, সমস্ত সংযোগ একটি HTTP পোলিংয়ের অনুরোধের সাথে শুরু হয় ( এখানে আরও তথ্য )। এর অর্থ হ'ল ওয়েবসকেট ট্র্যাফিক ফরওয়ার্ড করা ছাড়াও আপনাকে যে কোনও transport=pollingএইচটিটিপি অনুরোধগুলি ফরোয়ার্ড করতে হবে ।

অন্য কোনও ট্র্যাফিক পুনর্নির্দেশ না করে নীচের সমাধানটিতে সমস্ত সকেট ট্র্যাফিক সঠিকভাবে পুনঃনির্দেশ করা উচিত।

  1. নিম্নলিখিত অ্যাপাচি 2 মোডগুলি সক্ষম করুন:

    sudo a2enmod proxy rewrite proxy_http proxy_wstunnel
    
  2. আপনার * .conf ফাইলে এই উদাহরণগুলি ব্যবহার করুন (উদাঃ /etc/apache2/sites-available/mysite.com.conf)। আমি প্রতিটি টুকরো ব্যাখ্যা করতে মন্তব্য অন্তর্ভুক্ত করেছি:

    <VirtualHost *:80>
        ServerName www.mydomain.com
    
        # Enable the rewrite engine
        # Requires: sudo a2enmod proxy rewrite proxy_http proxy_wstunnel
        # In the rules/conds, [NC] means case-insensitve, [P] means proxy
        RewriteEngine On
    
        # socket.io 1.0+ starts all connections with an HTTP polling request
        RewriteCond %{QUERY_STRING} transport=polling       [NC]
        RewriteRule /(.*)           http://localhost:3001/$1 [P]
    
        # When socket.io wants to initiate a WebSocket connection, it sends an
        # "upgrade: websocket" request that should be transferred to ws://
        RewriteCond %{HTTP:Upgrade} websocket               [NC]
        RewriteRule /(.*)           ws://localhost:3001/$1  [P]
    
        # OPTIONAL: Route all HTTP traffic at /node to port 3001
        ProxyRequests Off
        ProxyPass           /node   http://localhost:3001
        ProxyPassReverse    /node   http://localhost:3001
    </VirtualHost>
    
  3. আমি /nodeট্র্যাফিক রাউটিংয়ের জন্য একটি অতিরিক্ত বিভাগ অন্তর্ভুক্ত করেছি যা আমি কার্যকর বলে মনে করি, আরও তথ্যের জন্য এখানে দেখুন।


4
এটি আমার পক্ষে নিখুঁতভাবে কাজ করে। মনে রাখবেন যে আপনার অনুরোধগুলি যদি রুট ব্যতীত অন্য কোনও URL এ চলে আসে তবে আপনি উদাহরণস্বরূপ এটি করতে পারেনRewriteRule /path/(.*)
রব গুইন-জোনস

9

আমার জন্য এটি নীচে (বোল্ড লাইন) হিসাবে httpd.conf এ কেবল একটি লাইন যুক্ত করার পরে কাজ করে ।


<VirtualHost *:80>
    ServerName: xxxxx

    #ProxyPassReverse is not needed
    ProxyPass /log4j ws://localhost:4711/logs
<VirtualHost *:80>

CentOS এ অ্যাপাচি সংস্করণটি 2.4.6।


8

এই উত্তরগুলির সাহায্যে, অবশেষে আমি এই অ্যাপাচি 2 সাইট কনফিগারেশনটি ব্যবহার করে উবুন্টু মেট এবং অ্যাপাচি 2 নিয়ে কাজ করে রাস্পবেরি পাইতে চলমান নোড-রেডের বিপরীত প্রক্সি পেয়েছি:

<VirtualHost *:80>
    ServerName nodered.domain.com
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*)           ws://localhost:1880/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket [NC]
    RewriteRule /(.*)           http://localhost:1880/$1 [P,L]
</VirtualHost>

আমাকে এই জাতীয় মডিউলগুলি সক্ষম করতে হয়েছিল:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel

5

আমার সেটআপ:

  • অ্যাপাচি ২.৪.১০ (দেবিয়ানের দৌড়ে)
  • নোড.জেএস (সংস্করণ ৪.১.১) অ্যাপ্লিকেশনটি 3000 পোর্টে চলছে যা ওয়েবসকেটকে পথে গ্রহণ করে /api/ws

@ বাসজের দ্বারা উপরে উল্লিখিত হিসাবে, নিশ্চিত করুন যে a2enmod প্রক্সি এবং ডাব্লুএস_ফুনেল সক্ষম রয়েছে।

এটি অ্যাপাচি কনফিগারেশন ফাইলের একটি স্ক্রিনশট যা আমার সমস্যার সমাধান করেছে:

অ্যাপাচি কনফিগারেশন

পাঠ্য হিসাবে প্রাসঙ্গিক অংশ:

<VirtualHost *:80>
  ServerName *******
  ServerAlias *******
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/

  <Location "/api/ws">
      ProxyPass "ws://localhost:3000/api/ws"
  </Location>
</VirtualHost>

আশা করি এইটি কাজ করবে.


আমি ডিফল্টের চেয়ে পছন্দসই ইউআরএল দিয়ে আমার অ্যাপ্লিকেশনটি সেট আপ করতে সমস্যায় পড়ছি, আপনি কি আমাকে সাহায্য করতে চান? (আমি কোনও বার্নিশ ক্যাশে সার্ভারের উপরে বসে আছি)
জোশ

6
আপনি কি স্ক্রিনশটের পরিবর্তে অনুলিপি / পেস্ট করতে পারবেন? আপনাকে আগাম ধন্যবাদ, এটি পাঠযোগ্যতার উন্নতি করবে।
বাসজ

4

স্থিতিশীল, বিশ্রাম এবং ওয়েবসকেট সামগ্রীতে চলমান একটি বসন্ত অ্যাপ্লিকেশনটির জন্য নিম্নলিখিতগুলি করেছেন।

অ্যাপাচি নিম্নলিখিত ইউআরআইয়ের জন্য প্রক্সি এবং এসএসএল এন্ডপয়েন্ট হিসাবে ব্যবহৃত হয়:

  • / অ্যাপ্লিকেশন → স্থির সামগ্রী
  • / এপিআই → REST এপিআই
  • / এপিআই / ডাব্লুএস → ওয়েবসকেট

অ্যাপাচি কনফিগারেশন

<VirtualHost *:80>
    ServerName xxx.xxx.xxx    

    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On

    <Proxy *>
         Require all granted
    </Proxy>

    RewriteEngine On

    # websocket 
    RewriteCond %{HTTP:Upgrade}         =websocket                      [NC]
    RewriteRule ^/api/ws/(.*)           ws://localhost:8080/api/ws/$1   [P,L]

    # rest
    ProxyPass /api http://localhost:8080/api
    ProxyPassReverse /api http://localhost:8080/api

    # static content    
    ProxyPass /app http://localhost:8080/app
    ProxyPassReverse /app http://localhost:8080/app 
</VirtualHost>

আমি এসএসএল কনফিগারেশনের জন্য একই vHost কনফিগারেশন ব্যবহার করি, সম্পর্কিত প্রক্সি সম্পর্কিত কোনও পরিবর্তন করার দরকার নেই।

বসন্ত কনফিগারেশন

server.use-forward-headers: true

অবস্থানগুলি পৃথক করতে একটি অবস্থান ট্যাগ ব্যবহার করুন, যেমন: <অবস্থান / অ্যাপ্লিকেশন : প্রক্সিপাস লোকালহোস্ট: 8080 / অ্যাপ্লিকেশন প্রক্সিপাস রিভার্স লোকালহোস্ট: 8080 / অ্যাপ্লিকেশন </ অবস্থান>
ক্রেজিমার্লিন

2

মূল উত্তরের পাশাপাশি: আপনার যদি একই সার্ভারে ওয়েবসকেট ব্যবহার করা একাধিক পরিষেবা থাকে তবে আপনি কাস্টম পাথ (*) ব্যবহার করে এগুলি পৃথক করার জন্য এটি করতে চাইতে পারেন :

নোড সার্ভার:

var io = require('socket.io')({ path: '/ws_website1'}).listen(server);

ক্লায়েন্ট এইচটিএমএল:

<script src="/ws_website1/socket.io.js"></script>
...
<script>
var socket = io('', { path: '/ws_website1' });
...

অ্যাপাচি কনফিগারেশন:

RewriteEngine On

RewriteRule ^/website1(.*)$ http://localhost:3001$1 [P,L]

RewriteCond %{REQUEST_URI}  ^/ws_website1 [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule ^(.*)$ ws://localhost:3001$1 [P,L]

RewriteCond %{REQUEST_URI}  ^/ws_website1 [NC]
RewriteRule ^(.*)$ http://localhost:3001$1 [P,L]

(*) দ্রষ্টব্য: ডিফল্ট ব্যবহার RewriteCond %{REQUEST_URI} ^/socket.ioকোনও ওয়েবসাইটের সাথে সুনির্দিষ্ট নয় এবং ওয়েবসকেটগুলির অনুরোধগুলি বিভিন্ন ওয়েবসাইটের মধ্যে মিশ্রিত হবে!


2

ডাব্লুএস https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html এর নিখুঁত সমাধানের জন্য এই লিঙ্কটি ব্যবহার করুন

আপনি ঠিক নীচে পদক্ষেপ করতে হবে ..

যাও /etc/apache2/mods-available

ধাপ 1

mode proxy_wstunnel.loadনীচের কমান্ডটি ব্যবহার করে সক্ষম করুন

$a2enmod proxy_wstunnel.load

ধাপ ২

যাও /etc/apache2/sites-available

এবং ভার্চুয়াল হোস্টের ভিতরে আপনার .conf ফাইলটিতে রেখাটি নীচে যুক্ত করুন

ProxyPass "/ws2/"  "ws://localhost:8080/"

ProxyPass "/wss2/" "wss://localhost:8080/"

দ্রষ্টব্য: 8080 বলতে বোঝায় যে এটি আপনার টমক্যাট চলমান বন্দর কারণ আমরা wsআমাদের ওয়ার ফাইলটি টমক্যাট এবং টমক্যাটের জন্য যেখানে অ্যাপাচি রেখেছি সেখানে সংযোগ করতে চাই ws। ধন্যবাদ

আমার কনফিগারেশন

ws://localhost/ws2/ALLCAD-Unifiedcommunication-1.0/chatserver?userid=4 =Connected

দুঃখিত আমি সত্যিই বুঝতে পারি না (বিশেষত আপনার শেষ বাক্য)। আপনি কি উত্তরটির ফর্ম্যাটিং উন্নত করতে পারেন এবং আপনার উল্লেখ করা সমস্ত কিছুই জানেন না এমন লোকদের জন্য বিশদ যুক্ত করতে পারেন?
বসজ

টমক্যাটটি কি আরভিন্ডমধুকর?
বসজ

1

"পোলিং" পরিবহনের জন্য।

অ্যাপাচি পাশ:

<VirtualHost *:80>
    ServerName mysite.com
    DocumentRoot /my/path


    ProxyRequests Off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass /my-connect-3001 http://127.0.0.1:3001/socket.io
    ProxyPassReverse /my-connect-3001 http://127.0.0.1:3001/socket.io   
</VirtualHost>

মক্কেলের পক্ষে:

var my_socket = new io.Manager(null, {
    host: 'mysite.com',
    path: '/my-connect-3001'
    transports: ['polling'],
}).socket('/');

1

করতে:

  1. অ্যাপাচি ২.৪ ইনস্টল করুন (২.২ এর সাথে কাজ করে না), a2enmod proxyএবংa2enmod proxy_wstunnel.load

  2. অ্যাপাচি কনফিগারেশনে
    এটি করুন আপনার ফাইলটিতে কেবল দুটি লাইন যুক্ত করুন যেখানে 8080 আপনার টমক্যাট চলমান বন্দর

    <VirtualHost *:80>
    ProxyPass "/ws2/" "ws://localhost:8080/" 
    ProxyPass "/wss2/" "wss://localhost:8080/"
    
    </VirtualHost *:80>
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.