Home  >  Article  >  Database  >  How to record user id in mysql using nginx access log?

How to record user id in mysql using nginx access log?

黄舟
黄舟Original
2017-07-21 16:32:331355browse

This article mainly introduces you to the relevant information about how to use nginx access logs to record user IDs in mysql. The article introduces it in great detail through sample code. It has certain reference learning value for everyone's study or work. It is needed Friends, please follow the editor to learn together.

Preface

Everyone should know that nginx has a very powerful logging function, but by default, it can only log users IP address and browser information. If we have a user log in to the registration system, and the user is already logged in, we want to record which user visited a certain web page, what should we do? Because we not only want to know which IP address visited which webpage, but also which logged-in user visited which webpage. This will help us recommend information and even push advertisements to him/her in a targeted manner in the future. All are very useful. Without further ado, let’s take a look at the detailed introduction:

nginx default log format


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"

Here, we see that although the user has logged in, there is no user-related information in the log, only the IP address. What if we want to record the user's ID and other information?

Output a special header on the PHP side

We thought that since the user has logged in, it must have a cookie or session Or token information, no matter which way, our PHP can effectively obtain the user's information. Here is an example where we obtain the user's ID information through session:


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

If there is no user ID in the session, it means that the user has not logged in, and X-UID: 0 is output. (Or you can simply output nothing). If the session is obtained, it means that the user has logged in, then we output his user_id to nginx: X-UID: 12345.

Here, you can not only output one piece of information, you can output several different fields, including his name, gender, age, etc.

Create a new log format

log_format can only be stored in the http segment, so we need to find nginx. conf file.

The second part of the default log format of nginx is user information, but usually there is nothing, just a -. Here we transform it into the header information we pass in from the backend. The special header we created above is X-UID. Here we need to do a small conversion first, change all the uppercase letters to lowercase, change all the - to underscores, it becomes x_uid, and then splice # in front. ##$upstream_http_, you will get the final result $upstream_http_x_uid, and then insert it into the log format wherever you want it to appear:


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

Refer to this log format in the server

In the server-related settings, because we named the log format above front, so when we quote it here, we need to specify the front log format:


access_log /var/log/nginx/front-access.log front;

New log result


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"

Note: The second number above is 52248, which is the personal ID of our logged-in user. My example here is relatively simple. If you don't mind the trouble, you can even print all the personal information of the logged-in user, including mobile phone number and email address, in the log. It depends on whether you are concerned about security issues.

Hide the ID from the user

In the first step above, we used PHP to output a special header. Originally, our The header is only for consumption by nginx, but this header will be displayed to the front end intact by nginx, which may make careful users feel uneasy. For this reason, we can add a small switch to the nginx server settings to hide this header:


proxy_hide_header X-UID;

so that users cannot see this special feature from the browser. header without affecting nginx recording it.

Final processing

So what’s the use of us spending so much effort to record an ID? This is of great use. Everyone knows that we have a powerful tool for log analysis, logstash, which can be used to analyze and process Apache or nginx logs when combined with the ELK component. If we don't have this ID information, at most we can only analyze which web pages are frequently visited by users, and that's it. But now that we have user IDs, we can even connect to the mysql database table for analysis to study which age group, which gender, or which city users like to visit which web pages, and even understand a specific one in a targeted manner Users, what web pages they like to visit at what time period, and then provide them with customized services in a targeted manner. Isn't this powerful enough?

Summarize

The above is the detailed content of How to record user id in mysql using nginx access log?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn