nginx আপলোড ক্লায়েন্ট_ম্যাক্স_দেহী_ আকার ইস্যু


117

আমি এনগিনেক্স / রুবি অন অন রেলগুলি চালাচ্ছি এবং ফাইলগুলি আপলোড করার জন্য আমার একটি সাধারণ মাল্টিপার্ট ফর্ম রয়েছে। যতক্ষণ না আমি আপলোড করতে চাইছি ফাইলের সর্বাধিক আকারকে সীমাবদ্ধ করার সিদ্ধান্ত না নেওয়া পর্যন্ত সবকিছু ঠিকঠাক কাজ করে। যে কি, আমি nginx সেট client_max_body_sizeকরতে 1 মি (1MB) এবং প্রতিক্রিয়া যখন যে নিয়ম বিরতি মধ্যে একটি HTTP 413 (অনুরোধ Entity Too Large এ) স্থিতির আশা।

সমস্যাটি হ'ল আমি যখন একটি 1.2 এমবি ফাইল আপলোড করি তখন HTTP 413 ত্রুটি পৃষ্ঠা প্রদর্শন করার পরিবর্তে ব্রাউজারটি কিছুটা স্তব্ধ হয়ে যায় এবং তারপরে "পৃষ্ঠাটি লোড করার সময় সংযোগটি পুনরায় সেট হয়ে যায়" বার্তাটি দিয়ে মারা যায়।

আমি এনজিনেক্সের প্রতিটি বিকল্পের প্রায় চেষ্টা করেছি, কিছুই কাজ করছে বলে মনে হচ্ছে না। কারও কি এ সম্পর্কে কোন ধারণা আছে?

এখানে আমার nginx.conf:

worker_processes  1;
timer_resolution  1000ms;
events {
    worker_connections  1024;
}

http {
    passenger_root /the_passenger_root;
    passenger_ruby /the_ruby;

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

    sendfile           on;
    keepalive_timeout  65;

    server {
      listen 80;
      server_name www.x.com;
      client_max_body_size 1M;
      passenger_use_global_queue on;
      root /the_root;
      passenger_enabled on;

      error_page 404 /404.html;
      error_page 413 /413.html;    
    }    
}

ধন্যবাদ।


**Edit**

পরিবেশ / ইউএ: উইন্ডোজ এক্সপি / ফায়ারফক্স 3.6.13

উত্তর:


128

nginx "দ্রুত ব্যর্থ হয়" যখন ক্লায়েন্টটি অবহিত করে যে এটি client_max_body_size413 প্রতিক্রিয়া প্রেরণ করে এবং সংযোগটি বন্ধ করে দেহের চেয়ে বড় কোনও দেহ পাঠাচ্ছে।

সম্পূর্ণ অনুরোধের শরীর প্রেরণ না করা পর্যন্ত বেশিরভাগ ক্লায়েন্ট প্রতিক্রিয়াগুলি পড়েন না। যেহেতু এনজিনেক্স সংযোগটি বন্ধ করে দেয়, ক্লায়েন্টটি বন্ধ সকেটে ডেটা প্রেরণ করে, একটি টিসিপি আরএসটি সৃষ্টি করে।

যদি আপনার এইচটিটিপি ক্লায়েন্ট এটি সমর্থন করে তবে এটি পরিচালনা করার সর্বোত্তম উপায় হ'ল Expect: 100-Continueহেডার পাঠানো send Nginx সঠিকভাবে 1.2.7 হিসাবে এই সমর্থন, এবং একটি সঙ্গে উত্তর দিতে হবে 413 Request Entity Too Largeপ্রতিক্রিয়া বদলে 100 Continueযদি Content-Lengthসর্বোচ্চ শরীর আকারের চেয়ে বড়।


1
ওহ, আমি বাইরে নির্দেশ করা উচিত এই উত্তরটি অনুমান যে ক্লায়েন্ট পাঠাচ্ছে Content-Lengthবদলে করছেন Transfer-Encoding: chunked
জো শ

2
Nginx লেখক মেলিং তালিকায় এটি ঠিক করার জন্য একটি প্যাচ পোস্ট করেছেন: nginx.2469901.n2.nabble.com/… যদিও এটি 1.2.x স্থিতিশীল শাখায় যুক্ত করা হবে কিনা তা কোনও শব্দ নেই।
জো শ

ধন্যবাদ, এটি আসলে অনেক কিছু ব্যাখ্যা করে। অবশ্যই মনে Expectহয় বড় অনুরোধগুলির জন্য যাওয়ার উপায়।
krukid

