อัปสตรีมส่งเฮดเดอร์ใหญ่เกินไปขณะอ่านการตอบสนองของส่วนหัวจากอัปสตรีม


227

ฉันได้รับข้อผิดพลาดประเภทนี้:

2014/05/24 11:49:06 [ข้อผิดพลาด] 8376 # 0: * 54031 upstream ส่งส่วนหัวที่ใหญ่เกินไปขณะที่อ่านส่วนหัวการตอบสนองจาก upstream ลูกค้า: 107.21.193.210 เซิร์ฟเวอร์: aamjanata.com คำขอ: "GET / the- ล้างสมอง-พงศาวดารสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the-brainwash-chronicles- ได้รับการสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- รัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/ % 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: / aamjanataco.th / ที่ล้างสมอง-พงศาวดารสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the- ล้างสมอง-พงศาวดารสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the-brainwash-chronicles- ได้รับการสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- รัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20https: //aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20https:/aamjanataco.th / ที่ล้างสมอง-พงศาวดารสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the- ล้างสมอง-พงศาวดารสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /% 20https: /aamjanata.com/the-brainwash-chronicles- ได้รับการสนับสนุนโดยรัฐคุชราตรัฐบาล /% 20ht

เหมือนเดิมเสมอ URL ซ้ำแล้วซ้ำอีกโดยคั่นด้วยเครื่องหมายจุลภาค ไม่สามารถหาสาเหตุที่ทำให้เกิดปัญหานี้ได้ ใครมีความคิด?

อัปเดต: ข้อผิดพลาดอื่น:

http request count is zero while sending response to client

นี่คือการกำหนดค่า มีสิ่งที่ไม่เกี่ยวข้องอื่น ๆ อยู่ แต่ส่วนนี้ถูกเพิ่ม / แก้ไข

fastcgi_cache_path /var/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
            #this should match value of "listen" directive in php-fpm pool
            server unix:/var/run/php5-fpm.sock;
    }

