ngược dòng đã gửi tiêu đề quá lớn trong khi đọc tiêu đề phản hồi từ thượng nguồn


227

Tôi nhận được các loại lỗi:

2014/05/24 11:49:06 [lỗi] 8376 # 0: * 54031 ngược dòng đã gửi tiêu đề quá lớn trong khi đọc tiêu đề phản hồi từ thượng nguồn, máy khách: 107,21.193.210, máy chủ: aamjanata.com, yêu cầu: "GET / the- tẩy não-biên niên sử được tài trợ bởi gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp khu vực-by-gujarat-g chính /,% 20https: /aamjanata.com/the-brainwash- được tài trợ bởi gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-spocate-by-gujarat-g chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp. gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-spocate-by-gujarat-g chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-spocate-by-gujarat ,% 20https: /aamjanata.com/the-brainwash-chronicles- được tài trợ-by-gujarat-g chính phủ /,% 20https: / aamjanata.com / the-brainwash-biên niên sử được tài trợ bởi-gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp khu-by-gujarat-g chính /,% 20https: /aamjanata.com/the- tẩy não-biên niên sử được tài trợ bởi gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp khu vực-by-gujarat-g chính /,% 20https: /aamjanata.com/the-brainwash- được tài trợ bởi gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-spocate-by-gujarat-g chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp. gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp khu vực-by-gujarat-g chính /,% 20https: //aamjanata.com/the-brainwash-chronicles-spocate-by-gujarat /,%20https:/aamjanata.com/the-brainwash-chronicles- được tài trợ-by-gujarat-g chính /,% 20https: / aamjanata.com / the-brainwash-biên niên sử được tài trợ bởi-gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp khu-by-gujarat-g chính /,% 20https: /aamjanata.com/the- tẩy não-biên niên sử được tài trợ bởi gujarat-chính phủ /,% 20https: /aamjanata.com/the-brainwash-chronicles-sp khu vực-by-gujarat-g chính /,% 20https: /aamjanata.com/the-brainwash- được tài trợ bởi gujarat-chính phủ /,% 20ht

Luôn luôn là như vậy. Một url lặp đi lặp lại nhiều lần với dấu phẩy phân tách. Không thể tìm ra những gì gây ra điều này. Bất cứ ai có một ý tưởng?

Cập nhật: Một lỗi khác:

http request count is zero while sending response to client

Đây là cấu hình. Có những thứ không liên quan khác, nhưng phần này đã được thêm / chỉnh sửa

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;
    }

