nginx
有很強大的日誌功能,可是在缺省狀態下,它只能記錄用戶的IP地址以及瀏覽器信息。若是咱們有用戶登陸註冊系統,在用戶已登陸的狀況下,想記錄訪問某一個網頁的究竟是哪個用戶,怎麼辦呢?由於咱們不僅想知道究竟是哪個IP地址訪問了哪個網頁,而且還想知道究竟是哪個登陸用戶訪問了哪個網頁,這對於咱們往後有針對性地向他/她推薦信息甚至推送廣告都是很是有用的。php
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等信息,怎麼辦呢?前端
咱們想到,既然用戶已登陸了,則它確定有cookie
或者session
或者token
信息,不論是哪一種方式,咱們的php必定是能夠有效地獲取到這個用戶的信息的。在這裏舉例咱們經過session
獲取到了用戶的id信息:mysql
$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
這樣的形式。nginx
在這裏,你不止能夠輸出一個信息,你能夠輸出好幾個不一樣的字段,包括他的姓名、性別、年齡等等均可以。sql
log_format
只能被存儲在http
段裏,因此咱們須要找到nginx.conf
文件。數據庫
nginx
缺省的日誌格式第二部分就是用戶信息,但一般什麼也沒有,只是一個-
,這裏咱們它改形成咱們從後端傳進來的header
信息。由上文咱們創造的特殊header
是X-UID
,這裏須要先作一個小的轉換,把大寫字母所有改成小寫,把全部的-改成下劃線,就變成了x_uid
,而後在前面拼接上$upstream_http_
,就獲得了最終的結果$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"';
在server
相關的設置裏,由於咱們上面給日誌格式起名爲front
,因此在這裏咱們引用它時,須要指明用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。我這裏的例子比較簡單,若是你不嫌麻煩,甚至能夠把登陸用戶的全部我的信息,包括手機號、郵箱所有打印在日誌裏,就看你是否顧慮安全問題了。安全
在上面的第一步,咱們用php
輸出了一個特殊header
,原本咱們這個header
只是供nginx消費用的,可是這個header
會被nginx原封不動地顯示給前端,可能會有細心的用戶感到不安。爲此咱們能夠在nginx的server
設置裏再加一個小開關,隱藏掉這個頭部:cookie
proxy_hide_header X-UID;
這樣用戶從瀏覽器端就看不到這個特殊頭部了,而並不影響nginx記錄它。
那麼咱們費這麼大力氣,記錄下來一個ID有什麼用呢?這個用處可就大了。你們都知道咱們有一個日誌分析的利器logstash
,經過它結合上ELK組件能夠分析處理Apache或者nginx日誌。若是咱們沒有這個ID信息的話,最多也只能分析出來哪個網頁常常被用戶訪問,僅此而已。但如今咱們有了用戶ID,咱們甚至能夠鏈接mysql數據庫表進行分析,研究哪個年齡段的,哪個性別的,或者哪個城市的用戶喜歡訪問什麼網頁,甚至有針對性地瞭解具體某一個用戶,他喜歡在什麼時間段訪問什麼網頁,進而有針對性地爲他提供定製化的服務。這還不夠強大嗎?