সার্ভার-প্রেরিত ইভেন্টগুলির জন্য (এসএসই) কোন এনগিনেক্স প্রক্সি কনফিগারেশন উপযুক্ত?


20

এনজিএনএক্স কনফিগারেশন এসএসইয়ের জন্য উপযুক্ত কি তা নিয়ে আমি বিভিন্ন প্রশ্ন পড়েছি এবং কী সেটিংস ব্যবহার করতে হবে সে সম্পর্কে কিছু বিভ্রান্তিকর ফলাফল নিয়ে এসেছি:

তাহলে সঠিক উত্তর কি?

উত্তর:


45

দীর্ঘ-চলমান সংযোগ

সার্ভার-প্রেরিত ইভেন্টস (এসএসই) একটি দীর্ঘ-চলমান এইচটিটিপি সংযোগ **, তাই শুরু করার জন্য আমাদের এটির প্রয়োজন:

proxy_http_version 1.1;
proxy_set_header Connection "";

দ্রষ্টব্য: HTTP / 1.1 এ টিসিপি সংযোগগুলি ডিফল্টরূপে স্থির থাকে, সুতরাং সংযোগ শিরোনামটি খালি সেট করা সঠিক জিনিসটি করে এবং এটি Nginx পরামর্শ।

খণ্ডিত স্থানান্তর-এনকোডিং

এখন একদিকে; এসএসই প্রতিক্রিয়াগুলি কোনও সামগ্রী-দৈর্ঘ্যের শিরোনাম সেট করে না কারণ তারা জানতে পারবেন না যে কতগুলি ডেটা প্রেরণ করা হবে, পরিবর্তে তাদের ট্রান্সফার-এনকোডিং শিরোনাম [0] [1] ব্যবহার করা দরকার, কী স্ট্রিমিং সংযোগের জন্য অনুমতি দেয়। এছাড়াও নোট করুন: আপনি যদি কোনও সামগ্রী-দৈর্ঘ্য যোগ না করেন তবে বেশিরভাগ HTTP সার্ভার Transfer-Encoding: chunked;আপনার জন্য সেট করবে। আশ্চর্যের বিষয় হল, এইচটিটিপি চিংকিং বিরুদ্ধে সতর্ক করেছে এবং বিভ্রান্তির সৃষ্টি করে।

এই বিভ্রান্তি ডাব্লু 3 ইভেন্টসোর্সের বিবরণীর নোটস বিভাগে কিছুটা অস্পষ্ট সতর্কবার্তা থেকে উদ্ভূত:

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

কোনটি বিশ্বাস করতে নেতৃত্ব দেবে Transfer-Encoding: chunked;তা এসএসইর পক্ষে খারাপ কাজ। তবে: এটি অগত্যা ঘটনাটি নয়, কেবল তখনই সমস্যা হয় যখন আপনার ওয়েবসার্ভার আপনার জন্য কাজ করে চলেছে (আপনার ডেটা সম্পর্কে তথ্য না জেনে)। সুতরাং, বেশিরভাগ পোস্টগুলি পরামর্শ দিবে যে chunked_transfer_encoding off;এটি সাধারণ ক্ষেত্রে [3] এর জন্য প্রয়োজনীয় নয়।

বাফারিং (আসল সমস্যা)

যেখানে বেশিরভাগ সমস্যা থেকেই আসে অ্যাপ অ্যাপ্লিকেশন সার্ভার এবং ক্লায়েন্টের মধ্যে যে কোনও ধরণের বাফারিং। ডিফল্টরূপে [৪], এনগিনেক্স ব্যবহার করে proxy_buffering on( আপনার অ্যাপ্লিকেশনটি দেখে uwsgi_bufferingএবং তার fastcgi_bufferingউপর নির্ভর করে) এবং আপনি আপনার ক্লায়েন্টের কাছে বেরিয়ে আসতে চাইলে বাছাই করতে পারেন। এটি একটি খারাপ জিনিস কারণ এসএসইয়ের রিয়েলটাইম প্রকৃতি ভেঙে যায়।

