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.
- Luncurkan browser chrome, klik kanan dan pilih
Inspect
- Klik
Network
tab - Muat ulang halaman
- 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.