এনজিআইএনএক্স প্রক্সি ওয়েবসকেটগুলি বিপরীত করতে এবং এসএসএল (wss: //) সক্ষম করতে?


136

আমি নিজেই এনজিআইএনএক্স তৈরিতে খুব হারিয়ে গিয়েছি তবে আমি অতিরিক্ত স্তর ছাড়াই সুরক্ষিত ওয়েবসকেট সক্ষম করতে সক্ষম হতে চাই।

আমি নিজে ওয়েবসকেট সার্ভারে এসএসএল সক্ষম করতে চাই না তবে পরিবর্তে আমি পুরো জিনিসটিতে একটি এসএসএল স্তর যুক্ত করতে এনজিআইএনএক্স ব্যবহার করতে চাই।

সেখানকার প্রতিটি ওয়েব পৃষ্ঠা বলে যে আমি এটি করতে পারি না, তবে আমি জানি আমি এটি করতে পারি! যে আমাকে (নিজে) আমাকে কীভাবে প্রদর্শন করতে পারে তার জন্য ধন্যবাদ!

উত্তর:


185

কেবলমাত্র নোট করুন যে এনগিনেক্সের এখন 1.3.13 প্রকাশে ওয়েবসাইটসকেটগুলির জন্য সমর্থন রয়েছে। ব্যবহারের উদাহরণ:

location /websocket/ {

    proxy_pass ​http://backend_host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;

}

আপনি এনগিনেক্স চেঞ্জলগ এবং ওয়েবসকেট প্রক্সিং ডকুমেন্টেশনও যাচাই করতে পারেন ।


উপরে বর্ণিত মত একই টাইমআউট সংক্রান্ত সমস্যা রয়েছে;)
তৃতীয় এডেম্বর

5
@ থার্ডইডেন: সময়সীমার সমস্যা, proxy_read_timeoutকাজগুলির জন্য, আমি উত্তরটি সম্পাদনা করেছি।
স্টিভ কেহলেট

2
আমার এই কনফিগারেশনটি কোথায় রাখা উচিত এবং ব্যাকেন্ড_হোস্টটি কী?
আয়সেননৌসি

3
@ সেকাই: locationএকটি serverবা অন্য locationনির্দেশকের মধ্যে একটি নির্দেশিকা দেওয়া হয় ( অবস্থানের ডকগুলি দেখুন )। backend_hostএটি একটি upstream( আপস্ট্রিম ডক্স দেখুন ) - এক বা সার্ভারের একটি গ্রুপ যা আপনি প্রক্সি করে যাবেন।
র‌দকো দিনভ

1
এই সময়সীমা সমস্যা সম্পর্কে কি? এটি এড়াতে আমাদের কি সত্যিই খুব বেশি সংখ্যায় সেট করতে হবে? এখন আর কোনও মার্জিত সমাধান নেই?
মোহাম্মদ নুরাল্ডিন

54

কোনও ভয় নেই, কারণ অপ্স প্রোগ্রামারদের একটি সাহসী গোষ্ঠী একটি ব্র্যান্ডের সাথে নতুন nginx_tcp_proxy_module ছড়িয়ে দিয়ে পরিস্থিতি সমাধান করেছে

আগস্ট 2012-এ লিখিত, সুতরাং আপনি যদি ভবিষ্যতে হন তবে আপনার হোমওয়ার্ক করা উচিত।

পূর্বশর্ত

ধরে নিই আপনি সেন্টোস ব্যবহার করছেন:

  • এনজিআইএনএক্সের বর্তমান উদাহরণটি সরান (এর জন্য ডেভ সার্ভার ব্যবহারের পরামর্শ দিন)
  • যদি সম্ভব হয় তবে আপনার পুরানো এনজিআইএনএক্স কনফিগারেশন ফাইলগুলি সংরক্ষণ করুন যাতে আপনি সেগুলি পুনরায় ব্যবহার করতে পারেন (এতে আপনার init.d/nginxস্ক্রিপ্ট রয়েছে )
  • yum install pcre pcre-devel openssl openssl-devel এবং এনজিআইএনএক্স নির্মাণের জন্য অন্য কোনও প্রয়োজনীয় libs
  • এখানে গিটহাব থেকে এনজিনেক্স_টিসিপি_প্রক্সি_মডিউল https://github.com/yaoweibin/nginx_tcp_proxy_module পান এবং আপনি যে ফোল্ডারটি রেখেছেন তা মনে রাখবেন (নিশ্চিত করুন এটি জিপ করা হয়নি)

আপনার নতুন এনজিআইএনএক্স তৈরি করুন

