hulu mengirim tajuk terlalu besar saat membaca tajuk respons dari hulu

227

Saya mendapatkan kesalahan semacam ini:

2014/05/24 11:49:06 [kesalahan] 8376 # 0: * 54031 hulu mengirim tajuk terlalu besar saat membaca tajuk respons dari hulu, klien: 107.21.193.210, server: aamjanata.com, permintaan: "DAPATKAN / the- brainwash-chronicles-disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the-brainwash-chronicles- disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/ ,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: / aamjanata.com / the-brainwash-chronicles-disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the- brainwash-chronicles-disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the-brainwash-chronicles- disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 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:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/ ,%20https:/aamjanata.com / the-brainwash-chronicles-disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the- brainwash-chronicles-disponsori-oleh-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-pemerintah /,% 20https: /aamjanata.com/the-brainwash-chronicles- disponsori-oleh-gujarat-pemerintah /,% 20ht

Selalu sama. Sebuah url berulang-ulang dengan tanda koma. Tidak tahu apa yang menyebabkan ini. Adakah yang punya ide?

Perbarui: Kesalahan lain:

http request count is zero while sending response to client

Di sini adalah konfigurasi. Ada hal-hal lain yang tidak relevan, tetapi bagian ini ditambahkan / diedit

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

