Nginx ने लंबे समय से प्रतीक्षित वेबसोकेट प्रॉक्सी कार्यक्षमता को जोड़ा है।
इस संबंध में, मैं विन्यास और छोटे विवरण साझा करने में जल्दबाजी करता हूं।
जो लोग नहीं जानते थे, पहले थर्ड-पार्टी मॉड्यूल के माध्यम से निकटता संभव थी, उन प्रतिबंधों के साथ जो कई के अनुरूप नहीं थे। खैर, हाँ हम उसके बारे में नहीं हैं।
अब एक पोर्ट पर आप http और ws ट्रैफ़िक को बढ़ा सकते हैं, उदाहरण के लिए, एक एसएसएल प्रमाणपत्र के तहत, और यह सब परिचित कस्टम सिंटैक्स के साथ।
Ws संस्करण 1.3.13 से शुरू हो रहा है, और आज ही उन्होंने 1.3.14 के लिए ngx_http_uwsgi_module और ngx_http_scgi_module मॉड्यूल में समर्थन जोड़ा है
यह वही है जो प्रलेखन उपयोग किए गए तंत्र के बारे में कहता है।
HTTP / 1.1 से क्लाइंट और सर्वर के बीच कनेक्शन को WebSocket में बदलने के लिए, HTTP / 1.1 में उपलब्ध प्रोटोकॉल परिवर्तन तंत्र का उपयोग किया जाता है।
लेकिन एक कठिनाई है: चूंकि "अपग्रेड" एक हॉप-बाय-हॉप हेडर है, यह क्लाइंट से प्रॉक्सीनेट सर्वर पर प्रेषित नहीं होता है। प्रत्यक्ष प्रॉक्सी के साथ, क्लाइंट इस समस्या के आसपास काम करने के लिए कनेक्ट विधि का उपयोग कर सकते हैं। हालांकि, यह दृष्टिकोण रिवर्स प्रॉक्सी के साथ काम नहीं करता है, क्योंकि क्लाइंट को प्रॉक्सी सर्वर के बारे में कुछ भी नहीं पता है, और प्रॉक्सी सर्वर पर विशेष प्रसंस्करण की आवश्यकता है।
संस्करण 1.3.13 से शुरू करते हुए, nginx ऑपरेशन का एक विशेष मोड प्रदान करता है जो आपको क्लाइंट और प्रॉक्साइड सर्वर के बीच एक सुरंग स्थापित करने की अनुमति देता है यदि प्रॉक्सी सर्वर कोड 101 (स्विचिंग प्रोटोकॉल) के साथ प्रतिक्रिया देता है, और क्लाइंट ने अनुरोध में "अपग्रेड" हेडर का उपयोग करके प्रोटोकॉल को बदलने के लिए कहा। ।
जैसा कि ऊपर उल्लेख किया गया है, "अपग्रेड" और "कनेक्शन" सहित हॉप-बाय-हॉप हेडर, क्लाइंट से अनुमानित सर्वर पर प्रेषित नहीं होते हैं, इसलिए, प्रॉक्सी सर्वर के लिए क्लाइंट के इरादे के बारे में जानने के लिए प्रोटोकॉल को WebSocket में बदलने के लिए, इन हेडरों को स्पष्ट रूप से पारित किया जाना चाहिए। :
कॉन्फिग।
एक सरल उदाहरण:
location /ws/ { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
एक अधिक जटिल उदाहरण जिसमें प्रॉक्सी सर्वर के लिए अनुरोध हैडर में "कनेक्शन" फ़ील्ड का मान क्लाइंट अनुरोध हेडर में "अपग्रेड" फ़ील्ड की उपस्थिति पर निर्भर करता है:
http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { ... location /ws/ { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } }
और थोड़ा असंबद्ध, लेकिन महत्वपूर्ण पैरामीटर प्रॉक्सी_ड्रेड / टाइमआउट है, जो 60 के दशक में चूक जाता है, जिसके बाद कनेक्शन समाप्त हो जाता है, जो आमतौर पर डब्ल्यूएस के मामले में आवश्यक नहीं है।
इसलिए, हमने जोड़ा:
http { ... proxy_read_timeout 950s; ... }
सबसे अधिक संभावना है कि आपके एप्लिकेशन को अन्य टाइमआउट नंबर की आवश्यकता होगी, इसलिए इसे बिना सोचे-समझे कॉपी न करें;)