আবার, CentOS ধরে:

  • cd /usr/local/
  • wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
  • tar -xzvf nginx-1.2.1.tar.gz
  • cd nginx-1.2.1/
  • patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
  • ./configure --add-module=/path/to/nginx_tcp_proxy_module --with-http_ssl_module (আপনার যদি প্রয়োজন হয় তবে আপনি আরও মডিউল যুক্ত করতে পারেন)
  • make
  • make install

ঐচ্ছিক:

  • sudo /sbin/chkconfig nginx on

Nginx সেট আপ করুন

আপনি যদি পুনরায় ব্যবহার করতে চান তবে আপনার পুরানো কনফিগারেশন ফাইলগুলির অনুলিপি করতে মনে রাখবেন।

গুরুত্বপূর্ণ:tcp {} আপনার কনফিডের সর্বোচ্চ স্তরে আপনাকে একটি নির্দেশিকা তৈরি করতে হবে । এটি আপনার http {}নির্দেশের ভিতরে নেই তা নিশ্চিত করুন ।

নীচের উদাহরণগুলির কনফিগারেশনটি একটি একক প্রবাহের ওয়েবসকেট সার্ভার এবং এসএসএল এবং নন-এসএসএল উভয়ের জন্য দুটি প্রক্সি দেখায়।

tcp {
    upstream websockets {
        ## webbit websocket server in background
        server 127.0.0.1:5501;
        
        ## server 127.0.0.1:5502; ## add another server if you like!

        check interval=3000 rise=2 fall=5 timeout=1000;
    }   

    server {
        server_name _;
        listen 7070;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }

    server {
        server_name _;
        listen 7080;

        ssl on;
        ssl_certificate      /path/to/cert.pem;
        ssl_certificate_key  /path/to/key.key;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }
}

5
এটি বেশ সহায়ক ছিল, তবে আমি এখনও 60 সেকেন্ডে টাইমআউট পাচ্ছিলাম। আমি নিম্নলিখিতটি সেট করে এটি ঠিক করতে পেরেছি: টাইমআউট 43200000; ওয়েবসকেট_কনেক্ট_টাইমআউট 43200000; ওয়েবসকেট_ড্রেডটাইমআউট 43200000; ওয়েবসকেট_স্যান্ড_টাইমআউট 43200000; প্রক্সি_কনেক্ট_টাইমআউট 43200000; প্রক্সি_ড্রেড_আউটআউট 43200000; প্রক্সি_স্যান্ড_টাইমআউট 43200000;
jbg

2
ভাগ করে নেওয়ার জন্য ধন্যবাদ! পরে আমি বুঝতে পেরেছিলাম যে আমারও একই সমস্যা হচ্ছে এবং কাকতালীয়ভাবে ইয়াওয়েবিন নিজেও আমার গিটহাব ইস্যুতে ইস্যু # 28 তে আপনার মন্তব্যের লিঙ্ক দিয়ে জবাব দিয়েছেন। ছোট বিশ্ব ...
crockpotveggies

1
আমি একই HTTP পোর্ট থেকে ওয়েবসকেট পরিবেশন করতে চেয়েছিলাম এবং কেবল ব্রাউজারটি প্রমাণীকরণের পরে। দেখে মনে হচ্ছে এটি একই বন্দরে ওয়েবসকেট পরিচালনা করতে পারে না। লোকেরা কীভাবে এটি পরিচালনা করে?
uroc

1
আগত প্রোটোকল সনাক্ত করতে এটি কিছু সফ্টওয়্যার পরিবর্তন গ্রহণ করবে। যেহেতু ওয়েবসকেটগুলি আসলে এইচটিটিপি হ্যান্ডশেক হিসাবে শুরু হয় (টিসিপির চেয়ে উচ্চতর সফ্টওয়্যার স্তর) টিসিপি এবং এইচটিটিপি উভয় ট্র্যাফিকই পরিচালনা করতে আপনাকে আপনার অ্যাপটিকে টুইঙ্ক করতে হবে। আমি এখনই এটি করার কোনও উপায়ের প্রস্তাব দিতে পারি না।
ক্রকপটভেগিজি

2
যদি 2018 এর অন্যান্য লোকেরা এখানে আসে, এই নির্দেশিকাগুলি আর কাজ করবে না। সাম্প্রতিক নির্দেশাবলীর জন্য nginx.org/en/docs/http/websket.html এ যান বা নীচে হারলান টি উডের উত্তর দেখুন।
গ্যারিও

37

এটি আমার পক্ষে কাজ করেছে:

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

