NGINX प्रॉक्सी वेबसोकेट्स को रिवर्स करें और SSL सक्षम करें (wss: //)?


136

मैं अपने दम पर NGINX के निर्माण में बहुत खोया और नया हूं, लेकिन मैं एक अतिरिक्त परत के बिना सुरक्षित वेबस्कैट को सक्षम करने में सक्षम होना चाहता हूं।

मैं एसएसएल को वेबसैट सर्वर पर ही सक्षम नहीं करना चाहता, लेकिन इसके बजाय मैं पूरी बात में एक एसएसएल परत को जोड़ने के लिए एनजीआईएनएक्स का उपयोग करना चाहता हूं।

हर वेब पेज कहता है कि मैं ऐसा नहीं कर सकता, लेकिन मुझे पता है कि मैं कर सकता हूँ! जो भी (खुद को) मुझे धन्यवाद दिखा सकता है कि कैसे!

जवाबों:


185

बस ध्यान दें कि nginx के पास अब रिलीज 1.3.13 पर Websockets का समर्थन है। उपयोग का उदाहरण:

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;

}

आप nginx चैंज और वेबसॉकेट प्रॉक्सिंग डॉक्यूमेंट भी देख सकते हैं ।


इसका वही समयबाह्य मुद्दा है जैसा कि ऊपर व्यक्त किया गया है;)
एडन

5
@ 3rdEden: टाइमआउट मुद्दों, proxy_read_timeoutकार्यों के लिए, मैंने उत्तर संपादित किया।
स्टीव केहलेट

2
मुझे यह कॉन्फ़िगरेशन कहाँ रखना चाहिए और backend_host क्या है?
ऐसेंउसी

3
@ सेकाई: एक locationनिर्देश एक serverया दूसरे locationनिर्देश के भीतर रखा जाता है ( स्थान डॉक्स देखें )। backend_hostएक है upstream( अपस्ट्रीम डॉक्स देखें ) - एक या सर्वर का एक समूह जिसे आप प्रॉक्सी करेंगे।
राडोको दिनेव

1
इस टाइमआउट समस्या के बारे में क्या? क्या हम वास्तव में इसे से बचने के लिए एक बहुत बड़ी संख्या में सेट करना चाहते हैं? अब कोई और अधिक सुंदर समाधान नहीं है?
मोहम्मद नौरेलिन

54

कोई डर नहीं है, क्योंकि ऑप्स प्रोग्रामर्स के एक बहादुर समूह ने नए nginx_tcp_proxy_module स्पेंकिंग ब्रांड के साथ स्थिति को हल किया है

अगस्त 2012 में लिखा गया था, इसलिए यदि आप भविष्य से हैं तो आपको अपना होमवर्क करना चाहिए।

आवश्यक शर्तें

मान लें कि आप CentOS का उपयोग कर रहे हैं:

  • NGINX का वर्तमान उदाहरण निकालें (इसके लिए dev सर्वर का उपयोग करने का सुझाव दें)
  • यदि संभव हो, तो अपनी पुरानी NGINX कॉन्फिग फाइलों को सेव करें ताकि आप उन्हें फिर से इस्तेमाल कर सकें (जिसमें आपकी init.d/nginxस्क्रिप्ट शामिल है )
  • yum install pcre pcre-devel openssl openssl-devel और NGINX के निर्माण के लिए कोई अन्य आवश्यक कार्य
  • जाओ nginx_tcp_proxy_module यहाँ GitHub से https://github.com/yaoweibin/nginx_tcp_proxy_module और फोल्डर याद जहां आप इसे रख दिया गया (सुनिश्चित करें कि यह ज़िपित नहीं है)

अपनी नई NGINX बनाएँ

फिर, मान लेता है 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; websocket_connect_timeout 43200000; websocket_read_timeout 43200000; websocket_send_timeout 43200000; प्रॉक्सी_कनेक्ट_टाइमआउट 43200000; xy_read_timeout 43200000; प्रॉक्सी_सेंड_टाइमआउट 43200000;
jbg

2
साझा करने के लिए धन्यवाद! मुझे बाद में एहसास हुआ कि मुझे भी इसी तरह की समस्याएँ हो रही हैं, और संयोग से योहेबिन ने खुद भी मेरे GitHub मुद्दे पर अपनी टिप्पणी # 28 की टिप्पणी के लिंक के साथ उत्तर दिया। छोटी सी दुनिया ...
crockpotveggies