আমার জবাবটি আপডেট করে দেখুন যে আমি আগে উল্লিখিত প্যাচটি প্রতিশ্রুতিবদ্ধ ছিল এবং 1.2.7 প্রকাশে অন্তর্ভুক্ত করেছি।
জো শ

: শুধু একটা চমৎকার সিনট্যাক্স খুঁজছেন (যেমন আমি কাটিয়েছি) এর সময় বাঁচাতে request.setHeader(HttpHeaders.EXPECT, CONTINUE);সঙ্গে import org.apache.http.HttpHeaders;এবংimport static org.jboss.netty.handler.codec.http.HttpHeaders.Values.CONTINUE;
Erez কোহেন

48

আপনার আপলোডটি কি খুব শেষে মারা যায়? দুর্ঘটনার আগে 99%? ক্লায়েন্ট বডি এবং বাফারগুলি মূল কারণ এনজিনেক্স অবশ্যই আগত ডেটা বাফার করতে পারে। বডি কনফিগার (অনুরোধের বডির ডেটা) নির্দিষ্ট করে যে এনজিঙ্ক্স কীভাবে আপনার অ্যাপ্লিকেশনটির যুক্তিতে মাল্টি-পার্ট-ফর্ম ক্লায়েন্টদের বাইনারি ডেটার বর্ধিত প্রবাহ পরিচালনা করে।

cleanনির্দেশ nginx দ্বারা আপ মেমরি এবং খরচ সীমা সেটিং মুক্ত একটি ফাইলে ইনকামিং বাফার সঞ্চয় করতে এবং তারপর মুছে ফেলার মাধ্যমে ডিস্ক থেকে এই ফাইলটিকে পরে পরিষ্কার।

এর জন্য বাফারগুলিতে সেট body_in_file_onlyকরুন cleanএবং সামঞ্জস্য করুন client_max_body_size। মূল প্রশ্নের কনফিগারেশনে ইতিমধ্যে প্রেরণ ফাইল রয়েছে, সময়সীমাও বাড়িয়ে দেয়। আপনার স্থানীয় কনফিগারেশন, সার্ভার এবং HTTP প্রসঙ্গগুলি জুড়ে যথাযথ এটি ঠিক করতে আমি নীচের সেটিংসটি ব্যবহার করি।

client_body_in_file_only clean;
client_body_buffer_size 32K;

client_max_body_size 300M;

sendfile on;
send_timeout 300s;

এমনকি যদি এনজিন্স সঠিক HTTP 413 ফেরত দেয়, ইউএ এখনও অনুরোধ সংস্থার সম্পূর্ণতা প্রেরণ করে তবে কি তা হবে না? সেক্ষেত্রে আমি মনে করি @ জো-শ প্রস্তাবিত পদ্ধতির চেষ্টা করা ভাল।
krukid

@ ক্রুকিড যখন দেখে মনে হচ্ছে এনজিআইএনএক্স "দ্রুত ব্যর্থ হওয়ার আগে" আমরা 99% আপলোড সম্পূর্ণ পেয়েছি, আমি আপনার সাথে একমত হই। এই ক্ষেত্রে, সমস্ত লক্ষণগুলি অনুরোধের অবজেক্টের চারপাশে ইতিবাচক, অর্থাত্ নির্ণয়টি হ'ল অভ্যন্তরীণ সার্ভার অ্যাপ্লিকেশন যুক্তি ঠিক আছে - যা Nginx এর পিছনে চলে। সুতরাং সম্ভবত এটি অনুরোধটি ভালভাবে গঠন করা হয়েছে, তবে আমাদের প্রয়োজন তখন এনজিআইএনএক্স কেন প্রতিক্রিয়া বন্ধ করে দিয়েছে তা বিবেচনা করা উচিত। ক্লায়েন্ট_ম্যাক্স_বডি_সাইজ হ'ল প্রথম কনফিগারেশন বিকল্পটি আমরা দেখেছি, তারপরে বাফারগুলি বিবেচনা করুন, কারণ যথেষ্ট পরিমাণে আপলোডের সাথে সঠিক সমাধানটি আমাদের সার্ভারটি কতটা মেমরি পরিচালনা করতে পারে তার উপর নির্ভর করে।
বেন্ট কার্ডান

