nginx訪問日誌/日誌切割/靜態文件過時時間/防盜鏈

Nginx訪問日誌主要記錄部署在nginx上的網站訪問數據,日誌格式定義在nginx主配置文件中。css

nginx主配置文件:/etc/nginx/nginx.conflinux

查看nginx主配置文件:nginx

```markup
[root@linux ~]# cat /etc/nginx/nginx.conf 
```
下圖紅框內就是定義的nginx訪問日誌的格式:
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191015141253347.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Bvd2VyZnVsX0Z5,size_16,color_FFFFFF,t_70)
#main:格式名
$remote_addr:訪問網站的IP
$remote_user:若是配置了用戶認證,表示用戶認證的用戶名
$time_local:訪問時間
$request:http方法,請求的連接,http版本
$status:http狀態碼
$body_bytes_sent:請求大小
$http_referer:客戶端請求時的referer,通俗講就是該請求是經過哪一個連接跳轉過來的
$http_user_agent:客戶端操做系統和瀏覽器標識
$http_x_forwarded_for:若是使用了代理,記錄代理IPshell

訪問日誌配置路徑:
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191015143905960.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Bvd2VyZnVsX0Z5,size_16,color_FFFFFF,t_70)
**針對單個nginx虛擬主機配置訪問日誌:**瀏覽器

1.編輯nginx虛擬主機配置文件:緩存

```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf
```
2.定義訪問日誌存放路徑和格式:
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191015144313204.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Bvd2VyZnVsX0Z5,size_16,color_FFFFFF,t_70)
3.重載nginx:服務器

```markup
[root@linux ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux ~]# nginx -s reload
```
4.在瀏覽器訪問虛擬主機配置的網站後便可生成日誌信息:
```markup
[root@linux ~]# cat /data/logs/nginx.log 
192.168.234.1 - - [15/Oct/2019:14:48:15 +0800] "GET /?p=1 HTTP/1.1" 200 57931 "http://www.blog.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.234.1 - - [15/Oct/2019:14:48:15 +0800] "GET /wp-includes/js/comment-reply.min.js?ver=5.2.3 HTTP/1.1" 301 169 "http://www.blog.com/?p=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.234.1 - - [15/Oct/2019:14:48:15 +0800] "GET /wp-includes/js/comment-reply.min.js?ver=5.2.3 HTTP/1.1" 200 2234 "http://www.blog.com/?p=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
```
**nginx日誌不記錄靜態文件:**curl

在上面定義好的訪問日誌中,會記錄特別多的請求信息,因此須要過濾掉一些圖片、js、css類的請求日誌,這樣的日誌通常記錄的意義不大,當網站訪問量大時還特別耗費磁盤空間。工具

編輯nginx虛擬主機配置文件:post

```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf 
```
添加如下內容:

```markup
location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
    {
        access_log off;
    }
```
#包含.png/.jpeg/.gif/.js/.css/.bmp/.flv結尾的請求就不會記錄到訪問日誌中,點前面的 \ 表示脫義符,shell中點表示任意字符,~*表示不區分大小寫匹配,詳情查看上一篇文章:[nginx location優先級詳解](https://blog.csdn.net/Powerful_Fy/article/details/102555453)

重載nginx便可生效:

```markup
[root@linux ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux ~]# nginx -s reload
```
**nginx訪問日誌切割:**

當nginx訪問日誌記錄的信息愈來愈大的時候,不只佔磁盤空間還影響查看日誌等操做,定時對nginx訪問日誌進行切割操做能夠便於日誌管理與查看

linux系統自帶的日誌切割工具logrotate:

配置文件:/etc/logrotate.conf
子配置文件:/etc/logrotate.d/*

因爲當前機器上nginx是yum安裝的,因此logrotate子配置文件目錄已經存在nginx日誌切割配置文件:

```markup
[root@linux ~]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        daily            #按天切割
        missingok        #忽略報錯
        rotate 52        #保留52個切割文件(也就是52天)
        compress        #壓縮(延後一天才會壓縮)
        delaycompress    
        notifempty        #爲空不壓縮
        create 640 nginx adm    #建立新日誌的權限,老日誌文件會改名(xxxlog-20190101)
        sharedscripts    #重新載入配置文件,生成新的日誌文件
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}
```
#該配置文件第一行切割的日誌文件爲nginx訪問日誌文件

將上面添加的nginx單個虛擬主機的訪問日誌添加到nginx切割配置文件中:

```markup
/var/log/nginx/*.log /data/logs/nginx.log{  #添加虛擬主機的訪問日誌路徑
        daily
        dateext        #切割文件按日期後綴保留
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}
```
測試:

```markup
[root@linux ~]# logrotate -f /etc/logrotate.d/nginx 
[root@linux ~]# ls /data/logs/
nginx.log  nginx.log-20191015
```
#顯示已成功切割,接下來天天凌晨就會自動切割nginx虛擬主機的訪問日誌了

**nginx緩存靜態文件過時時間配置:**

上文中將png/jpeg/js/css等靜態文件設置爲不記錄訪問日誌,那麼這些文件在首次訪問網站時,會緩存到本地,以後再吃訪問,因爲有了緩存就不會繼續向服務器請求這些靜態文件,節省帶寬,可是若是網站有更新,涉及到的緩存不更新的話就顯示不出更新內容,因此須要讓緩存文件有時效性。

針對png/jpeg/js/css等靜態文件設置緩存過時時間:

```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf 
```
在針對png/jpeg/js/css等靜態文件location中添加expires配置項:

```markup
  location ~* \.(png|jpeg|gif|js|css|bmp|flv)$
        {
                 access_log off;
                 expires 1d;
        }
```
#定義expires配置項值爲1d,表示緩存過時時間爲1天,若是上次訪問網站時間超過1天就會更新緩存的靜態文件,時間單位還能夠設置爲h(小時)、m(分鐘)

 

什麼是防盜鏈?

1.分別有兩個網站A和B,A網站經過http地址引用了B網站的圖片,這就叫作盜鏈
2.防盜鏈:防止A引用B網站的圖片

當前B網站www.blog.com下有一張圖片5.jpg,訪問測試:

```markup
[root@linux ~]# curl -I -x127.0.0.1:80  http://www.blog.com/5.jpg
HTTP/1.1 200 OK
```
#http狀態碼200,能夠訪問該圖片

使用A網站test.bbs.com引用B網站www.blog.com的圖片5.jpg:

```markup
[root@linux ~]# curl -I -x127.0.0.1:80 -e http://test.bbs.com/5.jpg http://www.blog.com/5.jpg
HTTP/1.1 200 OK
```
#http狀態碼200,A網站成功引用了B網站的圖片5.jpg

**配置nginx防盜鏈:**

打開nginx虛擬主機配置文件(B網站www.blog.com的配置文件):

```markup
[root@linux ~]# vi /etc/nginx/conf.d/default.conf 
```
添加以下配置:

```markup
location ~ \.(png|gif|jpeg|bmp|mp3|mp4|flv|jpg)$
{
    valid_referers none blocked server_names *.blog.com;
    if ($invalid_referer) {
           return 403;
        }
}
```
#location的對象爲.png/.gif/.jpeg/.bmp/.mp3/.mp4/.flv/.jpg表示防止引用的對象是這些格式的文件,server_names:指定白名單地址,非白名單地址對圖片的引用將會返回http狀態碼403

重載配置文件:

```markup
[root@linux ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux ~]# nginx -s reload
```

測試:

訪問B網站www.blog.com的圖片5.jpg:

```markup
[root@linux ~]# curl -I -x127.0.0.1:80  http://www.blog.com/5.jpg
HTTP/1.1 200 OK
```
#http狀態碼200,能夠訪問(由於nginx防盜鏈設置的白名單爲*.blog.com)

再次使用A網站test.bbs.com引用B網站www.blog.com的圖片5.jpg:

```markup [root@linux ~]# curl -I -x127.0.0.1:80 -e http://test.bbs.com/5.jpg http://www.blog.com/5.jpg HTTP/1.1 403 Forbidden ``` #http狀態碼403,防盜鏈配置成功,白名單外的地址已沒法引用B網站www.blog.com下的5.jpg

相關文章
相關標籤/搜索