十周四次课(3月5日)

11.22 访问日志不记录静态文件

11.23 访问日志切割

11.24 静态元素过期时间

11.22 访问日志不记录静态文件

一个网站会有很多元素,尤其是图片、js、css等静态的文件非常多,用户每请求一个页面就会访问诸多的图片、js等静态元素,这些元素的请求都会被记录在日志中。如果一个站点访问量很大,那么访问日志文件增长会非常快,一天就可以达几GB这不仅对于服务器的磁盘空间造成影响,更重要的是会影响磁盘的读写速度。访问日志很重要,我们又不能不记录。还好这些巨量的静态元素请求记录到日志里意义并不大,所以可以限制这些静态元素去记录日志

  • 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录

在打开的网页上按F12,会出现如下的页面

2018.3.5 10周4次课_Linux

默认定位Network,刷新后会出现很多页面的元素,每一行代表一个元素。每一行都是一个请求,每个请求都会记录访问日志。

  • 把虚拟主机配置文件改成如下:

<VirtualHost *:80>

   DocumentRoot "/data/wwwroot/111.com"

   ServerName 111.com

   ServerAlias www.example.com 2111.com.cn

   #<Directory /data/wwwroot/111.com>  

   #<FilesMatch 123.php>

   #   AllowOverride AuthConfig

   #   AuthName "111.com user auth"

   #   AuthType Basic

   #   AuthUserFile /data/.htpasswd

   #   require valid-user

   #</FilesMatch>

   #</Directory>

   <IfModule mod_rewrite.c>

       RewriteEngine on

       RewriteCond %{HTTP_HOST} !^111.com$

       RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]

   </IfModule>

   ErrorLog "logs/111.com-error_log"

  SetEnvIf Request_URI ".*\.gif$" img

   SetEnvIf Request_URI ".*\.jpg$" img

   SetEnvIf Request_URI ".*\.png$" img

   SetEnvIf Request_URI ".*\.bmp$" img

   SetEnvIf Request_URI ".*\.swf$" img

   SetEnvIf Request_URI ".*\.js$" img

   SetEnvIf Request_URI ".*\.css$" img

   CustomLog "logs/111.com-access_log" combined env=!img

</VirtualHost>

先定义了一个image环境变量,把gif、jpg、png、bmp、swf、js、css等格式的文件全部归类到image里,后面的env=!image有用到一个“ !" 这相当于取反了,意思是把 image以外的类型文件记录到日志里。

2018.3.5 10周4次课_Linux_02

分别加载jpg1和jpg格式

2018.3.5 10周4次课_学习_03

查询日志:tail /usr/local/apache2.4/logs/111.com-access_log

2018.3.5 10周4次课_Linux_04

可以看到只记录了jpg1,没有记录jpg

上传一张baidu.php测试

2018.3.5 10周4次课_学习_05

2018.3.5 10周4次课_Linux_06

2018.3.5 10周4次课_学习_07

日志里面没有:tail /usr/local/apache2.4/logs/111.com-access_log

2018.3.5 10周4次课_学习_08

11.23 访问日志切割

日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件

打开虚拟主机配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

更改CustomLog这行配置为:CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img

正常应该CustomLog后面为日志文件名,但在这里用了一个管道,它会把日志内容交给后面的rotatelogs命令处理。这个rotatelogs为httpd自带切割日志的工具,它会把访问日志按我们定义的文件名格式进行切割

-l:以当前系统的时间为基准,如果不指定就以UTC格式的时间为基准来切割(中国是CST,美国是UTC)

%Y%m%d :年月日

86400单位是“秒":相当于“一天"。

保存配置文件后,测试配置文件是否有错误,没有错误重新加载服务

2018.3.5 10周4次课_Linux_09

用curl测试:curl -x127.0.0.1:80 111.com/123.php

2018.3.5 10周4次课_学习_10

11.24 静态元素过期时间