- থেকে নেওয়া হয়েছে: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf


3
আমার বিপরীত প্রক্সিটির পিছনে কাজ করতে টিমসিটির ওয়েব সকেট পেতে আমার সমস্যা হয়েছিল। আপনার # WebSocket supportছিলে আমার জন্য। আমি পূর্বে 443 অবগতির জন্য ভবিষ্যতে পাঠকদের উপর :), পোর্ট 400 ফরোয়ার্ড করার চেষ্টা ছিল কিন্তু ফলক কাজ
মারিও Tacke

আপনি সমাধানটি বের করেছেন? যেহেতু আমিও একই সমস্যা সম্মুখীন ছিল stackoverflow.com/q/53411060/7713811
Nɪsʜᴀɴᴛʜ

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

@ যে কেউ কল করেছেন জাভাস্ক্রিপ্ট?
অ্যান্ড্রু সিম্পসন

17

এসএনএস সহ। নেট কোর 2.0 এনগিনেক্সের জন্য

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
}

এটি আমার পক্ষে কাজ করেছে


সি # কোডটি কী? উইন্ডোজ / iis _server = নতুন ওয়েবসকেট সার্ভারের জন্য এটি বর্তমানে আমার কাছে রয়েছে ("ডাব্লুএসএস: //0.0.0.0: 8200 / ম্যাসেজর্লেয়ার") {শংসাপত্র = নতুন এক্স 509 সার্টিফেট 2 (পিএফএক্সফিলনাম, এসএসএলপ্যাসওয়ার্ড), রিস্টার্টএফটারলিস্টেরিয়ার = সত্য};
অ্যান্ড্রু সিম্পসন

আমি সিগন্যালআর
সিএ

এটি আমার জন্য কাজ করা একমাত্র সমাধান ছিল। ধন্যবাদ!
এম-কেতন 20

8

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

আমি আশা করি এটি পথে কাউকে সহায়তা করে ... আমি পুরোটা সময় ঘুরে দেখছিলাম ... দীর্ঘশ্বাস ফেলে ...

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
upstream nodeserver {
        server 127.0.0.1:8080;
}
server {
        listen 443 default_server ssl http2;
        listen [::]:443 default_server ssl http2 ipv6only=on;
        server_name mysite.com;
        ssl_certificate ssl/site.crt;
        ssl_certificate_key ssl/site.key;
        location /websocket { #replace /websocket with the path required by your application
                proxy_pass https://nodeserver;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_intercept_errors on;
                proxy_redirect off;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-NginX-Proxy true;
                proxy_ssl_session_reuse off;
            }
}

আমি চেষ্টা করেছি localtion /horizon, কিন্তু কাজ করছে না। কেবল localtion /বা location /websockifyকাজ করে। কেন জানি না ...
njuguoyi

6

পঙ্কজ মালহোত্রার একটি ভাল, সংক্ষিপ্ত নিবন্ধে এনজিআইএনএক্স-এর মাধ্যমে কীভাবে এটি করা যায় তা আলোচনা করা হয় এবং এটি এখানে উপলব্ধ ।

বেসিক এনজিআইএনএক্স কনফিগারেশন নীচে পুনরুত্পাদন করা হয়:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream appserver {
    server 192.168.100.10:9222; # appserver_ip:ws_port
}

server {
    listen 8888; // client_wss_port

    ssl on;
    ssl_certificate /path/to/crt;
    ssl_certificate_key /path/to/key;


    location / {
        proxy_pass http://appserver;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

1
এনজিআইএনএক্স-এর আধুনিক সংস্করণগুলিও কী সময়সীমা সম্পর্কিত সমস্যাগুলির সমাধান করে?
ক্রকপটভেগজিগুলি

2

Nginx / 1.14.0 ব্যবহার করে Using

আমার 8097 পোর্টে একটি ওয়েবসকেট-সার্ভার চলছে এবং ব্যবহারকারীরা 8098 বন্দরটিতে ডাব্লুএসএস থেকে সংযোগ স্থাপন করেছেন, এনগিনেক্স কেবল সামগ্রীটি ডিক্রিপ্ট করে এবং এটি ওয়েবসকেট সার্ভারে ফরোয়ার্ড করে

সুতরাং আমার কাছে এই কনফিগার ফাইলটি রয়েছে (আমার ক্ষেত্রে /etc/nginx/conf.d/default.conf)

server {
    listen   8098;
        ssl on;
        ssl_certificate      /etc/ssl/certs/combined.pem;
        ssl_certificate_key  /root/domain.key;
    location / {

        proxy_pass http://hostname:8097;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;

    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.