nginx 65k বাইট পরে সংযোগ সমাপ্ত করে


11

আমি বন্দুকের অধীনে চলমান পাইথন অ্যাপ্লিকেশনটির ফ্রন্ট-এন্ড হিসাবে কনফিগার করা এনগিনেক্স পেয়েছি, তবে প্রায় 65 ক ডেটা প্রেরণের পরে এনজিনেক্স সংযোগ বন্ধ করছে।

উদাহরণস্বরূপ, আমি একটি ভিউ পেয়েছি যা দেখতে এরকম দেখাচ্ছে:

def debug_big_file(request):
    return HttpResponse("x" * 500000)

তবে আমি যখন এনজিএনএক্সের মাধ্যমে সেই ইউআরএলটি অ্যাক্সেস করি তখন আমি কেবল 65283 বাইট পাই:

$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
   0       1   65283

নোট করুন যে প্রত্যক্ষভাবে গ্যানিকর্ন অ্যাক্সেস করার সময় প্রত্যাশা অনুযায়ী কাজ করে:

$ curl http://localhost:1234/debug/big-file | wc
…
   0       1   500000

সম্পর্কিত nginx কনফিগারেশন:

location / {
    proxy_pass http://localhost:1234/;
    proxy_redirect off;
    proxy_headers_hash_bucket_size 96;
}

এবং nginx সংস্করণ 1.7.0

আরও কিছু তথ্য:

  • বয়সের সংখ্যা অনুরোধের অনুরোধ থেকে সামঞ্জস্যপূর্ণ, তবে এটি সামগ্রীর উপর ভিত্তি করে পরিবর্তিত হয় (আমি এটি প্রথমে একটি বৃহত পিএনজি ফাইল দিয়ে লক্ষ্য করেছি, যা 65,332 বাইট পরে ,৫,৩ after২ বাইট পরে কেটে গেছে)
  • 110k বাইট সঠিকভাবে প্রেরণ করা হয় (অর্থাত্, "x" * 110000সমস্ত 110,000 বাইট ফেরত দেয়), তবে 120k বাইট হয় না
  • tcpdump প্রস্তাব দেয় যে এনগিনেক্স একটি বন্দুকের কাছে আরএসটি প্যাকেট প্রেরণ করছে: nginx আরএসটি প্রেরণ করছে

(ক) গানিকর্ন কীভাবে ১১০ কে থেকে ১২০ কিলো বাইট আকারের উত্তরগুলি ফ্রেম করতে বেছে নিচ্ছে এবং (খ) এনজিনেক্স কীভাবে ১১০ কে এবং 120 কে বাইটের মধ্যে একই রেঞ্জের নমুনা পেডলোড আকারের জন্য তার ফ্রেমিং চয়ন করে তা দেখতে সহায়ক হবে। এইচটিটিপি যে তিনটি উপায়ে ডেটা ফ্রেম করতে পারে: সামগ্রীর দৈর্ঘ্য সরবরাহ করে; খণ্ডিত এনকোডিং না; বা শরীর সম্পূর্ণ হয়ে গেলে সকেটটি বন্ধ করার প্রতিশ্রুতি ব্যতীত কোনও ফ্রেমিং দেবেন না।
ব্র্যান্ডন রোডস

একটি সামগ্রীর দৈর্ঘ্যের শিরোনাম সরবরাহ করা হচ্ছে। দুজনের মধ্যে কী ঘটছে তা দেখার জন্য আমাকে প্যাকেট ডাম্প করতে দাও অন্যথায়…
ডেভিড ওয়ালভার

Hrm, খুব অদ্ভুত। tcpdump পরামর্শ দেয় যে nginx সক্রিয়ভাবে সংযোগটি আরএসটি-ইন করছে (সম্পাদনা দেখুন)। এনগিনেক্স এইচটিটিপি / 1.0 ব্যবহার করে Connection: close। আমি এটিও নিশ্চিত করেছি যে Content-Lengthশিরোনামটি সঠিক।
ডেভিড ওলবার 26'14

উত্তর:


10

ঠিক আছে! Nginx লগগুলি ডাবল চেক করার পরে, এটি সমস্যা হিসাবে দেখা গেল:

2014/05/26 16:50:56 [crit] 31396#0: *11 open() "…/proxy_temp/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 1.2.3.4, server: _, request: "GET /debug/big-file HTTP/1.1", upstream: "http://127.0.0.1:1234/debug/big-file", host: "example.com"

proxy_tempডিরেক্টরিটির অনুমতিগুলি কীভাবে বিশৃঙ্খলা পেয়েছিল যা এনগিনেক্সকে এটিতে সঠিকভাবে বাফার করা থেকে বিরত ছিল।


1
হ্যাঁ, আমি ঠিক ঠিক ঠিক এর মতো একটি সমস্যার সমাধান করেছি, এনজিনেক্স লগগুলি দেখেছি, একটি লাইন রয়েছে [crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream, করেছে sudo chown -R www-data:www-data /var/lib/nginx/এবং এটি স্থির হয়ে গেছে।
এপিজিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.