Dan kemudian di blok server: set $ 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";
    }`
Vidyut
sumber
konfigurasi proxy Anda sepertinya tidak benar. Bisakah Anda berbagi konfigurasi?
Neo
dapatkah Anda mencoba menambahkan: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo
2
kemungkinan duplikat dari Hulu terlalu besar - nginx + codeigniter
dnozay

Jawaban:

406

Tambahkan berikut ini ke file conf Anda

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Neo
sumber
160
Sementara jawaban Anda menuntun saya ke respons yang benar, Anda harus menunjukkan cara menentukan ukuran buffer yang benar dan mengapa itu penting. Kalau tidak, ini tembakan dalam gelap. Lihat di sini untuk mendapatkan ide tentang ukuran: gist.github.com/magnetikonline/…
Wes Johnson
4
"fastcgi_buffer_size 32k;" sendirian tidak berhasil, saya perlu kedua baris untuk NginX untuk memulai kembali. Saya datang ke sini karena kesalahan 502 dengan NginX yang disebabkan oleh plugin WordPress.
PJ Brunet
6
Jika fast_cgi_bufferstidak membantu, coba proxy_buffers jawaban di bawah ini dengan @amd
icc97
11
Tolong, ada penjelasan tentang jawaban ini.
Edson Horacio Junior
5
Ini berfungsi untuk saya, saya hanya ingin menambahkan bahwa di ubuntu 16.04 file konfigurasi nginx berada di /etc/nginx/nginx.confdan nilainya harus masuk ke dalam http {...}
Mario
134

Jika nginx dijalankan sebagai proxy / proxy terbalik

yaitu untuk pengguna ngx_http_proxy_module

Selain itu fastcgi, proxymodul juga menyimpan header permintaan dalam buffer sementara.

Jadi, Anda mungkin perlu menambah proxy_buffer_sizedan proxy_buffers, atau menonaktifkannya sama sekali (Silakan baca dokumentasi nginx ).

Contoh konfigurasi penyangga proxy

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

Contoh menonaktifkan buffer proxy Anda (disarankan untuk server polling panjang)

http {
  proxy_buffering off;
}

Untuk informasi lebih lanjut: Dokumentasi modul proksi Nginx

amd
sumber
8
"proxy_busy_buffers_size" harus kurang dari ukuran semua "proxy_buffers" minus satu buffer
chovy
kamulah orangnya! Terima kasih! Opsi pertama bekerja di aplikasi ruby ​​on rails
Nezir
Mungkin pertanyaan konyol, tapi saya punya proxy di depan server yang mengembalikan kesalahan ini. Mengubah buffer berhasil, tetapi saya mendapatkan kesalahan baru pada mesin di dalam. writev() failed (104: Connection reset by peer) while sending to client Apakah pengaturan proxy itu mungkin memperbaiki kesalahan itu, dan apakah akan pergi di server hulu atau proxy?
Adam Patterson
1
Mengapa proxy_buffers 4 ...? Karena standar tampaknya 8
adrianTNT
23

upstream sent too big header while reading response header from upstream adalah cara umum nginx untuk mengatakan "Saya tidak suka apa yang saya lihat"

  1. Utas server hulu Anda macet
  2. Server hulu mengirim kembali header yang tidak valid
  3. Pemberitahuan / Peringatan yang dikirim kembali dari STDERR meluap buffer mereka dan keduanya dan STDOUT ditutup

3: Lihatlah log kesalahan di atas pesan, apakah itu mengalir dengan garis yang dicatat sebelum pesan? PHP message: PHP Notice: Undefined index: Cuplikan contoh dari loop file log saya:

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

Anda dapat melihat di baris ke-3 dari bawah bahwa batas penyangga dipukul, putus, dan utas berikutnya menulis di atasnya. Nginx kemudian menutup koneksi dan mengembalikan 502 ke klien.

2: catat semua tajuk yang dikirim per permintaan, tinjau dan pastikan sesuai dengan standar (nginx tidak mengizinkan apa pun yang lebih dari 24 jam untuk menghapus / kedaluwarsa kuki, mengirimkan panjang konten yang tidak valid karena pesan kesalahan disangga sebelum konten dihitung. ..) panggilan fungsi getallheaders biasanya dapat membantu dalam situasi kode abstrak, php get all header

contohnya termasuk:

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

dan ini:

<?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: verifikasi, atau buat log skrip, untuk memastikan utas Anda mencapai titik akhir yang benar dan tidak keluar sebelum selesai.

ppostma1
sumber
3
Jawaban ini mengenai kuku di kepala. Terkadang ini bukan hanya konfigurasi nginx, tetapi apa yang sebenarnya menghasilkan header. Ketika error_reporting berisi pemberitahuan tetapi display_errors tidak aktif di php.ini, semua pesan muncul di header FCGI alih-alih konten.
Schien
17

Instruksi plesk

Di Plesk 12, saya menjalankan nginx sebagai proksi terbalik (yang menurut saya adalah default). Jadi jawaban teratas saat ini tidak berfungsi karena nginx juga dijalankan sebagai proxy.

Saya pergi ke Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Kemudian di bagian bawah halaman itu Anda dapat mengatur arahan nginx tambahan yang saya tetapkan untuk menjadi kombinasi dari dua jawaban teratas di sini:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
icc97
sumber
1
Dimana? Konfigurasi yang mana?
Redsandro
@Redsandro Jika Anda tidak dapat menemukannya Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsmaka saya tidak yakin apa yang Anda maksud?
icc97
ini adalah solusi bagi saya: Domain> Nama domain> Pengaturan Apache & nginx> Arahan nginx tambahan Plesk Onyx Versi 17.8.11
dijkstra8x
1
Saya menambahkan ini dalam file baru /etc/nginx/conf.d/proxy.confdan restart nginx, itu berfungsi dengan baik, terima kasih!
rubo77
6

Jika Anda menggunakan kerangka kerja Symfony: Sebelum mengacaukan konfigurasi Nginx, coba nonaktifkan ChromePHP terlebih dahulu.

1 - Buka aplikasi / config / config_dev.yml

2 - Komentari baris ini:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP mengemas info debug json-encoded di header X-ChromePhp-Data, yang terlalu besar untuk konfigurasi default nginx dengan fastcgi.

Sumber: https://github.com/symfony/symfony/issues/8413#issuecomment-20412848

Lucas Bustamante
sumber
3

Kami akhirnya menyadari bahwa satu server kami yang mengalami ini telah merusak konfigurasi fpm yang mengakibatkan kesalahan / peringatan / pemberitahuan php yang biasanya masuk ke disk sedang dikirim melalui soket FCGI. Sepertinya ada bug penguraian ketika bagian dari header terbelah melintasi potongan buffer.

Jadi pengaturan php_admin_value[error_log]ke sesuatu yang benar-benar dapat ditulisi dan memulai kembali php-fpm sudah cukup untuk memperbaiki masalah.

Kami dapat mereproduksi masalah dengan skrip yang lebih kecil:

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

Mengangkat buffer membuat 502s lebih sulit dipukul tetapi bukan tidak mungkin, misalnya asli:

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

Jadi saya percaya jawaban yang benar adalah: perbaiki konfigurasi fpm Anda sehingga log kesalahan ke disk.

Lyte
sumber
1

Ini masih merupakan pertanyaan SO tertinggi di Google saat mencari kesalahan ini, jadi mari kita bahas itu.

Saat mendapatkan kesalahan ini dan tidak ingin menyelami lebih dalam pengaturan NGINX segera, Anda mungkin ingin memeriksa output Anda ke konsol debug. Dalam kasus saya, saya mengeluarkan banyak teks ke konsol FirePHP / Chromelogger, dan karena ini semua dikirim sebagai header, itu menyebabkan overflow.

Mungkin tidak diperlukan untuk mengubah pengaturan server web jika kesalahan ini disebabkan hanya dengan mengirim sejumlah besar pesan log.

DavidKunz
sumber
0

Saya tidak yakin bahwa masalahnya terkait dengan apa yang dikirim header php. Pastikan buffering diaktifkan. Cara sederhana adalah membuat file 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;

Dan file 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;

Selanjutnya Anda perlu memanggil mereka di server konfigurasi default Anda dengan cara ini:

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;
 # ........
}
macherif
sumber