তবে, proxy_buffering offসমস্ত কিছুর দিকে ঘুরার পরিবর্তে, X-Accel-Buffering: noকেবলমাত্র এসএসই ভিত্তিক প্রতিক্রিয়ার জন্য বাফারিং বন্ধ করতে এবং আপনার অ্যাপ্লিকেশন থেকে আসা সমস্ত প্রতিক্রিয়াগুলির জন্য নয়, আপনার অ্যাপ্লিকেশন সার্ভার কোডটিতে রেসপন্স শিরোনাম হিসাবে যুক্ত করা ভাল (যদি আপনি সক্ষম হয়ে থাকেন) best সার্ভার। বোনাস: এটি uwsgiএবং এর জন্যও কাজ করবে fastcgi

সমাধান

এবং তাই সত্যই গুরুত্বপূর্ণ সেটিংস হ'ল অ্যাপ-সার্ভারের প্রতিক্রিয়া শিরোনাম:

Content-Type: text/event-stream;
Cache-Control: no-cache;
X-Accel-Buffering: no;

এবং সম্ভাব্যভাবে কিছু পিং প্রক্রিয়া প্রয়োগ করা যাতে সংযোগটি খুব বেশি সময় অলস না থাকে। এর বিপদটি হ'ল এনগিনেক্স keepaliveসেটিংটি ব্যবহার করে অলস সংযোগগুলি বন্ধ করে দেবে ।


[0] https://tools.ietf.org/html/rfc2616#section-3.6
[1] https://en.wikedia.org/wiki/Chunked_transfer_encoding
[2] https://www.w3.org/TR / 2009 / ডাব্লুডি-ইভেন্টসোর্স -20091029 / # পাঠ্য-ইভেন্ট-স্ট্রিম
[3] https://github.com/phawg/html/issues/515
[4] http://nginx.org/en/docs/http/ এনজিএক্স_এইচটিপি_প্রক্সি_মডিউল এইচটিএমএল # প্রক্সি_বফারিং
[5] https://tools.ietf.org/html/rfc7230#section-6.3
[6] https://gist.github.com/CMCDragonkai/6bfade6431e9ffb7fe88


পিং প্রক্রিয়াটি কী তা কী আপনি বিশদভাবে বলতে পারেন? এটি কি চ্যানেলটিতে খালি বার্তাটি চাপ দিচ্ছে? আমি এনগিনেক্স এবং অ্যাপ্লিকেশন স্তরের শিরোনাম সেট আপ করেছি তবে আমি ইভেন্ট-উত্সের শেষ পয়েন্টগুলির জন্য এনগিনেক্স থেকে 504 টাইমআউট পাচ্ছি।
wgwz

একটি পিং কিছু সংযোগের মধ্যবর্তী সময়ে কিছু পাঠানো (বোগাস) ডেটা হবে, ক্লায়েন্টের উপর আপনি এই পিংটি পরিচালনা করতে পারেন এবং এটিকে উপেক্ষা করতে পারেন। দ্রষ্টব্য: যদি আপনার সংযোগটি কিছুতেই কাজ করে না, পিংিং সাহায্য করবে না, অন্য কিছু ভুল।
সি 4:25

2
আমি প্রস্তাবিত প্রতিক্রিয়া শিরোনাম যোগ করেছি এবং এটি কার্যকর। আমি nginx v1.12 কনফিগারেশনে কোনও পরিবর্তন করেছি এবং এখনও পর্যন্ত কোনও সমস্যা নেই।
মিক্কেল

1
যোগ করা হচ্ছে X-Accel-Buffering: noহেডার আমার জন্য কী ছিল, কিন্তু গুরুত্বপূর্ণ হল, আমি কি ছিল যেমন @ c4urself লিখেছিলেন: "যোগ এক্স-accel-বাফারিং: কোন একটি প্রতিক্রিয়া হেডার যেমন আপনার অ্যাপ্লিকেশন সার্ভার কোডে "। আমার এনজিএনএক্স কনফিগারেশনের একটি অবস্থান বিভাগে এই শিরোনামটি যুক্ত করা কার্যকর হয়নি - অ্যাপ্লিকেশন শেষ / সমাপ্ত না হওয়া পর্যন্ত পুরো ইভেন্ট স্ট্রিম প্রেরণের জন্য অপেক্ষা করেছিল।
এমডিমাওয়ার

Is proxy_http_version 1.1; প্রয়োজনীয়? আমি একটি ব্রাউজার থেকে 6 টিরও বেশি এসএসই স্ট্রিম চালানোর চেষ্টা করছি এবং তাই আমার এইচটিটিপি 2 দরকার।
বিলাল ফজলানী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.