@ বেন্ট কার্ডান এই পদ্ধতিরটিকে আরও ভাল বলে মনে হয়েছিল এবং আমি এটি চেষ্টা করেছি। তবে আমি 4 এমবি ফাইলের জন্য প্রায় 20 সেকেন্ড পরেও 413 ত্রুটি পেয়েছি। আমার আপস্পিডগুলি 20 সেকেন্ডে 4 এমবি পরিচালনা করতে পারে না তাই তথ্যটি বেশ কিছুক্ষণ প্রবাহিত হওয়ার পরে এটি ঘটছে। থটস?
জেরোম

আমি nginx.conf ফাইল _client_max_body_size 300M এ পরিবর্তনগুলি যুক্ত করেছি; সেন্ডফিল চালু; সেন্ড টাইমআউটআউট 300 এস; _এটি আমার জন্য নিখুঁতভাবে কাজ করছে ধন্যবাদ
রমেশ চাঁদ

সমাধান আমার পক্ষে কাজ করে openshift php7 nginx
marlo

7

ডকুমেন্টেশন থেকে :

এটি মনে রাখা প্রয়োজন যে ব্রাউজারগুলি কীভাবে সঠিকভাবে এই ত্রুটিটি প্রদর্শন করতে হয় তা জানে না।

আমার সন্দেহ হয় যে এটি ঘটছে, আপনি যদি ফায়ারবগ বা লাইভ এইচটিটিপি শিরোনাম (উভয় ফায়ারফক্স এক্সটেনশন) এর মতো সরঞ্জামগুলি ব্যবহার করে এইচটিটিপিকে টু অ্যান্ড ফ্রো পরীক্ষা করেন তবে আপনি সত্যিই কী ঘটছে তা দেখতে সক্ষম হবেন।


1
আমি এখানে এটিও পেরিয়ে এসেছি: ফোরাম.nginx.org/read.php?2,2620 যেখানে এনজিনেক্স লেখক বলেছেন যে লোকেরা দীর্ঘসূত্রতা / সময় / দীর্ঘকালীন_আউটআউট পরিবর্তন করার চেষ্টা করতে পারে - যার উভয়ই আমার ক্ষেত্রে কোনও প্রভাব ফেলেনি। তদুপরি, আমি কেবল দেখতে পাই না যে আমি স্থির 5 এমবিপিএস সংযোগ সহ সহজেই 1MB সীমা সহ 1.2MB ফাইলটি আপলোড করি যখন স্থির সময়সীমা সমস্যা হতে পারে। আমি প্রতিক্রিয়া স্নিগ্ধ করেছি এবং এটি "সংযোগ: বন্ধ" শিরোনাম সহ 413 পৃষ্ঠাটি প্রেরণ করে তবে সংযোগটি বন্ধ হয়ে যায় বলে মনে হয় না।
krukid

আমি অনুমান করি যে আমার বিশ্বাস করতে খুব কষ্ট হয়েছে যে পুরোপুরি বৈধ 413 HTTP স্থিতি থাকলেও এটি ব্রাউজারগুলিতে আগুন দেয় না। আমি এমন অনেক জায়গাগুলি গুগল করেছি যেখানে লোকেরা পৃষ্ঠাটি থেকে মুক্তি পেতে পারে না এবং আমি এটি কখনও দেখিনি।
ক্রুকিড

আপনি যদি যাত্রী অক্ষম করেন তবে এটি কি সংযোগটি বন্ধ করে দেবে?
মার্ক রোজ

ঠিক আছে, আমি প্রতিক্রিয়াগুলি যাত্রীর সাথে এবং ছাড়াই তুলনা করেছি। যখন সবকিছু স্বাভাবিকভাবে চলতে থাকে এবং আমি আমার 1 এমবি সীমাবদ্ধতার চেয়ে কয়েকগুণ বড় (~ 14MB) ফাইল আপলোড করি আমি একাধিকবার 413 প্রতিক্রিয়া পাই (কারণ ক্লায়েন্ট খণ্ডগুলি প্রেরণ করে রাখে) এবং চূড়ান্ত "সংযোগ পুনঃস্থাপন" টাইম আউট হিসাবে দেখা যায় না। যাত্রী ছাড়া আমি একটি 413 তাত্ক্ষণিক প্রতিক্রিয়া পেয়েছি এবং সমস্ত অগ্রগতি বন্ধ হয়ে যায়, তবে আমি এখনও "সংযোগ পুনরায় সেট করুন" পৃষ্ঠাটি দেখি, আমার স্থির 413 এইচটিএমএল বা "সত্তা খুব বড়" বোঝায় এমন কিছুই নেই
ক্রুকিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.