จากนั้นในบล็อกเซิร์ฟเวอร์: ตั้งค่า $ skip_cache 0;

    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
            set $skip_cache 1;
    }
    if ($query_string != "") {
            set $skip_cache 1;
    }

    # Don't cache uris containing the following segments
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
            set $skip_cache 1;
    }

    # Don't use the cache for logged in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
            set $skip_cache 1;
    }

    location / {
            # This is cool because no php is touched for static content.
            # include the "?$args" part so non-default permalinks doesn't break when using query string
            try_files $uri $uri/ /index.php?$args;
    }


    location ~ \.php$ {
            try_files $uri /index.php;
            include fastcgi_params;
            fastcgi_pass php;
            fastcgi_read_timeout 3000;

            fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $skip_cache;

            fastcgi_cache WORDPRESS;
            fastcgi_cache_valid  60m;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }`

การกำหนดค่าพร็อกซีของคุณไม่ถูกต้อง คุณสามารถแชร์การกำหนดค่าได้ไหม
Neo

คุณลองเพิ่มได้ไหม: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo

2
อาจมีการซ้ำซ้อนของUpstream ที่ใหญ่เกินไป - nginx +
codeigniter

คำตอบ:


406

เพิ่มสิ่งต่อไปนี้ในไฟล์ conf ของคุณ

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

160
ในขณะที่คำตอบของคุณนำฉันไปสู่การตอบสนองที่ถูกต้องคุณควรแสดงวิธีกำหนดขนาดบัฟเฟอร์ที่ถูกต้องและสาเหตุที่สำคัญ ไม่เช่นนั้นจะเป็นการถ่ายภาพในที่มืด ดูที่นี่เพื่อรับแนวคิดเกี่ยวกับการปรับขนาด: gist.github.com/magnetikonline/…
Wes Johnson

4
"fastcgi_buffer_size 32k;" เพียงอย่างเดียวไม่ทำงานฉันต้องการทั้งสองบรรทัดเพื่อให้ NginX รีสตาร์ท ฉันมาที่นี่เพราะมีข้อผิดพลาด 502 กับ NginX ที่เกิดจากปลั๊กอิน WordPress
PJ Brunet

6
หากfast_cgi_buffersไม่ช่วยลองproxy_buffers คำตอบด้านล่างโดย @amd
icc97

11
โปรดอธิบายเกี่ยวกับคำตอบนี้
Edson Horacio Junior

5
มันใช้งานได้สำหรับฉันฉันแค่ต้องการที่จะเพิ่มในอูบุนตู 16.04 ไฟล์การกำหนดค่า nginx ตั้งอยู่ที่/etc/nginx/nginx.confและค่าควรจะอยู่ใน http {... }
มาริโอ

134

หาก nginx ทำงานเป็นพร็อกซี / ย้อนกลับพร็อกซี

นั่นคือสำหรับผู้ใช้ของ ngx_http_proxy_module

นอกเหนือจากการfastcgiที่proxyโมดูลยังช่วยประหยัดหัวข้อการร้องขอในบัฟเฟอร์ชั่วคราว

ดังนั้นคุณอาจจำเป็นต้องเพิ่มproxy_buffer_sizeและproxy_buffersหรือปิดใช้งานทั้งหมด (โปรดอ่านเอกสารประกอบ nginx )

ตัวอย่างของการกำหนดค่าพร็อกซีบัฟเฟอร์

http {
  proxy_buffer_size   128k;
  proxy_buffers   4 256k;
  proxy_busy_buffers_size   256k;
}

ตัวอย่างการปิดใช้งานพร็อกซีบัฟเฟอร์ของคุณ (แนะนำสำหรับเซิร์ฟเวอร์แบบโพลยาว)

http {
  proxy_buffering off;
}

สำหรับข้อมูลเพิ่มเติม: เอกสารประกอบโมดูลพร็อกซี Nginx


8
"proxy_busy_buffers_size" ต้องมีขนาดน้อยกว่าขนาดทั้งหมด "proxy_buffers" ลบหนึ่งบัฟเฟอร์
chovy

คุณเป็นผู้ชาย! ขอบคุณ! ตัวเลือกแรกทำงานในแอป ruby ​​ของฉันบนราง
Nezir

อาจเป็นคำถามงี่เง่า แต่ฉันมีพร็อกซีที่ด้านหน้าของเซิร์ฟเวอร์ที่ส่งคืนข้อผิดพลาดนี้ การเปลี่ยนบัฟเฟอร์ทำงานได้ แต่ฉันได้รับข้อผิดพลาดใหม่ในเครื่องด้านใน writev() failed (104: Connection reset by peer) while sending to client การตั้งค่าพร็อกซีเหล่านั้นอาจแก้ไขข้อผิดพลาดนั้นหรือไม่และจะไปอยู่บนเซิร์ฟเวอร์ upstream หรือพร็อกซีหรือไม่
Adam Patterson

1
ทำไมproxy_buffers 4 ...? เนื่องจากค่าเริ่มต้นดูเหมือนจะเป็น 8
adrianTNT

23

upstream sent too big header while reading response header from upstream เป็นวิธีทั่วไปในการพูดของ nginx "ฉันไม่ชอบสิ่งที่ฉันเห็น"

  1. เธรดเซิร์ฟเวอร์ upstream ของคุณทำงานล้มเหลว
  2. เซิร์ฟเวอร์อัปสตรีมส่งส่วนหัวที่ไม่ถูกต้องกลับมา
  3. การแจ้งเตือน / คำเตือนที่ส่งคืนจาก STDERR โอเวอร์โฟลว์บัฟเฟอร์ของพวกเขาและทั้งสองอย่างนั้นและ STDOUT ถูกปิด

3: ดูที่บันทึกข้อผิดพลาดด้านบนข้อความเป็นสตรีมมิ่งที่มีบรรทัดที่บันทึกไว้ก่อนหน้าข้อความหรือไม่ PHP message: PHP Notice: Undefined index: ตัวอย่างข้อมูลจากลูปไฟล์บันทึกของฉัน:

2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
... // 20 lines of same
PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undef
2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "ta_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Firstname

คุณสามารถเห็นในบรรทัดที่ 3 จากด้านล่างที่ขีด จำกัด บัฟเฟอร์ถูกทำลายและเธรดถัดไปเขียนทับ จากนั้น Nginx ปิดการเชื่อมต่อและส่งคืน 502 ให้กับลูกค้า

2: บันทึกส่วนหัวทั้งหมดที่ส่งต่อคำขอตรวจสอบและตรวจสอบให้แน่ใจว่าเป็นไปตามมาตรฐาน (nginx ไม่อนุญาตให้มีสิ่งที่เก่ากว่า 24 ชั่วโมงเพื่อลบ / หมดอายุคุกกี้ส่งความยาวเนื้อหาที่ไม่ถูกต้องเนื่องจากข้อความผิดพลาดถูกบัฟเฟอร์ก่อนที่เนื้อหาจะถูกนับ .. ) ฟังก์ชั่นการเรียกใช้ getallheaders สามารถช่วยในสถานการณ์โค้ดที่เป็นนามธรรมได้ php รับส่วนหัวทั้งหมด

ตัวอย่างรวมถึง:

<?php
//expire cookie
setcookie ( 'bookmark', '', strtotime('2012-01-01 00:00:00') );
// nginx will refuse this header response, too far past to accept
....
?>

และนี่:

<?php
header('Content-type: image/jpg');
?>

<?php   //a space was injected into the output above this line
header('Content-length: ' . filesize('image.jpg') );
echo file_get_contents('image.jpg');
// error! the response is now 1-byte longer than header!!
?>

1: ตรวจสอบหรือสร้างบันทึกสคริปต์เพื่อให้แน่ใจว่าเธรดของคุณมาถึงจุดสิ้นสุดที่ถูกต้องและไม่ออกก่อนที่จะเสร็จสิ้น


3
คำตอบนี้กระแทกเล็บที่หัว บางครั้งมันไม่ใช่แค่การกำหนดค่าของ nginx แต่สิ่งที่ผลิตส่วนหัวจริง ๆ เมื่อ error_reporting มีการแจ้งเตือน แต่ display_errors ถูกปิดใน php.ini ข้อความทั้งหมดจะปรากฏขึ้นในส่วนหัวของ FCGI แทนที่จะเป็นเนื้อหา
Schien

17

คำแนะนำของ Plesk

ใน Plesk 12 ฉันมี nginx กำลังทำงานเป็น reverse proxy (ซึ่งฉันคิดว่าเป็นค่าเริ่มต้น) ดังนั้นคำตอบยอดนิยมปัจจุบันไม่ทำงานเหมือน nginx กำลังทำงานเป็นพร็อกซี

Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsผมไป

จากนั้นที่ด้านล่างของหน้านั้นคุณสามารถตั้งค่าคำสั่งเพิ่มเติม nginxซึ่งฉันตั้งให้เป็นการรวมกันของสองคำตอบด้านบนที่นี่:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;

1
ที่ไหน? กำหนดค่าใด
Redsandro

@Redsandro หากคุณไม่สามารถค้นหาได้ผ่านSubscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsฉันไม่แน่ใจว่าคุณหมายถึงอะไร?
icc97

นี่เป็นวิธีแก้ปัญหาสำหรับฉัน: โดเมน> ชื่อโดเมน> การตั้งค่า Apache & nginx> คำสั่ง nginx เพิ่มเติม Plesk Onyx เวอร์ชัน 17.8.11
dijkstra8x

1
ฉันเพิ่มไฟล์นี้ในไฟล์ใหม่/etc/nginx/conf.d/proxy.confและเริ่มใหม่ nginx ทำงานได้ดีขอบคุณ!
rubo77

6

หากคุณกำลังใช้กรอบงาน Symfony: ก่อนที่จะล้อเล่นกับการกำหนดค่า Nginx ให้ลองปิดการใช้งาน ChromePHP ก่อน

1 - เปิดแอป / config / config_dev.yml

2 - แสดงความคิดเห็นบรรทัดเหล่านี้:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP บรรจุข้อมูลการดีบัก json ที่เข้ารหัสในส่วนหัว X-ChromePhp-Data ซึ่งใหญ่เกินไปสำหรับการกำหนดค่าเริ่มต้นของ nginx ด้วย fastcgi

ที่มา: https://github.com/symfony/symfony/issues/8413#issuecomment-20412848


3

เราพบว่าเซิร์ฟเวอร์ของเราที่ประสบปัญหานี้มีการกำหนดค่า fpm ที่ไม่ถูกต้องส่งผลให้เกิดข้อผิดพลาด php / คำเตือน / คำเตือนที่ปกติแล้วจะถูกบันทึกลงดิสก์ถูกส่งไปยังซ็อกเก็ต FCGI ดูเหมือนว่ามีข้อผิดพลาดในการแยกวิเคราะห์เมื่อส่วนหนึ่งของส่วนหัวได้รับการแบ่งข้ามชิ้นบัฟเฟอร์

ดังนั้นการตั้งค่าphp_admin_value[error_log]เป็นสิ่งที่เขียนได้จริงและการรีสตาร์ท php-fpm ก็เพียงพอแล้วที่จะแก้ไขปัญหา

เราสามารถสร้างปัญหาขึ้นมาใหม่ด้วยสคริปต์ที่เล็กลง:

<?php
for ($i = 0; $i<$_GET['iterations']; $i++)
    error_log(str_pad("a", $_GET['size'], "a"));
echo "got here\n";

การเพิ่มบัฟเฟอร์ทำให้ยุค 502 นั้นยากที่จะตี แต่ไม่เป็นไปไม่ได้เช่นพื้นเมือง:

bash-4.1# for it in {30..200..3}; do for size in {100..250..3}; do echo "size=$size iterations=$it $(curl -sv "http://localhost/debug.php?size=$size&iterations=$it" 2>&1 | egrep '^< HTTP')"; done; done | grep 502 | head
size=121 iterations=30 < HTTP/1.1 502 Bad Gateway
size=109 iterations=33 < HTTP/1.1 502 Bad Gateway
size=232 iterations=33 < HTTP/1.1 502 Bad Gateway
size=241 iterations=48 < HTTP/1.1 502 Bad Gateway
size=145 iterations=51 < HTTP/1.1 502 Bad Gateway
size=226 iterations=51 < HTTP/1.1 502 Bad Gateway
size=190 iterations=60 < HTTP/1.1 502 Bad Gateway
size=115 iterations=63 < HTTP/1.1 502 Bad Gateway
size=109 iterations=66 < HTTP/1.1 502 Bad Gateway
size=163 iterations=69 < HTTP/1.1 502 Bad Gateway
[... there would be more here, but I piped through head ...]

fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;:

bash-4.1# for it in {30..200..3}; do for size in {100..250..3}; do echo "size=$size iterations=$it $(curl -sv "http://localhost/debug.php?size=$size&iterations=$it" 2>&1 | egrep '^< HTTP')"; done; done | grep 502 | head
size=223 iterations=69 < HTTP/1.1 502 Bad Gateway
size=184 iterations=165 < HTTP/1.1 502 Bad Gateway
size=151 iterations=198 < HTTP/1.1 502 Bad Gateway

ดังนั้นฉันเชื่อว่าคำตอบที่ถูกต้องคือแก้ไขการกำหนดค่า fpm ของคุณเพื่อบันทึกข้อผิดพลาดไปยังดิสก์


1

นี่ยังเป็นคำถาม SO ที่สูงที่สุดใน Google เมื่อค้นหาข้อผิดพลาดดังนั้นลองชนกัน

เมื่อได้รับข้อผิดพลาดนี้และไม่ต้องการดำดิ่งลงสู่การตั้งค่า NGINX ทันทีคุณอาจต้องการตรวจสอบผลลัพธ์ของคุณไปยังคอนโซลการดีบัก ในกรณีของฉันฉันส่งเอาต์พุตข้อความไปยังคอนโซล FirePHP / Chromelogger และเนื่องจากสิ่งนี้ถูกส่งทั้งหมดเป็นส่วนหัวจึงทำให้เกิดการโอเวอร์โฟลว์

อาจไม่จำเป็นต้องเปลี่ยนการตั้งค่าเว็บเซิร์ฟเวอร์หากข้อผิดพลาดนี้เกิดจากเพียงแค่ส่งข้อความบันทึกจำนวนบ้า


0

ฉันไม่แน่ใจว่าปัญหาเกี่ยวข้องกับส่วนหัวของ php ที่ส่ง ตรวจสอบให้แน่ใจว่าเปิดใช้งานการบัฟเฟอร์ วิธีง่ายๆคือการสร้างไฟล์ proxy.conf:

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffering         on;
proxy_buffer_size       128k;
proxy_buffers           4 256k;
proxy_busy_buffers_size 256k;

และไฟล์ fascgi.conf:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_buffers 128 4096k;
fastcgi_buffer_size 4096k;
fastcgi_index  index.php;
fastcgi_param  REDIRECT_STATUS    200;

ถัดไปคุณต้องเรียกพวกเขาในเซิร์ฟเวอร์กำหนดค่าเริ่มต้นด้วยวิธีนี้:

http {
  include    /etc/nginx/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  #access_log   /logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
 # ........
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.