|
ウェブアクセスログ(access_log)は、クライアントのIP、アクセス日、アクセスしたURLリソース、サーバーから返されるHTTPステータスコードなどの重要な情報を含む、すべての外部クライアントのウェブサーバーへのアクセス動作を記録します。 典型的なウェブアクセスログは以下の通りです: 112.97.37.90 - - [2013年9月14日:14:37:39 +0800] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; Zh-CN; Lenovo A326ビルド/GRK39F)AppleWebKit/533.1(KHTML、Geckoのような)バージョン/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -
計画: 1. 問題を解決するために: ウェブサイトの訪問数が多いとログデータが多くなり、すべてログファイルにまとめるとファイルはどんどん大きくなります。 例えば、数百メガバイトのファイルのように大きなファイルの速度は遅くなります。 ログを書き込む際には、操作速度に影響します。 また、アクセスログを見たい場合、数百メガビットのファイルはダウンロードや開封が遅いです。 サードパーティ製の無料ログ分析ツール「Log Treasure」を使えば、nginx、apache、iisのログファイルをアップロードでき、ウェブサイトのセキュリティ面を分析するのに役立ちます。 結局のところ、専門化する方がよりプロフェッショナルです。 Log Baoにはアップロードファイルのサイズ制限があり、最大50mまでです。
2. Nignxにはファイルを自動的に分離しログを保存する仕組みがありません。 nginxは自動的にファイルを保存しないからです。 したがって、実装するために自分でスクリプトを書く必要があります。
シェルスクリプトファイルnginx_log_division.sh以下の内容を含みます:
# /ビン/バッシュ logs_path="/data/wwwlogs/" #以前的日志文件. log_name="xxx.log" pid_path="/usr/local/nginx/logs/nginx.pid"
mv ${logs_path}${log_name} ${logs_path}${log_name}_$(date --date="LAST WEEK" +"%Y-%m-d").log
殺せ -USR1 'cat ${pid_path}'
上記のシェルスクリプトの原則は、まず前のログファイルを移動し、名前を1にリネームすることであり、目的はバックアップです。 最後の月曜日の名前によると、「2013-09-16」でスクリプトが実行されると、生成されるファイル名は「xxx.log_ 20130909.log」となります。 たとえ mv コマンドがファイル上で kill -USR1 前に実行されていても、'cat ${{pid_path}' は実行されますファイル名の変更nginxは通常通り新たに名前の「xxx.log_20130909」にログデータを書き込みます。 その理由は、Linuxシステムではカーネルがファイルディスクリプタに基づいてファイルを探すからです。
Linuxファイルディスクリプタの理解----------------
ファイルディスクリプタとは、Linuxカーネルが各開いているファイルに対して名前を付ける整数識別子のことです。 Linuxカーネルは「ファイルディスクリプタテーブルこのファイルディスクリプタテーブルは「このプロセスによって開いたファイル(特定)」を記録します。 この環境では、nginxはすでにログファイルを開いた実行中のプロセスであり、そのファイルをファイルディスクリプタテーブルにログします。 ログファイルのパスが変わっていても、ファイルディスクリプタテーブルから位置を特定することができます。 ---------------------------------------------- 「kill -USR1 'cat ${pid_path}'」というコマンドを実行すると、nginx.pidファイルに保存されたものは実際には番号です(開いて確認できます。私は894です)。nginxはメインプロセスのpid(プロセス番号)をnginx.pidファイルに書き込むので、catコマンドを通じて直接メインプロセス番号を取得し、指定されたプロセス番号を直接操作できます。
kill -USR1 'cat ${pid_path}' は このプロセスに番号を付けるための信号は–USR1 89 #指定发信号 4 (USR1)です。
Linuxシステムでは、Linuxは「実行中のプロセス」とシグナルを通じて通信します。 Linuxシステムでは、SIGHUPのような多くのあらかじめ定義された信号も存在します。 USR1はユーザー定義信号です。 これは、プロセス自体がこの信号を受け取ったときに何をすべきかを定義していると理解できます(つまり、プロセス作成者自身がこの信号を受け取るか何もしないかを決め、完全に開発者に委ねるということです)。 nginxでは、USR1信号を受け取った際にnginxがログファイルを再開する処理を処理するために独自のコードを書いています。 具体的な原理は以下の通りです。 1. nginxのメインプロセスはUSR1信号を受け取り、ログファイル(nginx設定ファイルのログ名にちなんで名付けられ、設定ファイルのaccess_log項目が設定した値)を再開します。ファイルが存在しなければ、新しいファイルxxx.logが自動的に作成されます。
2. 次にログファイルの所有者を「ワーカープロセス」に変更し、ワーカープロセスがログファイルの読み書き権限を持つようにします(マスターとワーカーは通常別々のユーザーとして動作するため、所有者を変更する必要があります)。
3. nginxのメインプロセスは重複ログファイル(すなわち、先ほどmvコマンドで20130909.log xxx.log_に名前が変更されたファイル)を閉じます。そして、新たに開いたログファイルを使用するようワーカープロセスに通知します(xxx.log、先ほどメインプロセスで開いたファイルです)。 具体的な実装はより詳細で、メインプロセスがUSR1信号をワーカーに送信し、この信号を受け取った後、ワーカーはログファイル(すなわち設定ファイルで合意されたxxx.logもの)を再開します
=================================== スクリプトを定期的に実行する
上記のシェルスクリプトファイルをスケジュールタスクに追加する設定をしてください。 crontabはLinux上でスケジュールされたタスクプロセスです。 このプロセスは電源を入れたときに始まり、時折リストに入って実行すべきタスクがないかを確認します。
クロンタブ -e
* 04 * * 1 /data/wwwlogs/nginx_log_division.sh
上記のコードが追加されたファイルが開きます 形式は「実行されるシェルファイルパス」です。 * は「毎」、毎分、毎時間、毎月などと理解できます。 月曜日の午前4時にnginx_log_division.shを実行するスクリプトを設定しましたが、そのスクリプトの内容は新しいログファイルを再生成することです。
添付:並べるnginxログの設定方法
log_formatサイト '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
access_log /data/wwwlogs/xxxx.com.logサイト #第二个参数表示使用那个日志格式、各ログ形式ごとに名前が特定され、そのサイトはlog_format内の名称に対応します
上記の内容はcrontabのスケジュールタスクマネージャーの使用を含みます。
また、完全な理解ができていなかったり、間違いがあったりする場所もあります。 今後また更新できることを願っています。
|