GNU/Linux >> Znalost Linux >  >> Linux

Upstream odeslal příliš velkou hlavičku při čtení hlavičky odpovědi z upstreamu – chyba NGINX

Při práci na mém klientském webu, který je založen na WooCommerce, jsem náhodou viděl, že stránka pokladny selhává s chybovou zprávou „502 Bad gateway“. Měl jsem podezření, že problém může být kvůli NGINX a náhodou to byla pravda. Protokol chyb NGINX se četl jako 'upstream odeslal příliš velké záhlaví při čtení záhlaví odpovědi z požadavku upstream:GET /checkout/ HTTP/1.1, upstream:fastcgi://unix:/var/run/php-fpm/php- fpm.sock ‘. V tomto tutoriálu vysvětlím, v čem spočívá chyba a jak ji opravit.

Co znamená chyba „Upstream odeslal při čtení příliš velké záhlaví hlavička odpovědi z upstream“ znamená?

Chápu, že se zdá, že stránka odesílá příliš velké záhlaví, než je kapacita přijímacího konce. Ale jaká byla velikost záhlaví, která byla příliš velká na to, aby ji server zvládl? Na stránce, kterou jsem dostal, byla chybová stránka pokladny, která obsahovala 10 položek přidaných do košíku. Soubory cookie a obsah stránky byly tedy vysoké a to mohlo mít za následek větší velikost záhlaví. Jak tedy zjistit, co obsahují hlavičky odpovědí? To je jednoduché.

  1. Spusťte prohlížeč Chrome, klikněte pravým tlačítkem a vyberte možnost Inspect
  2. Klikněte na Network karta
  3. Znovu načtěte stránku
  4. V levém panelu vyberte libovolný požadavek HTTP a na pravém panelu zobrazte záhlaví HTTP.

To je v pořádku, víte, že chcete zobrazit záhlaví HTTP. Proč ale server selhal s chybou „Upstream odeslal příliš velkou hlavičku při čtení hlavičky odpovědi z upstreamu“? Odpověď je, že každý webový server má nastavenou maximální velikost hlavičky a odeslaná hlavička požadavku HTTP byla příliš velká než hlavička nastavená na webovém serveru. Níže je uveden maximální limit velikosti záhlaví na různých webových serverech.

  • Webový server Apache – 8K
  • NGINX – 4K až 8K
  • IIS (v jednotlivých verzích se liší) – 8 kB až 16 kB
  • Tomcat (v jednotlivých verzích se liší):8K až 48K.

Protože webový server, který používám, je NGINX, výchozí limit velikosti záhlaví je 4K až 8K. Ve výchozím nastavení NGINX používá systémovou velikost stránky, která je ve většině systémů 4K. Můžete to zjistit pomocí níže uvedeného příkazu:

# getconf PAGESIZE
4096

Zde je úryvek, který vysvětluje velikost vyrovnávací paměti odezvy NGINX FastCGI.

Ve výchozím nastavení, když Nginx začne přijímat odpověď z backendu FastCGI (jako je PHP-FPM), uloží odpověď do paměti, než ji doručí klientovi. Jakákoli odpověď větší než nastavená velikost vyrovnávací paměti se uloží do dočasného souboru na disku.

Dva parametry související s ukládáním odezvy FastCGI do vyrovnávací paměti jsou:

fastcgi_buffers 
fastcgi_buffer_size

fastcgi_buffers – řídí počet a velikost paměti segmentů vyrovnávací paměti použitých pro užitečné zatížení odpovědi FastCGI.

fastcgi_buffer_size – řídí velikost vyrovnávací paměti, která byla použita k uchování prvního bloku odezvy fastCGI z hlaviček odezvy HTTP.

Podle dokumentace NGNIX nemusíte upravovat výchozí hodnotu parametrů odezvy fastCGI, protože NGINX ve výchozím nastavení používá nejmenší velikost stránky 4 kB a měla by vyhovovat většině požadavků HTTP hlaviček. Zdá se však, že to v mém případě nesedí. Stejná dokumentace říká, že některé rámce mohou přenášet velké množství dat cookie prostřednictvím Set-Cookie HTTP hlavička a to by mohlo vyhodit vyrovnávací paměť, což by mělo za následek chybu HTTP 500. V takových případech může být nutné zvětšit velikost vyrovnávací paměti na 8k/16k/32k, aby bylo možné umístit větší upstream HTTP hlavičku.

Jak zjistit průměrnou a maximální velikost odpovědí FastCGI přijatou webem server?

To lze zjistit grepováním souborů protokolu přístupu NGINX. Chcete-li to provést, spusťte níže uvedený příkaz zadáním access_log soubor jako vstup

$ 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

Ukázka na mém webovém serveru:

Maximum: 3501304
Average: 21065

Poznámka :Byly brány v úvahu pouze odpovědi HTTP 200 OK.

Z výše uvedeného snímku je jasné, že průměrná velikost vyrovnávací paměti je více než 21 kB. Potřebujeme tedy nastavit velikost vyrovnávací paměti o něco větší, než je průměrný požadavek, který může být pravděpodobně 32 kB. Chcete-li to provést, otevřete soubor nginx.conf a přidejte níže uvedené řádky pod location sekce – location ~ \.php$ { }

fastcgi_buffers 32 32k;
fastcgi_buffer_size 32k;

Poznámka :Možná budete muset nastavit nižší hodnotu vyrovnávací paměti. Nastavil jsem 32 kB, protože průměrná velikost byla přes 21 kB.

Další informace o vyrovnávací paměti odezvy FastCGI naleznete zde.


Linux
  1. Řešení chyby Mysql:Příliš mnoho otevřených souborů

  2. Chyba OpenCA – příliš krátká symetrická délka klíče [Řešení]

  3. Čtení řádků ze souboru s Bash:For vs. Zatímco?

  1. Jak zabránit tomu, aby protokoly byly příliš velké?

  2. Stavové kódy odpovědi HTTP

  3. Nelze odebrat soubory z adresáře s chybou „Seznam argumentů je příliš dlouhý“

  1. 502 Chyba špatné brány NGINX [Řešení]

  2. Nginx se stále pokouší otevřít výchozí soubor protokolu chyb, i když jsem při opětovném načítání nastavil konfigurační soubor nginx

  3. Chyba Yum při instalaci MongoDB na CentOS?