Và sau đó trong khối máy chủ: đặt $ 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";
    }`

cấu hình proxy của bạn có vẻ không đúng. Bạn có thể chia sẻ cấu hình?
Neo

bạn có thể thử thêm: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo

Câu trả lời:


406

Thêm phần sau vào tập tin conf của bạn

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

160
Trong khi câu trả lời của bạn đưa tôi đến câu trả lời đúng, bạn nên chỉ ra cách xác định kích thước bộ đệm chính xác và lý do tại sao điều đó lại quan trọng. Nếu không thì đó là một phát súng trong bóng tối. Xem tại đây để có ý tưởng về kích thước: gist.github.com/magnetikonline/ Kẻ
Wes Johnson

4
"fastcgi_buffer_size 32k;" Một mình không hoạt động, tôi cần cả hai dòng để NginX khởi động lại. Tôi đến đây vì lỗi 502 với NginX do plugin WordPress gây ra.
PJ Brunet

6
Nếu fast_cgi_bufferskhông giúp được, hãy thử proxy_buffers câu trả lời dưới đây bởi @amd
icc97

11
Bất kỳ lời giải thích về câu trả lời này xin vui lòng.
Edson Horacio Junior

5
Nó hoạt động với tôi, tôi chỉ muốn thêm rằng trong ubfox 16.04, tệp cấu hình nginx được đặt tại /etc/nginx/nginx.confvà các giá trị sẽ nằm trong http {...}
Mario

134

Nếu nginx đang chạy như một proxy / proxy ngược

đó là, cho người dùng của ngx_http_proxy_module

Ngoài ra fastcgi, proxymô-đun cũng lưu tiêu đề yêu cầu trong bộ đệm tạm thời.

Vì vậy, bạn cũng có thể cần phải tăng proxy_buffer_sizeproxy_buffers, hoặc vô hiệu hóa hoàn toàn (Vui lòng đọc tài liệu nginx ).

Ví dụ về cấu hình bộ đệm proxy

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

Ví dụ về việc vô hiệu hóa bộ đệm proxy của bạn (được khuyến nghị cho các máy chủ bỏ phiếu dài)

http {
  proxy_buffering off;
}

Để biết thêm thông tin: Tài liệu mô-đun proxy Nginx


8
"proxy_busy_buffftimessize" phải nhỏ hơn kích thước của tất cả "proxy_buffers" trừ đi một bộ đệm
chovy

Bạn là người đàn ông! cảm ơn! tùy chọn đầu tiên hoạt động trong ứng dụng ruby ​​trên đường ray của tôi
Nezir

Có lẽ là một câu hỏi ngớ ngẩn, nhưng tôi có một proxy trước máy chủ đang trả lại lỗi này. Thay đổi bộ đệm hoạt động, nhưng tôi gặp một lỗi mới trên máy bên trong. writev() failed (104: Connection reset by peer) while sending to client Liệu các cài đặt proxy đó có thể khắc phục lỗi đó và sẽ đi trên máy chủ ngược dòng hoặc proxy?
Adam Patterson

1
Tại sao proxy_buffers 4 ...? Vì mặc định có vẻ là 8
adrianTNT

23

upstream sent too big header while reading response header from upstream là cách nói chung của nginx "Tôi không thích những gì tôi đang thấy"

  1. Chủ đề máy chủ ngược dòng của bạn bị hỏng
  2. Máy chủ ngược dòng đã gửi lại tiêu đề không hợp lệ
  3. Thông báo / Cảnh báo được gửi lại từ STDERR tràn bộ đệm của họ và cả nó và STDOUT đã bị đóng

3: Nhìn vào nhật ký lỗi phía trên tin nhắn, nó có phát trực tuyến với các dòng đã ghi trước tin nhắn không? PHP message: PHP Notice: Undefined index: Đoạn mã ví dụ từ một vòng lặp tệp nhật ký của tôi:

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

bạn có thể thấy trong dòng thứ 3 từ dưới lên rằng giới hạn bộ đệm đã bị đánh, bị phá vỡ và luồng tiếp theo được viết trên nó. Nginx sau đó đóng kết nối và trả lại 502 cho khách hàng.

2: ghi nhật ký tất cả các tiêu đề được gửi theo yêu cầu, xem xét chúng và đảm bảo chúng tuân thủ các tiêu chuẩn (nginx không cho phép bất cứ điều gì cũ hơn 24 giờ để xóa / hết hạn cookie, gửi độ dài nội dung không hợp lệ vì thông báo lỗi được đệm trước khi nội dung được tính. ..). Hàm gọi hàm getallheaders thường có thể giúp đỡ trong các tình huống mã trừu tượng php nhận tất cả các tiêu đề

những ví dụ bao gồm:

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

và điều này:

<?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: xác minh hoặc tạo nhật ký tập lệnh để đảm bảo luồng của bạn đạt đến điểm cuối chính xác và không thoát trước khi hoàn thành.


3
Câu trả lời này đánh vào đầu đinh. Đôi khi, đó không chỉ là cấu hình của nginx, mà là những gì thực sự tạo ra tiêu đề. Khi error_Vporting chứa các thông báo nhưng display_errors bị tắt trong php.ini, tất cả các thông báo sẽ hiển thị trong tiêu đề FCGI thay vì nội dung.
Schien

17

Hướng dẫn Plesk

Trong Plesk 12, tôi có nginx chạy như một proxy ngược (mà tôi nghĩ là mặc định). Vì vậy, câu trả lời hàng đầu hiện tại không hoạt động vì nginx cũng đang được chạy như một proxy.

Tôi đã đi đến Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Sau đó, ở dưới cùng của trang đó, bạn có thể đặt các chỉ thị nginx bổ sung mà tôi đặt là kết hợp của hai câu trả lời hàng đầu ở đây:

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

1
Ở đâu? Cấu hình nào?
Redsandro

@Redsandro Nếu bạn không thể tìm thấy nó qua Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsthì tôi không chắc ý của bạn là gì?
icc97

đây là giải pháp cho tôi: Tên miền> Tên miền> Cài đặt Apache & nginx> Chỉ thị nginx bổ sung Plesk Onyx Phiên bản 17.8.11
dijkstra8x

1
Tôi đã thêm nó vào một tập tin mới /etc/nginx/conf.d/proxy.confvà khởi động lại nginx, nó hoạt động tốt, cảm ơn!
rubo77

6

Nếu bạn đang sử dụng khung Symfony: Trước khi nhắn tin với cấu hình Nginx, trước tiên hãy thử tắt ChromePHP.

1 - Mở ứng dụng / config / config_dev.yml

2 - Nhận xét những dòng này:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP đóng gói thông tin gỡ lỗi được mã hóa json trong tiêu đề X-ChromePhp-Data, quá lớn so với cấu hình mặc định của nginx với fastcgi.

Nguồn: https://github.com/symfony/symfony/issues/8413#issuecomment-20412848


3

Cuối cùng chúng tôi nhận ra rằng một máy chủ của chúng tôi đã gặp phải sự cố này đã cấu hình fpm dẫn đến lỗi php / cảnh báo / thông báo thường được ghi vào đĩa đang được gửi qua ổ cắm FCGI. Dường như có một lỗi phân tích cú pháp khi một phần của tiêu đề được phân chia trên các phần đệm.

Vì vậy, thiết lập php_admin_value[error_log]một cái gì đó thực sự có thể ghi và khởi động lại php-fpm là đủ để khắc phục vấn đề.

Chúng tôi có thể tái tạo vấn đề với một tập lệnh nhỏ hơn:

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

Tăng bộ đệm khiến cho 502 khó bị tấn công hơn nhưng không phải là không thể, ví dụ: bản địa:

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

Vì vậy, tôi tin rằng câu trả lời đúng là: sửa cấu hình fpm của bạn để nó ghi lỗi vào đĩa.


1

Đây vẫn là câu hỏi SO cao nhất trên Google khi tìm kiếm lỗi này, vì vậy hãy khắc phục nó.

Khi gặp lỗi này và không muốn đi sâu vào cài đặt NGINX ngay lập tức, bạn có thể muốn kiểm tra kết quả đầu ra của mình cho bảng điều khiển gỡ lỗi. Trong trường hợp của tôi, tôi đã xuất ra vô số văn bản cho bảng điều khiển FirePHP / Chromelogger và vì tất cả điều này được gửi dưới dạng tiêu đề, nó đã gây ra tràn.

Có thể không cần thiết phải thay đổi cài đặt máy chủ web nếu lỗi này xảy ra do chỉ gửi số lượng thông điệp nhật ký điên rồ.


0

Tôi không chắc chắn rằng vấn đề có liên quan đến tiêu đề php đang gửi. Hãy chắc chắn rằng bộ đệm được kích hoạt. Cách đơn giản là tạo tệp 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;

Và một tập tin 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;

Tiếp theo, bạn cần gọi chúng trong máy chủ cấu hình mặc định của mình theo cách này:

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;
 # ........
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.