【nginx+PHP-FPM】503エラー「too big header」が出たので対処(fastcgi_buffer_size)
自分用メモ。nginx + PHP-FPM + WordPress で、503エラーが発生するようになったので対処。
具体的なエラー内容は以下のとおり。
2024/01/23 12:39:48 [error] 59157#59157: *118 upstream sent too big header while reading response header from upstream, client: 192.168.XXX.XX, server: 192.168.XXX.XXX, request: "POST /wp-admin/admin-ajax.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/php-fpm.sock:", host: "192.168.XXX.XXX", referrer: "http://192.168.XXX.XXX/wp-admin/post.php?post=35700&action=edit"
Code language: PHP (php)
これによると「PHP-FPM から返される HTTP Header が大きい」ご様子。
手元の環境では、PHP 8.2 にしてから何故だか WordPress の管理画面でほぼ必ず症状が出るように。
で、結論から言うと、nginx.conf に以下の設定を入れて対処した。
fastcgi_buffer_size 8k;
fastcgi_buffers 12 8k;
fastcgi_busy_buffers_size 64k;
各設定値は、HTTP Response Header / Body のサイズやサーバのメモリ、同時接続数とか次第で決める。効果がないならサイズをシステムのメモリページサイズ単位で大きくしていくイメージ。
どーも、PHP-FPM が nginx に返す HTTP Header が fastcgi_buffer_size
に収まってなきゃいけない気がするのだけれど、fastcgi_buffer_size
だけ大きくしても何らかのエラーが出ることがあったので、そう単純な話でもない予感。
で、その fastcgi_buffer_size
の初期値は、確認したら 4k or 8k(システムのメモリページのサイズ次第) だった。一瞬、「Response Header がそんなにデカいものか」と思うも、管理系で cookie を大量に喰わせてれば 4k ならギリ溢れるかも、とは思えるライン。いろいろと複雑そう。
fastcgi_buffers
は、fastcgi_buffer_size
から溢れたときに使われるメモリバッファの数とサイズ。
fastcgi_busy_buffers_size
は、(公式ドキュメントによれば、多分)PHP-FPM からの応答未了中にクライアントへの応答に使えるメモリバッファ。fastcgi_buffers
の (number -1) x size 以下の範囲で指定するらしい。
メモリバッファから溢れた分は temp ファイルに外出しされる。その場合、パフォーマンスには当然影響しそう。仕様は以下の公式情報を参照。
いずれにせよ、サーバーのメモリは貴重であるから、気前よくドーンと大きな値を書いちゃうのは(多少なりともアクセスがあるサイトでは)オススメできない。同時接続数とサーバーリソースなどとのバランスを勘案の上、自分で値を決める必要がある。
nginx の fastcgi バッファリング周りの仕様と、各ディレクティブの初期値など、公式ドキュメントはこちら。
いろいろ調べるより、コレ↑をちゃんと読むのが近道。
適切なメモリーバッファのサイズ算出方法については、以下の記事が参考にできる。
けども、自分が運営しているちょっとした WordPress サイトなら、まぁ、4k / 8k 単位くらいのサイズ感は把握してる気がする。たいてい。