あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

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 プロセス殺戮しまくってた。

  1. Nginx がリクエスト受け取る、Unicorn に投げる
  2. Unicorn が処理を開始する、全部リクエスト受け取る前にクッソメモリ食って Swap 枯渇
  3. OOM Killer 先生「おいすー^^」前述のプロセスが殺される
  4. [error]upstream prematurely closed connection while reading response header from upstream
  5. Nginx が 502 を返す

こうっぽいね、皆メモリは余裕を持たせてね!