web-dev-qa-db-ja.com

nginx。サーバーログを爆破することなくSSLエラーをログに記録する方法

私は、さまざまなモバイルデバイスや組み込みデバイスがアクセスするWebサイトを持っています。

多くの場合、一部のデバイスが接続できないという問題が発生します。

理由は次のとおりです。

  • デバイスが特定のCAを認識しない
  • デバイスが古すぎて、古いプロトコルTLS1.1が必要です
  • デバイスには、古い暗号化アルゴリズムまたは単に暗号化アルゴリズムが必要ですが、サーバーの設定では利用できませんでした。

デバイスが離れた場所にあるため、簡単にアクセスできるログがないので、nginxログでこのような問題を分析できるようにしたいと考えています。

これを行うには、デバッグするエラーログのログレベルを上げます。

error_log  /var/log/nginx/errors_with_debug.log debug;

ただし、このログには、興味のないものがたくさん含まれています。

Ssl接続が拒否された場合にのみ詳細情報をログに記録する方法はありますか?

これまでのところ、debugロギングを有効にし、デバイスに問題があるリモートユーザーに接続してトレースを記録し、デバッグレベルを無効にし、nginxをリロードして、取得したトレースを分析するように依頼しています。

実際、SSLの問題が原因で接続に失敗したクライアントの日付とIPアドレスをログに記録できれば、すでに助けられています。

理想的には、理由もログに記録したいのですが、SSLが原因で接続が試行されたが失敗したことを知っていれば、非常に役立ちます。

4
gelonida

言及したすべてのSSLハンドシェイクエラーは、nginxによってinfoレベルでログに記録されるため、デバッグを有効にする必要はありません。

使用しているディストリビューションについては言及していませんが、最近のほとんどのシステムにはSystemDが付属しているため、ログを標準エラーにリダイレクトします。

error_log stderr info;

またはsyslog:

error_log syslog:server=/dev/log info;

systemd-journald がすべてのNginxログをキャプチャしてサイズを管理することを許可します。シンプルな:

journalctl -u nginx.service -a -p info

infoレベルより上のすべてのデバッグメッセージを一覧表示できます(syslogを使用する場合)。

特定のクライアントでさらにデータが必要な場合は、Nginxdebug_connection を使用できます。

events {
    debug_connection 192.0.50.1;
    ...
}

質問で述べたように、すべてのクライアントに対してログレベルdebugを設定すると、確かに大量の出力が生成されます。デバッグを有効にする必要がある場合は、サブシステムレベルで行うことができます。 error_log のドキュメントには記載されていませんが、このディレクティブはdebugレベルの細かいサブディビジョンも受け入れます(cf. source code ):debug_coredebug_allocdebug_mutexdebug_eventdebug_httpdebug_maildebug_streamdebug_eventレベルに関心がありますが、error_logディレクティブにいくつか追加できます。例:

error_log syslog:server=/dev/log debug_http debug_event;
2

A:

  1. 「デバッグ」を有効にする
  2. ログファイルの代わりにパイプを作成します(ログローテーションによって害を受けないことを確認してください)
  3. バックグラウンドでリスナーを作成する(cat awk、grep、sedなど)
  4. nginxを再起動します

B:

error_log syslog:server = unix:/var/log/nginx.sock debug;

2
GioMac