آیا تا به حال هنگام کار با برنامه‌ای با خطای زیر رو به رو شده‌اید؟

upstream sent too big header while reading response header from upstream
 

این خطا مربوط به وب سرور Nginx است. آیا می‌دانید چگونه می‌توان آن را در سیستم‌های لینوکسی ( که Nginx برروی آن اجرا می‌شود) برطرف کرد؟

در این مقاله، نحوه رفع خطای “upstream sent too big header while reading response header from upstream” مربوط به Nginx برروی سیستم‌های لینوکسی شرح داده شده است.

این خطا، ناشی از استفاده از Nginx در حالت reverse proxy یا FastCGI است که برای برنامه‌های PHP، Python ،Perl و سایر برنامه‌ها پیکربندی شده است. در این شرایط حتماً شما قابلیت بافر کردن پاسخ‌ها از سرور پروکسی را فعال کرده‌اید.

Nginx به منظور سرعت بخشیدن به درخواست‌ها طراحی شده است. از این رو، تمام درخواست‌های ارائه شده به یک سرور backend مانند Apache یا یک فرآیند FastCGI مانند PHP-FPM را بافر خواهد کرد. به طور پیش فرض، اندازه بافر برابر با یک صفحه حافظه ( به عنوان مثال 4K یا 8K، بسته به سیستم عامل‌ها) است. بنابراین، اگر اطلاعات ارسالی از آن مقدار سایز بافر بیشتر باشد، nginx چنین خطایی را در فایل لاگ وارد می‌کند.

برای مشاهده این فایل می‌توانید دستور زیر را وارد نمایید:

tail -f /var/log/nginx/www.nixcraft.com_error.log

که خطا را به صورت زیر مشاهده خواهید نمود:

upstream sent too big header while reading response header from upstream

 

این مطلب نیز ممکن است برای شما مفید باشد: پیکربندی گزارش های دسترسی و خطای Nginx

 

رفع خطای Nginx در حالت proxy یا reverse proxy

فایل nginx.conf یا فایل  دامنه مجازی (virtual domain) خود را ویرایش نمایید:

sudo vi /etc/nginx/vhosts.d/nixcraft.com.conf

موارد زیر را در بخش http یا server یا location تنظیم کنید:

server {
 proxy_busy_buffers_size   512k;
 proxy_buffers   4 512k;
 proxy_buffer_size   256k;
 # rest of nginx config #
}

 

سرور nginx را تست کرده و مجدداً بارگیری نمایید:

nginx -t
nginx -s reload

شرح موارد تنظیم شده به صورت زیر است.

proxy_busy_buffers_size: هنگامی‌که بافر کردن پاسخ سرور پروکسی فعال است، محدودیت اندازه کلی بافرهایی را نشان می‌دهد که می‌توانند مشغول ارسال یک پاسخ به کلاینت باشند؛ در حالی که هنوز آن پاسخ را نخوانده است. در این میان، می‌توان از بقیه بافرها برای خواندن پاسخ و در صورت لزوم بافر کردن بخشی از پاسخ به یک فایل موقت استفاده کرد. به طور پیش فرض، این سایز توسط سایز دو بافر تنظیم شده توسط دستورالعمل‌های proxy_buffer_size و proxy_buffers محدود می‌شود.

proxy_buffers: تعداد (4) و اندازه (512k) بافرهای مورد استفاده برای خواندن پاسخ از سرور پروکسی را برای یک اتصال (connection) تنظیم می‌کند.

proxy_buffer_size: اندازه بافر مورد استفاده برای خواندن قسمت اول پاسخ دریافت شده از سرور proxy را تنظیم می‌نماید.

 

به نظر شما، آیا می‌توان بافر پروکسی را خاموش کرد؟ بله می‌توان، اما به دلایل عملکردی توصیه نمی‌شود. با این وجود، در اینجا دستورالعمل‌های مورد نیاز برای انجام این کار ارائه شده است:

######################################################################################
## 'proxy_buffering off|on;' must be set in http, or server, or location directives ##
######################################################################################
http {
    proxy_buffering off;
    # rest of config
}

 

این مطلب نیز ممکن است برای شما مفید باشد: پیکربندی Nginx به عنوان یک وب سرور و reverse proxy برای Apache

 

بافرهای proxy_pass و fastcgi

به سراغ فایل پیکربندی PHP-fmp بروید:

## set php as server path ##
upstream php {
  server unix:/run/php/php-fpm.sock;
}
    # Pass all .php files onto a php-fpm/php-fcgi server.
     index index.php index.html;
     location ~ [^/]\.php(/|$) {
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass php;
      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                     return 404;
     }

دستورالعمل‌های زیر را بعد از fastcgi_pass اضافه نمایید:

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
    ## TUNE buffers to avoid error ##  
    fastcgi_buffers 16 32k;
    fastcgi_buffer_size 64k;
    fastcgi_busy_buffers_size 64k;

که در آن،

fastcgi_buffers: تعداد (16) و اندازه (32k) بافرهای مورد استفاده برای خواندن پاسخ از سرور FastCGI را برای یک اتصال تنظیم می‌کند.

fastcgi_buffer_size: اندازه بافر مورد استفاده برای خواندن قسمت اول پاسخ دریافت شده از سرور FastCGI را تعیین می‌نماید.

fastcgi_busy_buffers_size: هنگامی‌که قابلیت بافر کردن پاسخ‌ها از سرور FastCGI فعال است، محدودیت اندازه کلی بافرهایی را مشخص می‌کند که می‌توانند مشغول ارسال پاسخ به کلاینت باشند؛ در حالی که هنوز پاسخ به طور کامل خوانده نشده است. در ضمن، بقیه بافرها برای خواندن پاسخ و در صورت لزوم، بافر کردن بخشی از پاسخ به یک فایل موقت استفاده می‌شوند.

 

به نظر شما، آیا می‌توان بافر fastcgi را خاموش کرد؟ مجدداً بله، اما به دلایل عملکردی توصیه نمی‌شود. با این حال، در اینجا دستورالعمل‌های مورد نیاز برای این کار ارائه شده است:

##
## Enables or disables buffering of responses from the FastCGI server ##
## Must be set in http, server, location contaxt 
## fastcgi_buffering on | off;
##
location / {
   fastcgi_buffering off;
   # rest of config below #
}

 

این مطلب نیز ممکن است برای شما مفید باشد: رفع خطای 413 (Request Entity Too Large) در Nginx

 

آیا می‌توان بافر fastcgi و proxy را ترکیب کرد؟ بله، به شرطی که برای جلوگیری از ایجاد مشکل، موارد زیر را به بخشhttp  اضافه نمایید:

http {
 fastcgi_buffers 16 32k;
 fastcgi_buffer_size 64k;
 fastcgi_busy_buffers_size 64k;
 proxy_buffer_size   128k;
 proxy_buffers   4 256k;
 proxy_busy_buffers_size   256k;
 # rest of config #
}

 

در انتها، مطمئن شوید سرور PHP ،Python ،Perl ،Ruby خراب نشده است. بررسی نمایید آیا سرور Apache یک سرآیند (Header) نامعتبر به Nginx ارسال کرده است یا خیر. اطمینان حاصل کنید که سرور شما تحت حمله DoS یا DDoS نیست. این موارد می‌توانند خطاهای زیادی ایجاد کرده و بافر را سرریز نمایند. همواره با استفاده از دستور cat command ،grep command ،tail، فایل‌های مربوط به سرورهای backend یا upstream خود را برای یافتن سرنخ جستجو کنید:

tail -f /path/to/apache.log
grep -i error /var/log/nginx/error.log
egrep -i 'error|cri' /var/log/nginx/php.error.log

 

 

 

منبع:

cyberciti