1
मैं उसी http पोर्ट से वेबसोकेट की सेवा करना चाहता था और उसके बाद ही ब्राउज़र को प्रमाणित किया गया था। ऐसा लगता है कि यह एक ही पोर्ट पर वेबस्केट को संभाल नहीं सकता है। लोग इसे कैसे संभालते हैं?
19

1
यह आने वाले प्रोटोकॉल का पता लगाने के लिए कुछ सॉफ्टवेयर संशोधन करेगा। चूंकि वेबसॉकेट वास्तव में एक HTTP हैंडशेक (टीसीपी की तुलना में एक उच्च सॉफ़्टवेयर स्तर) के रूप में शुरू होता है, आपको टीसीपी और एचटीटीपी ट्रैफ़िक दोनों को संभालने के लिए अपने ऐप को ट्वीक करना होगा। मैं अभी तक ऐसा करने का तरीका सुझा नहीं सकता।
क्रॉकपोटवेजीज

2
यदि 2018 के अन्य लोग यहां आते हैं, तो ये निर्देश किसी और काम नहीं करते हैं। हाल के निर्देशों के लिए nginx.org/en/docs/http/websocket.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/df67cd92f71bfcb513b343beaa89cb33ab0fb05/simple-wss.conf


3
मुझे अपने रिवर्स प्रॉक्सी के पीछे काम करने के लिए TeamCity के वेब सॉकेट प्राप्त करने में परेशानी हुई। तुम्हारे # WebSocket supportछीने ने मेरे लिए किया। मैं पहले पोर्ट 400 को फॉरवर्ड करने की कोशिश कर रहा था, हालाँकि wss 443 से अधिक काम करता है। FYI करें भविष्य के पाठक :)
मारियो ताके

क्या आपने इसका हल खोज लिया है? जब से मैं भी एक ऐसी ही समस्या का सामना करना पड़ा stackoverflow.com/q/53411060/7713811
Nɪsʜᴀɴᴛʜ

मुझे यह उत्तर सबसे अच्छा लगता है, जैसा कि बहुत से लोग (अपने आप से) वेबस्केट और नियमित HTTP2 दोनों के लिए उपयोग करते हैं।
मिकमेकाना

@ किसी को भी कॉलिंग जावास्क्रिप्ट क्या होगा?
एंड्रयू सिम्पसन

17

SSL के साथ .net कोर 2.0 Nginx के लिए

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;
}

इसने मेरे लिए काम किया


c # कोड क्या है। मेरे पास वर्तमान में यह विंडोज़ / iis _server = new WebSocketServer ("wss: //0.0.0.0: 8200 / MessageRelayer" के लिए है) {प्रमाणपत्र = new X509Certificate2 (PfxileName, SslPassword), RestartAfterListenError = true};
एंड्रयू सिम्पसन

मैं सिग्नल का उपयोग कर रहा हूँ
Altair CA

यह एकमात्र समाधान था जिसने मेरे लिए काम किया। धन्यवाद!
एम-कीतन

8

मेरे लिए, यह proxy_passस्थान सेटिंग में नीचे आया । मुझे HTTPS प्रोटोकॉल का उपयोग करने के लिए बदलने की जरूरत है, और चीजों के नोड सर्वर साइड पर एक मान्य एसएसएल प्रमाणपत्र स्थापित किया गया है। इस तरह जब मैं एक बाहरी नोड सर्वर को पेश करता हूं, तो मुझे केवल आईपी बदलना पड़ता है और बाकी सब कुछ समान कॉन्फ़िगरेशन रहता है।

मुझे उम्मीद है कि यह रास्ते में किसी की मदद करता है ... मैं पूरे समय समस्या को घूर रहा था ... आहें ...

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

पंकज मल्होत्रा ​​का एक अच्छा, संक्षिप्त लेख एनजीआईएनएक्स के साथ ऐसा करने के बारे में चर्चा करता है और यहां उपलब्ध है

मूल NGINX कॉन्फ़िगरेशन नीचे पुन: प्रस्तुत किया गया है:

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
NGINX के आधुनिक संस्करण क्या टाइमआउट मुद्दों को भी संबोधित करते हैं?
crockpotveggies

2

नगीनक्स / 1.14.0 का उपयोग करना

मेरे पास पोर्ट 8097 पर एक वेबसोकेट-सर्वर चल रहा है और उपयोगकर्ता पोर्ट 8098 पर wss से जुड़ते हैं, नग्नेक्स सिर्फ सामग्री को डिक्रिप्ट करता है और इसे वेबसैट सर्वर को अग्रेषित करता है।

तो मेरे पास यह कॉन्फ़िग फ़ाइल है (मेरे मामले में /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;

    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.