Nginx

2012-12-02 17 views
58

के माध्यम से इवेंटसोर्स/सर्वर-प्रेषित घटनाक्रम stream ब्लॉक के साथ सिनात्रा का उपयोग कर सर्वर पर।Nginx

get '/stream', :provides => 'text/event-stream' do 
    stream :keep_open do |out| 
    connections << out 
    out.callback { connections.delete(out) } 
    end 
end 

ग्राहक के पक्ष में:

var es = new EventSource('/stream'); 
es.onmessage = function(e) { $('#chat').append(e.data + "\n") }; 

जब मैं सीधे एप्लिकेशन का उपयोग करके, http://localhost:9292/ के माध्यम से, सब कुछ सही काम करता है। कनेक्शन लगातार है और सभी संदेश सभी ग्राहकों को पास कर दिए जाते हैं।

हालांकि जब यह निगेंक्स, http://chat.dev के माध्यम से जाता है, तो कनेक्शन गिरा दिया जाता है और एक दूसरे से दोबारा आग लग जाती है।

Nginx सेटअप मेरे लिए ठीक लग रहा है:

upstream chat_dev_upstream { 
    server 127.0.0.1:9292; 
} 

server { 
    listen  80; 
    server_name chat.dev; 

    location/{ 
    proxy_pass http://chat_dev_upstream; 
    proxy_buffering off; 
    proxy_cache off; 
    proxy_set_header Host $host; 
    } 
} 

location में keepalive 1024upstream अनुभाग के साथ ही proxy_set_header Connection keep-alive; में की कोशिश की।

कुछ भी नहीं है में मदद करता है :(

कोई लगातार कनेक्शन और संदेशों को किसी भी ग्राहकों को पारित नहीं किया।

उत्तर

122

आपका Nginx config सही है, तो आप सिर्फ याद आती है कुछ लाइनों।

यहाँ एक "जादू तिकड़ी" है location अनुभाग में

proxy_set_header Connection ''; 
proxy_http_version 1.1; 
chunked_transfer_encoding off; 

प्लेस उन्हें और यह w चाहिए: EventSource बनाने Nginx के माध्यम से काम ork।

तुम भी

proxy_buffering off; 
proxy_cache off; 

यह कर के एक अधिकारी तरीका नहीं है कि जोड़ने की जरूरत हो सकती है।

मैं "परीक्षण और त्रुटि" द्वारा इस के साथ समाप्त हो गया + "googling" :)

+0

ओह, वह था! अभी व्यस्त हूँ! सार्वजनिक रूप से मेरे उबेर-चैट लॉन्च करना! आपका बहुत बहुत धन्यवाद! –

+0

यह मेरे नोडिक्स सर्वर के लिए ngix के साथ अच्छी तरह से काम करता है, मैं EventSource.thanks का भी उपयोग कर रहा हूं। –

+1

बहुत अच्छा काम करता है। मैन, डीबग करना मुश्किल था। बहुत बहुत धन्यवाद! –

3

खुद खरोंच से इस बारे में न करें। Nginx एक अद्भुत घटना सर्वर है और इसमें मॉड्यूल हैं जो आपके अपस्ट्रीम सर्वर के किसी भी प्रदर्शन में गिरावट के बिना आपके लिए एसएसई को संभालेगा।

बाहर https://github.com/wandenberg/nginx-push-stream-module

तरह से यह काम करता है की जाँच करें ग्राहक (SSE का उपयोग कर ब्राउज़र) Nginx को जोड़ता है, और कनेक्शन बंद हो जाता है। प्रकाशक (Nginx के पीछे आपका सर्वर) इसी मार्ग पर Nginx को एक पोस्ट भेज देगा और उस समय Nginx ब्राउज़र में प्रतीक्षा EventSource श्रोता को तुरंत भेज देगा।

यह विधि आपके रूबी वेबसर्वर को "लंबे मतदान" एसएसई कनेक्शन को संभालने से कहीं अधिक स्केलेबल है।

5

एक और विकल्प आपकी प्रतिक्रिया में 'एक्स-एक्सेल-बफरिंग' शीर्षलेख 'मूल्य' के साथ शामिल करना है। Nginx विशेष रूप से इसका इलाज करता है, देखें http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering