Nginxのエラーログ「no live upstreams while connecting to upstream」の原因と対策(ロードバランサ)
Nginxをロードバランサとして使っています。
そのフロント側はエラーログなんてほとんど出ないのですが、
急に「no live upstreams while connecting to upstream」が出だした。
この対策方法を語ります。
このエラーログを対策
2018/10/20 02:14:14 [error] 26758#26758: *131598822 no live upstreams while connecting to upstream, client: xx.xxx.xxx.xxx, server: , request: "GET /archives/10 HTTP/1.1", upstream: "http://backend/archives/10", host: "parudou3.com"
サーバー名も無く、URLもアップストリーム名となる「backend」とおかしい。
「no live upstreams while connecting to upstream」は
「アップストリーム先が死んでるよ」といった意味です。
ようはバックエンドサーバーがダウンしている状態。
しかも時々起こるという、いったいどうした?というエラーです。
原因
バックエンド側で「return 444;」を使ったことが原因。
Nginx独自のエラーコードである「444」は、通信を即座に閉じます。
そのため、サーバーダウンと同じ状態になってしまう。
デフォルトだと10秒間は通信しないようになるので、10秒だけサーバーダウン状態に。
その間に訪れたユーザーは「502 Bad Gateway」の表示となり、このエラーログが書かれる。
なんてことない、自滅行為だった。
対策
「return 403;」に変更する。
403だと通常のにレスポンスがあり、アクセスログに出力されます。
これにてサーバーダウン状態には当然ならない。
一件落着です。
「444」はフロントエンド側で使うコード
444はバックエンド側では絶対に使ってはいけないコードです。
アクセス拒否系は面倒がらずにフロントエンド側に設定しよう。
この点にすぐ気づけたのも、access.log・error.logが役立ちました。
いつから発生したエラーか?と探すと、原因解明は簡単。
ログを見ないと気付かない症状なので、日々ログは確認していきたい。