upstream prematurely closed connection while reading response header from upstream
運用してるサービスで出た、初めて遭遇しましたよ〜。運用構成は Nginx + Unicorn + Rails 3.2 + MySQL Cluster となっております。いつものシステムですね。問題が発生したこのサーバのスペックが、クライアントがけちだったので予算が全然出てなくて、しょっぼいしょっぼいサーバだったので、稼働済みの同様の構成のサーバでは発生しなかったのですが、今回のサーバで初めて発生しました。
参考:nginx upstream prematurely closed connection
参考に対する回答:Re: nginx upstream prematurely closed connection
問題が起きた時の該当のサーバのメモリ状況。
[root@localhost ~]# free -m total used free shared buffers cached Mem: 3832 2434 1397 0 26 160 -/+ buffers/cache: 2248 1584 Swap: 2047 1122 925
草 不 可 避
という訳でメモリが足りないんすね、素直に Unicorn のプロセス数を半分にする事でメモリ消費を抑えて解決の予定(現在経過観察中)。あとは毎晩ログローテートする時に、USR1 シグナルじゃなくて、graceful 送信してプロセス全部新しくする事にしてメモリリークするらしい問題を解決解決。
おまけ
よく見たら、/var/log/messages から、OOM-Killer 先生が「おいすー^^」しながらリクエスト処理中の Ruby プロセス殺戮しまくってた。
- Nginx がリクエスト受け取る、Unicorn に投げる
- Unicorn が処理を開始する、全部リクエスト受け取る前にクッソメモリ食って Swap 枯渇
- OOM Killer 先生「おいすー^^」前述のプロセスが殺される
- [error]upstream prematurely closed connection while reading response header from upstream
- Nginx が 502 を返す
こうっぽいね、皆メモリは余裕を持たせてね!