GNU/Linux >> Belajar Linux >  >> Linux

Hulu mengirim tajuk terlalu besar saat membaca tajuk respons dari hulu – kesalahan NGINX

Saat bekerja di situs web klien saya yang berbasis WooCommerce, saya kebetulan melihat halaman checkout gagal dengan pesan kesalahan "502 Bad gateway". Saya menduga masalahnya mungkin karena NGINX dan itu benar. Log kesalahan NGINX dibaca sebagai 'upstream mengirim header terlalu besar saat membaca header respons dari permintaan upstream:GET /checkout/ HTTP/1.1, upstream:fastcgi://unix:/var/run/php-fpm/php- fpm.sock '. Dalam tutorial ini, saya akan menjelaskan tentang apa kesalahan itu dan bagaimana cara memperbaikinya.

Apa yang dimaksud dengan kesalahan “Upstream mengirim header terlalu besar saat membaca tajuk respons dari hulu” maksudnya?

Saya mengerti bahwa halaman tersebut tampaknya mengirim tajuk yang terlalu besar daripada kapasitas penerima. Tapi berapa ukuran header yang terlalu besar untuk ditangani server? Karena halaman yang saya dapatkan kesalahannya adalah halaman checkout, yang menyertakan 10 item yang ditambahkan ke troli. Oleh karena itu, cookie, konten halaman semuanya tinggi dan itu bisa menghasilkan ukuran header yang lebih besar. Jadi bagaimana menemukan apa yang termasuk dalam header respons? Sederhana saja.

  1. Luncurkan browser chrome, klik kanan dan pilih Inspect
  2. Klik Network tab
  3. Muat ulang halaman
  4. Pilih salah satu permintaan HTTP dari panel kiri dan lihat header HTTP di panel kanan.

Tidak apa-apa, Anda tahu untuk melihat header HTTP. Tetapi mengapa server gagal dengan kesalahan "Upstream mengirim header terlalu besar saat membaca header respons dari hulu"? Jawabannya adalah setiap server web memiliki ukuran header maksimum yang ditetapkan dan header permintaan HTTP yang dikirim terlalu besar daripada yang ditetapkan di server web. Di bawah ini adalah batas ukuran header maksimum di berbagai server web.

  • Server web Apache – 8K
  • NGINX – 4K hingga 8K
  • IIS (bervariasi pada setiap versi) – 8K hingga 16K
  • Tomcat (bervariasi di setiap versi):8K hingga 48K.

Karena server web yang saya gunakan adalah NGINX, batas ukuran header default adalah 4K hingga 8K. Secara default NGINX menggunakan ukuran halaman sistem, yaitu 4K di sebagian besar sistem. Anda dapat menemukannya menggunakan perintah di bawah ini:

# getconf PAGESIZE
4096

Berikut cuplikan yang menjelaskan tentang ukuran buffer respons NGINX FastCGI.

Secara default, saat Nginx mulai menerima respons dari backend FastCGI (seperti PHP-FPM), Nginx akan menyangga respons di memori sebelum mengirimkannya ke klien. Setiap respons yang lebih besar dari ukuran buffer yang disetel akan disimpan ke file sementara di disk.

Dua parameter yang terkait dengan buffering respons FastCGI adalah:

fastcgi_buffers 
fastcgi_buffer_size

fastcgi_buffers – mengontrol jumlah dan ukuran memori segmen buffer yang digunakan untuk muatan respons FastCGI.

fastcgi_buffer_size – mengontrol ukuran buffer yang digunakan untuk menampung potongan pertama respons fastCGI dari header respons HTTP.

Menurut dokumentasi NGNIX, Anda tidak perlu menyesuaikan nilai default parameter respons fastCGI, karena NGINX secara default menggunakan ukuran halaman terkecil 4 KB dan harus sesuai dengan sebagian besar permintaan header HTTP. Namun, sepertinya tidak cocok dengan kasus saya. Dokumentasi yang sama mengatakan, beberapa kerangka kerja mungkin mendorong sejumlah besar data cookie melalui Set-Cookie Header HTTP dan itu mungkin merusak buffer yang mengakibatkan kesalahan HTTP 500. Dalam kasus seperti itu, Anda mungkin perlu meningkatkan ukuran buffer menjadi 8k/16k/32k untuk mengakomodasi header HTTP upstream yang lebih besar.

Cara menemukan ukuran respons FastCGI rata-rata dan maksimum yang diterima oleh web server?

Itu dapat ditemukan dengan mengambil file log akses NGINX. Untuk melakukannya, jalankan perintah di bawah ini dengan memberikan access_log file sebagai masukan

$ awk '($9 ~ /200/) { i++;sum+=$10;max=$10>max?$10:max; } END { printf("Maximum: %d\nAverage: %d\n",max,i?sum/i:0); }' access.log

Contoh di server web saya:

Maximum: 3501304
Average: 21065

Catatan :Respons HTTP 200 OK hanya dipertimbangkan.

Dari snapshot di atas, jelas bahwa ukuran buffer rata-rata lebih dari 21K. Jadi kita perlu mengatur ukuran buffer sedikit lebih banyak dari rata-rata permintaan, yang mungkin bisa 32K. Untuk melakukannya, buka file nginx.conf tambahkan baris di bawah ini di bawah location bagian – location ~ \.php$ { }

fastcgi_buffers 32 32k;
fastcgi_buffer_size 32k;

Catatan :Anda mungkin perlu menyetel nilai buffer yang lebih rendah. Saya telah menetapkan 32K karena ukuran rata-rata di atas 21K.

Pelajari lebih lanjut tentang buffer respons FastCGI di sini.


Linux
  1. Menyelesaikan kesalahan Mysql:Terlalu banyak file yang terbuka

  2. Kesalahan OpenCA – Panjang Kunci Simetris Terlalu Pendek [Solusi]

  3. 502 Kesalahan Gateway Buruk NGINX [Solusi]

  1. rpm:kesalahan saat memuat pustaka bersama:header ELF tidak valid

  2. Tidak Dapat Menghapus File Dari Direktori dengan Kesalahan "Daftar argumen terlalu panjang"

  3. Membaca dari file dalam perakitan

  1. nginx - 413 Permintaan Entitas Terlalu Besar

  2. Kesalahan saat menggunakan glibc versi terbaru

  3. Kesalahan Yum saat menginstal MongoDB di CentOS?