2013-05-09 11 views
15

मैं nginx के साथ वेबसाकेट + HTTP यातायात प्रॉक्सी करने की कोशिश कर रहा हूं।nginx और proxying WebSockets

मैं इस पढ़ा है: http://nginx.org/en/docs/http/websocket.html

मेरे config की तरह दिखता है:

1) कनेक्शन हर एक मिनट में बंद कर देता है:

http { 
    include  mime.types; 
    default_type application/octet-stream; 

    sendfile  on; 
    keepalive_timeout 65; 

    gzip on; 

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

    server { 
     listen 80; 
     server_name ourapp.com; 

     location/{ 
     proxy_pass http://127.0.0.1:100; 
     proxy_http_version 1.1; 
     proxy_redirect off; 
     proxy_set_header Host    $host; 
     proxy_set_header X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Upgrade   $http_upgrade; 
     proxy_set_header Connection  $connection_upgrade; 
     } 
    } 
} 

2 समस्याएं हैं।

2) मैं उसी पोर्ट पर HTTP और WS दोनों को चलाने के लिए चाहता हूं। आवेदन स्थानीय स्तर पर ठीक काम करता है, लेकिन अगर मैं एक ही पोर्ट पर HTTP और WS रख दिया और इस nginx प्रॉक्सी सेट करने का प्रयास है, मैं इस मिल:

WebSocket के लिए कनेक्शन 'ws: //ourapp.com/ws' असफल : अप्रत्याशित प्रतिक्रिया कोड: 200

ऐप लोड करना (HTTP) ठीक काम करता प्रतीत होता है, लेकिन वेबसाकेट कनेक्शन विफल रहता है।

उत्तर

12

समस्या 1: कनेक्शन के लिए एक मिनट में मरने के बाद, मुझे एहसास हुआ कि यह nginx टाइमआउट चर है। मैं या तो हमारे ऐप को थोड़ी देर में पिंग करने या टाइमआउट बढ़ाने के लिए बना सकता हूं। मुझे यकीन नहीं है कि मुझे इसे 0 के रूप में सेट करना चाहिए, मैंने बस एक मिनट में पिंग करने का फैसला किया और टाइमआउट को 90 सेकंड तक सेट किया। (keepalive_timeout)

समस्या 2: क्लाउडफ़्लेयर सीडीएन का उपयोग करते समय कनेक्टिविटी समस्याएं उत्पन्न हुईं। क्लाउडफ्लेयर त्वरण को अक्षम करने से समस्या हल हो गई।

वैकल्पिक रूप से मैं एक सबडोमेन बना सकता हूं और इसे "unaccelerated" के रूप में सेट कर सकता हूं और WS के लिए इसका उपयोग कर सकता हूं।

संबंधित मुद्दे