摘要:有很強(qiáng)大的日志功能,但是在缺省狀態(tài)下,它只能記錄用戶的地址以及瀏覽器信息。缺省的日志格式在這里,我們看到,雖然用戶已經(jīng)登錄,但是日志里沒有任何與用戶相關(guān)的信息,只有地址。如果獲取到了,說明用戶已登錄,則我們把他的輸出給這樣的形式。
nginx有很強(qiáng)大的日志功能,但是在缺省狀態(tài)下,它只能記錄用戶的IP地址以及瀏覽器信息。如果我們有用戶登錄注冊系統(tǒng),在用戶已登錄的情況下,想記錄訪問某一個(gè)網(wǎng)頁的到底是哪一個(gè)用戶,怎么辦呢?因?yàn)槲覀儾恢幌胫赖降资悄囊粋€(gè)IP地址訪問了哪一個(gè)網(wǎng)頁,并且還想知道到底是哪一個(gè)登錄用戶訪問了哪一個(gè)網(wǎng)頁,這對于我們?nèi)蘸笥嗅槍π缘叵蛩?她推薦信息甚至推送廣告都是非常有用的。
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"
在這里,我們看到,雖然用戶已經(jīng)登錄,但是日志里沒有任何與用戶相關(guān)的信息,只有ip地址。如果我們想記錄用戶的id等信息,怎么辦呢?
在PHP端輸出特殊的header我們想到,既然用戶已登錄了,則它肯定有cookie或者session或者token信息,不管是哪種方式,我們的php一定是可以有效地獲取到這個(gè)用戶的信息的。在這里舉例我們通過session獲取到了用戶的id信息:
$user_id = Yii::$app->session["user_id"]; if (empty($user_id)) { header("X-UID: 0"); } else { header("X-UID: " . $user_id); }
如果session里沒有用戶id,則說明用戶還沒有登錄,則輸出X-UID: 0(或者也可以干脆什么也不輸出)。如果獲取到了session,說明用戶已登錄,則我們把他的user_id輸出給nginx: X-UID: 12345這樣的形式。
在這里,你不止可以輸出一個(gè)信息,你可以輸出好幾個(gè)不同的字段,包括他的姓名、性別、年齡等等都可以。
創(chuàng)建一種新的日志格式log_format只能被存儲在http段里,所以我們需要找到nginx.conf文件。
nginx缺省的日志格式第二部分就是用戶信息,但通常什么也沒有,只是一個(gè)-,這里我們它改造成我們從后端傳進(jìn)來的header信息。由上文我們創(chuàng)造的特殊header是X-UID,這里需要先做一個(gè)小的轉(zhuǎn)換,把大寫字母全部改為小寫,把所有的-改為下劃線,就變成了x_uid,然后在前面拼接上$upstream_http_,就得到了最終的結(jié)果$upstream_http_x_uid,然后把它插入到日志格式任何你想讓它出現(xiàn)的地方:
log_format front "$remote_addr - $upstream_http_x_uid [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"";在server里引用這種日志格式
在server相關(guān)的設(shè)置里,因?yàn)槲覀兩厦娼o日志格式起名為front,所以在這里我們引用它時(shí),需要指明用front日志格式:
access_log /var/log/nginx/front-access.log front;新的日志結(jié)果
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個(gè)數(shù)字52248,這就是我們登錄用戶的個(gè)人ID。我這里的例子比較簡單,如果你不嫌麻煩,甚至可以把登錄用戶的所有個(gè)人信息,包括手機(jī)號、郵箱全部打印在日志里,就看你是否顧慮安全問題了。
對用戶隱藏id在上面的第一步,我們用php輸出了一個(gè)特殊header,本來我們這個(gè)header只是供nginx消費(fèi)用的,但是這個(gè)header會被nginx原封不動地顯示給前端,可能會有細(xì)心的用戶感到不安。為此我們可以在nginx的server設(shè)置里再加一個(gè)小開關(guān),隱藏掉這個(gè)頭部:
proxy_hide_header X-UID;
這樣用戶從瀏覽器端就看不到這個(gè)特殊頭部了,而并不影響nginx記錄它。
最終處理那么我們費(fèi)這么大力氣,記錄下來一個(gè)ID有什么用呢?這個(gè)用處可就大了。大家都知道我們有一個(gè)日志分析的利器logstash,通過它結(jié)合上ELK組件可以分析處理Apache或者nginx日志。如果我們沒有這個(gè)ID信息的話,最多也只能分析出來哪一個(gè)網(wǎng)頁經(jīng)常被用戶訪問,僅此而已。但現(xiàn)在我們有了用戶ID,我們甚至可以連接mysql數(shù)據(jù)庫表進(jìn)行分析,研究哪一個(gè)年齡段的,哪一個(gè)性別的,或者哪一個(gè)城市的用戶喜歡訪問什么網(wǎng)頁,甚至有針對性地了解具體某一個(gè)用戶,他喜歡在什么時(shí)間段訪問什么網(wǎng)頁,進(jìn)而有針對性地為他提供定制化的服務(wù)。這還不夠強(qiáng)大嗎?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/39625.html
摘要:有很強(qiáng)大的日志功能,但是在缺省狀態(tài)下,它只能記錄用戶的地址以及瀏覽器信息。缺省的日志格式在這里,我們看到,雖然用戶已經(jīng)登錄,但是日志里沒有任何與用戶相關(guān)的信息,只有地址。如果獲取到了,說明用戶已登錄,則我們把他的輸出給這樣的形式。 nginx有很強(qiáng)大的日志功能,但是在缺省狀態(tài)下,它只能記錄用戶的IP地址以及瀏覽器信息。如果我們有用戶登錄注冊系統(tǒng),在用戶已登錄的情況下,想記錄訪問某一個(gè)網(wǎng)...
摘要:的操作命令將端口由修改為,修改內(nèi)容如下具體配置可參考下面的配置文件重啟,并查看其狀態(tài)的配置文件服務(wù)器需要修改的配置,僅用參考端口根據(jù)自己的情況修改站點(diǎn)根目錄可以加載自己的配置文件,這里我把配置文件中的內(nèi)容直接替換了原本的節(jié) Nginx的操作命令 vim /usr/local/nginx/conf/nginx.conf # 將端口由80修改為10001,修改內(nèi)容如下: listen ...
閱讀 2434·2021-11-19 09:40
閱讀 3593·2021-10-12 10:12
閱讀 1903·2021-09-22 15:04
閱讀 2915·2021-09-02 09:53
閱讀 781·2019-08-29 11:03
閱讀 1136·2019-08-28 18:11
閱讀 1739·2019-08-23 15:28
閱讀 3589·2019-08-23 15:05