ホームページ >データベース >mysql チュートリアル >nginxアクセスログを使用してmysqlにユーザーIDを記録するにはどうすればよいですか?

nginxアクセスログを使用してmysqlにユーザーIDを記録するにはどうすればよいですか?

黄舟
黄舟オリジナル
2017-07-21 16:32:331428ブラウズ

この記事では、nginx アクセス ログを使用して mysql にユーザー ID を記録する方法について、サンプル コードを通じて詳細に紹介します。この記事は、学習や仕事に必要なすべての人の参考になります。以下のエディタで学習してみましょう。

前書き

nginx には非常に強力なログ機能があることは誰もが知っているはずですが、デフォルトではユーザーの IP アドレスとブラウザー情報しか記録できません。ユーザーを登録システムにログインさせ、そのユーザーがすでにログインしている場合、どのユーザーが特定の Web ページにアクセスしたかを記録したい場合、どうすればよいでしょうか?なぜなら、どの IP アドレスがどの Web ページにアクセスしたかだけでなく、どのログイン ユーザーがどの Web ページにアクセスしたかを知りたいからです。これは、将来、情報を推奨したり、ターゲットを絞った方法でそのユーザーに広告をプッシュしたりするのに役立ちます。役に立つ。これ以上の苦労はせずに、詳細な紹介を見てみましょう:

nginx のデフォルトのログ形式


127.0.0.1 - - [20/Jul/2017:22:04:08 +0800] "GET /news/index HTTP/1.1" 200 22262 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.66 Safari/537.36"

ここでは、ユーザーがログインしているにもかかわらず、ログには何もないことがわかります。ユーザーに関する情報はIPアドレスです。ユーザーIDなどの情報を記録したい場合はどうすればよいですか?

PHP側で特別なヘッダーを出力します

ユーザーがログインしているので、どの方法であっても、私たちのphpは有効である必要があると考えました。このユーザーの情報を取得します。情報。以下はセッションを通じてユーザーの ID 情報を取得する例です:


$user_id = Yii::$app->session['user_id'];
if (empty($user_id)) {
 header('X-UID: 0');
} else {
 header('X-UID: ' . $user_id);
}

セッションにユーザー ID がない場合は、ユーザーがログインしていないことを意味し、X-UID: 0 (または単に何も出力しないこともできます)。セッションが取得された場合は、ユーザーがログインしたことを意味し、その user_id を nginx: X-UID: 12345 の形式で出力します。 nginx: X-UID: 12345这样的形式。

在这里,你不止可以输出一个信息,你可以输出好几个不同的字段,包括他的姓名、性别、年龄等等都可以。

创建一种新的日志格式

log_format只能被存储在http段里,所以我们需要找到nginx.conf文件。

nginx缺省的日志格式第二部分就是用户信息,但通常什么也没有,只是一个-,这里我们它改造成我们从后端传进来的header信息。由上文我们创造的特殊header是X-UID,这里需要先做一个小的转换,把大写字母全部改为小写,把所有的-改为下划线,就变成了x_uid,然后在前面拼接上$upstream_http_ ,就得到了最终的结果$upstream_http_x_uid

ここでは、1 つの情報を出力するだけでなく、名前、性別、年齢などを含む複数の異なるフィールドを出力することもできます。


新しいログ形式を作成します
log_format は http セグメントにのみ保存できるため、nginx.conf ファイルを見つける必要があります。

nginx のデフォルトのログ形式の 2 番目の部分はユーザー情報ですが、通常は何もなく、- だけがここでバックエンドから渡すヘッダー情報に変換されます。上で作成した特別なヘッダーは X-UID です。ここでは、最初に小さな変換を行う必要があります。すべての大文字を小文字に変更し、すべてをアンダースコアに変更すると、x_uid になり、次に $upstream_http_ を結合します。 code> を実行すると、最終結果 $upstream_http_x_uid が得られ、それをログ形式の表示したい場所に挿入します:


log_format front '$remote_addr - $upstream_http_x_uid [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

in このログ形式はサーバーで参照されます

サーバー関連の設定では、上でログ形式にfrontという名前を付けたため、ここで参照する場合は、フロントログ形式を指定する必要があります:

access_log /var/log/nginx/front-access.log front;
新しいログ結果


127.0.0.1 - 52248 [20/Jul/2017:22:35:40 +0800] "GET /news/view?id=56 HTTP/1.1" 200 19455 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.66 Safari/537.36"

注:


上記の 2 番目の数字は 52248 で、ログインしているユーザーの個人 ID です。ここでの例は比較的単純です。手間を気にしないのであれば、ログインしているユーザーの携帯電話番号や電子メール アドレスを含むすべての個人情報をログに出力することもできます。セキュリティの問題について。

ユーザーから ID を非表示にします
上記の最初のステップでは、PHP を使用して特別なヘッダーを出力しました。元々、ヘッダーは nginx で使用するためだけに使用されていましたが、このヘッダーは nginx によってそのまま残されます。フロントエンドに関しては、注意深いユーザーは動揺するかもしれません。このため、nginx サーバー設定に小さなスイッチを追加して、このヘッダーを非表示にすることができます:

🎜
proxy_hide_header X-UID;
🎜 この方法では、ユーザーはブラウザーからこの特別なヘッダーを見ることができなくなり、nginx には影響しません。それを記録します。 🎜🎜🎜🎜最終処理🎜🎜🎜🎜🎜それでは、IDの記録にそれほどの労力を費やして何の意味があるのでしょうか?これはとても役に立ちます。ログ分析用の強力なツールである logstash があることは誰もが知っています。これを ELK コンポーネントと組み合わせると、Apache または nginx ログの分析と処理に使用できます。このID情報がなければ、せいぜいユーザーがどのWebページに頻繁にアクセスしているのかを分析することしかできません。しかし、ユーザー ID を取得したので、分析のために mysql データベース テーブルに接続して、どの年齢層、性別、都市のユーザーがどの Web ページにアクセスするかを調査し、ターゲットを絞った方法で特定の Web ページを理解することもできます。 、どの Web ページにどの時間帯にアクセスしたいかを特定し、カスタマイズされたサービスを提供します。これでも十分強力ではないでしょうか? 🎜

概要

以上がnginxアクセスログを使用してmysqlにユーザーIDを記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。