在上面的日志里,如果你观察地很仔细,会发现有一个状态码为304,这个状态码表示该文件已经缓存到用户的电脑里了,再次请求它的时候不用从服务器上下载,而是直接访问用户电脑里面的缓存。这样做的目的是降低服务器的资源消耗,还可以提升用户访问网站的速度。平时我们访问一个网站时,很多元素为静态的小图片,那这些小图片完全可以缓存在咱们的电脑里,这样再次访问该站点时,速度就会很快。

那到底能缓存多久呢?如果服务器上的某个图片更改了,那么应该访问新的图片才对。这就涉及一个静态文件缓存时长的问题,也叫作“缓存过期时间"。在httpd的配置文件中,我们是可以控制这个时间的。

  • 浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了,状态码为304

  • 编辑虚拟主机配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>

   DocumentRoot "/data/wwwroot/abc.com"

   ServerName abc.com

   ServerAlias www.abc.com www.123.com

   ErrorLog "logs/abc.com-error_log"

   CustomLog "logs/abc.com-access_log" common

</VirtualHost>

   DocumentRoot "/data/wwwroot/111.com"

   ServerName 111.com

   ServerAlias www.example.com 2111.com.cn

   #<Directory /data/wwwroot/111.com>  

   #<FilesMatch 123.php>

   #   AllowOverride AuthConfig

   #   AuthName "111.com user auth"

   #   AuthType Basic

   #   AuthUserFile /data/.htpasswd

   #   require valid-user

   #</FilesMatch>

   #</Directory>

  <IfModule mod_rewrite.c>

       RewriteEngine on

       RewriteCond %{HTTP_HOST} !^111.com$

       RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]

  </IfModule>

  <IfModule mod_expires.c>

   ExpiresActive on  //打开该功能的开关

   ExpiresByType image/gif  "access plus 1 days"    //gif格式的文件过期时长为1天

   ExpiresByType image/jpeg "access plus 24 hours"   //jpeg格式的文件过期时长为24小时

   ExpiresByType image/png "access plus 24 hours"   //png格式的文件过期时长为24小时

   ExpiresByType text/css "now plus 2 hour"   //css格式的文件过期时长为2小时

   ExpiresByType application/x-javascript "now plus 2 hours"   //js格式的文件过期时长为2小时

   ExpiresByType application/javascript "now plus 2 hours"    //js格式的文件过期时长为2小时

   ExpiresByType application/x-shockwave-flash "now plus 2 hours"   //flash格式的文件过期时长为2小时

   ExpiresDefault "now plus 0 min"  //其他文件过期时长为0,就是不缓存

  </IfModule>

   ErrorLog "logs/111.com-error_log"

   SetEnvIf Request_URI ".*\.gif$" img

   SetEnvIf Request_URI ".*\.jpg$" img

   SetEnvIf Request_URI ".*\.png$" img

   SetEnvIf Request_URI ".*\.bmp$" img

   SetEnvIf Request_URI ".*\.swf$" img

   SetEnvIf Request_URI ".*\.js$" img

   SetEnvIf Request_URI ".*\.css$" img

   CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img

</VirtualHost>

检测:/usr/local/apache2.4/bin/apachectl –t

2018.3.5 10周4次课_学习_11

  • 检查是否加载了expires模块:/usr/local/apache2.4/bin/apachectl -M |grep expires

2018.3.5 10周4次课_学习_12

没有任何输出,说明没有加载

编辑主配置文件:vim /usr/local/apache2.4/conf/httpd.conf

LoadModule expires_module modules/mod_expires.so   //去掉行首的#

重新加载:/usr/local/apache2.4/bin/apachectl graceful

2018.3.5 10周4次课_Linux_13

  • 使用curl来测试

2018.3.5 10周4次课_学习_14

可以看到cache-control:max-age=86400,php的图片将缓存86400秒。还有按理说既然有缓存,那我们请求该图片时状态码应该为304才对,但这里是200。这是因为我们使用curl工具来请求的,它并不像浏览器那样可以缓存这些文件,另max-age=0,说明没有缓存该类型的文件。