2018-06-27 第十八次课 课后笔记

课前预习

11.16/11.17 Apache默认虚拟主机
11.18 Apache用户认证
11.19/11.20 域名跳转
11.21 Apache访问日志
11.22 访问日志不记录静态文件
11.23 访问日志切割
11.24 静态元素过期时间

 11.16/11.17 Apache默认虚拟主机

“虚拟主机”,早期的Lnux服务器上,一个服务器只能运行一个网站,也就是说只能跑一个域名。但随着技术的发展,一个服务器上可以跑多个域名了,这样可以帮我们节省了成本。其实这里的服务器就叫作主机,早期一个主机对应一个站点。现在不同了,一个主机可以跑多个站点,所以就有了虚拟主机的概念。我们可以把一台服务器虚拟出多个主机出来,这样就实现了一台服务器上,跑多个站点。
       既然服务器上可以有多个虚拟主机,每个虚拟主机都会定义一个域名(当然也可以定义多个)只要把这个域名解析指向到该台服务器,我们自然就可以访问这个站点了。我们访间一个网站,需要在浏览器里面输入域名,然后就能访问到网站内容。这个过程是需要浏览器和远程服务器通信的,网站内容就是从服务器上读取到的。而这个服务器是由你访问的域名来决定在哪里的,而域名之所以能决定服务器在哪里,就是因为这个域名做了解析指向。域名解析服务器IP地址。这个行为是由DNS服务器来完成的。
        假如你访问的域名指向了你的服务器,而你又在这台服务器上做了配置标记了这个域名,这样这个域名就能被正常访问。但如果没有在服务器上给这个域名做标记会发生什么呢?按理说,没有做标记的域名是不合法的,是不能正常返回结果的。
       htpd有一个特点,它首先是支持多个虚拟主机的,也就是说可以在一个服务器上运行多个站点,标记多个域名。但如果没有标记的域名也指向了这台服务器,那总得有一个处理这个域名的虚拟主机吧。而这个虚拟主机就叫作“默认虚拟主机”。通俗点讲,你的服务器上有很多域名,很多站点,很多虚拟主机,这些域名都是在htpd的配置文件中做过标记的,都是“名花有主”的,都是一一对应的,每个域名都能对应着自己的虚拟主机。但是,有一个特殊的域名也指向了服务器,却没有跟它对应的虚拟主机。这时候,htpd就会把这个域名直接丢给一个特殊的虚拟主机来处理。那这个特殊的虚拟主机就是“默认虚拟主机”。

  • 首先是如何在本地编辑hosts文件,文件的地址如下:

然后加入一行:

写好之后 必须保存才能生效:

然后回到windows下cmd测试一下 是否能ping通 加入的域名:

也可以在浏览器上ping通。可以看到能ping通。

 

        总结成一句话,任何一个域名指向这台服务器,只要是没有对应的虚拟主机,就会由这个默认虚拟主机来处理。那这个默认虚拟主机长啥样,我们怎么去配置它?还是先来看看httd的配置文件吧。

  • 编辑配置文件httpd.conf(这个是htpd服务的主配置文件)
[root@hongwei ~]# vim /usr/local/apache2.4/conf/httpd.conf


# Language settings
#Include conf/extra/httpd-languages.conf

# User home directories
#Include conf/extra/httpd-userdir.conf

# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf

# Virtual hosts
Include conf/extra/httpd-vhosts.conf      这一行的最前面的#号删掉

# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf

# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf

# Various default settings
  • 然后保存主配置文件,然后编辑虚拟主机配置文件:
[root@hongwei ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

# Virtual Hosts
#
# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/usr/local/apache2.4/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/usr/local/apache2.4/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>


  • 该文件最后面的两段(以< VirtualHost>开头,以</VirtualHost结尾),这样一段就是一个虚拟主机,在这里面可以定义网站的域名和对应的网站程序所在目录。而默认虚拟主机就是第个配置段,把该配置文件里面的两段</ VirtualHost>重新编辑如下:
[root@hongwei ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/adc.com"
    ServerName adc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/123.com"
    ServerName 123.com
    ServerAlias www.exexample.com
    ErrorLog "logs/123.com-error_log"
    CustomLog "logs/123.com-access_log" common
</VirtualHost>


ServerAdmin指定管理员邮箱,这个没有什么实质作用,。 DocumentRoot为该虚拟主机站点的根目录,网站的程序就放在这个目录下面。 ServerName为网站的域名, ServerAlias为网站的第二域名, ServerAlias后面的域名可以写多个,用空格分隔,但 ServerName后面的域名不支持写多个。 ErrorLog为站点的错误日志, CustomLog为站点的访问日志。

        假如在虚拟主机配置文件中,我们只定义了两个站点— abc.com和123.com,那么当把第三个域名111. com指向本机的时候,当在浏览器访问 111. com时,会去访问 abc. com,也就是默认虚拟主机。

  • 我们做个测试如下:

1.首先创建一个日志目录

[root@hongwei ~]# mkdir /data/wwwroot/
[root@hongwei ~]# mkdir /data/wwwroot/abc.com
[root@hongwei ~]# mkdir /data/wwwroot/123.com

2.然后在对应根目录下站点建立一个index.php.编写一个abc.com。同理123也是一样的。

[root@hongwei ~]# vim /data/wwwroot/abc.com/index.php

<?php
echo "abc.com"
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
-- 插入 --                                                                                                         2,15         全
[root@hongwei ~]# vim /data/wwwroot/123.com/index.php

<?php
echo "123.com"
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
~                                                                                                                                    
:w                                                                                                                 

3.然后检查语法是否有错误:

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

4.然后重新加载httpd服务:

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful

5.这样就可以访问了

abc.com[root@hongwei ~]# curl -x127.0.0.1:80 www.123.com
abc.com[root@hongwei ~]# curl -x127.0.0.1:80 www.111.com
abc.com[root@hongwei ~]# curl -x127.0.0.1:80 www.121.com
abc.com[root@hongwei ~]# curl -x127.0.0.1:80 www.example.com
123.com[root@hongwei ~]# 

由此,可以看出默认虚拟主机为 abc. com,不管把什么域名指向该服务器,只要配置文件中没有标记,就会访问这个默认虚拟主机。

 11.18 Apache用户认证

这个功能就是在用户访问网站的时候,需要输入用户名密码才能顺利访问。一些比较重要的站点,或者网站后台通常会加上用户认证,目的是保证安全。先来对123com站点做一个全站的用户认证。

1.首先因为第一个使我们的默认主机,我们不去编辑它,编辑第二个123.com。
#vim/usr/local/apache2.4/conf/extra/httpd-vhosts.conf
2.把123.com那个虚拟主机编辑成如下内容
[root@hongwei ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/aba.com-error_log"
    CustomLog "logs/aba.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/123.com"
    ServerName 123.com
    ServerAlias www.example.com
    <Directory /data/wwwroot/123.com>
        AllowOverride AuthConfig    //这个相当于打开认证的开关
        AuthName "123.com user auth"  //自定义认证的名字,作用不大
        AuthType Basic  //认证的类型,一般为Basic,其他类型阿铭没用过
        AuthUserFile /data/.htpasswd //指定密码文件所在位置
        require valid-user  //指定需要认证的用户为全部可用用户
    </Directory>
</VirtualHost>

3.这样httpd的配置文件配置完成,但还需要我们创建密码文件,如下:
这样htpd的配置文件配置完成,但还需要创建密码文件,操作步骤如下
#/usr/local/apache2. 4/bin/htpasswd -cm /data/. htpasswd hongwei
New password
Re-type new password:
Adding password for user hongwei

/ / htpasswd命令为创建用户的工具,C为 create(创建),-m指定密码加密方式为MD5,
// data/, teas5sd为密码文件, aming为要创建的用户。第一次执行该命今需要加=C
// 第二次再创建新的用户时,就不用加=C了,否则data/ htpasswd文件会被重置,之前的用户被清空

#/usr/1oca1/ apache2,4/bin/ apachectl-t//验证没有问题后才能重启或者重新加载
Syntax OK
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful
httpd not running, trying to start
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl restart
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@hongwei ~]# ^C
  • 配置完成后,需要到宿主机(你的真实电脑 Windows)上去修改一下 hosts文件,类似 Linux上的etc/hosts,把www,123,comn域名指向你的这台Linux机器,这样才能通过浏览器访问到www.123.com。Windows上的 hosts文件所在路径为C: Windows\ Systen32 driversletc\hosts,编辑它可能会提示用什么方式打开,选择“记事本”或者“写J字板”都可以。在最下面增加一行0.因为上面我们已经操作了这一项,所有不再列出。

保存hosts文件后,在linux下curl一下,会出现401报错:如下:

[root@hongwei ~]# curl -x127.0.0.1:80 123.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
[root@hongwei ~]# curl -x127.0.0.1:80 123.com -I
HTTP/1.1 401 Unauthorized
Date: Thu, 28 Jun 2018 06:34:11 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="123.com user auth"
Content-Type: text/html; charset=iso-8859-1

[root@hongwei ~]# 

401就是你访问的用户需要认证。

在用浏览器实验一下:

928e761930cc903b7b995ccd08bf1c40bf7.jpg

2aee276c338c737678cfa6898821118d851.jpg

  • 输入用户名和密码后,将会进入www123com网站。上面的操作是针对整个站点做的认证,其实也可以针对某个目录或者某个文件进行认证,比如要对www.123.com/admin/目录进行认证,只需要修改一个地方,把<Directory /data/wwwroot/www.123.com>改为<Directory /data/wwwroot/www.123.com/admin/>。如果是一个文件,比如www.123com/admin.php,则需要这样做
<VirtualHost * 80>
Documentroot/data/wwwrooT/www.123.com'
Servername Www.123.Com
<FilesMatch admin. php>
AllowOverride AuthConfig
AuthType Basic
AuthName 123. com user auth
AuthUserFile /data/. htpas swd
require valid-user
</FilesMatch>
</VirtualHost>
  • 当我们在linux下把密码加上的时候就不提示401了,如下:
[root@hongwei ~]# curl -x127.0.0.1:80 -uhongwei:woshi10086 123.com
123.com[root@hongwei ~]# 

 

 11.19/11.20 域名跳转

一个网站可以有多个域名,比如阿铭的论坛可以用www.lishiming.net,也可以用askapelearn.com访问,而用www.lishiming.net访问的时候,浏览器里面的网址直接变成了ask.apelearn.com,这其实就是域名的跳转过程。做域名跳转有什么用呢?主要有两方面的作用:第一,一个站点有多个域名会对SEO有影响,说白了就是百度搜索关键词的排名有影响,如果把多个域名全部跳转到指定的一个域名,这样以这个域名为中心,就可以把权重集中在这个域名上所以搜索关键词的排名也就靠前了;第二,如果之前的某个域名不再使用了,但是搜索引擎还留着之前老域名的链接,这意味着用户可能会搜到我们的网站并且点击老的域名,固需要把老域名做个跳转跳到新域名,这样用户搜的时候,也可以访问到网站。
那下面实现一个需求,把123com域名跳转到www.123com,配置如下

<VirtualHost * 80>
Documentroot "/data/wwwroot/Www.123. com"
Servernamewww.123.com
Serveralias123.com
< I mOdule mod rewrite.C>//需要 mod rewrite模块支持
RewriteEngine on//打开 rewrite功能
Rewritecond%1httphosT)!wWw.123.coMs
/定义rewrite的条件,当主机名(域名)不是www.123com时满足条件
RewriteruleA/(.*)shttp://ww.123.com/$1[r=301,L]
/定义 rewrite规则,当满足上面的条件时,这条规则才会执行
</IfModule>
</VirtualHost>

在 RewriteRule里是有正则表达式存在的, RewriteRule后面由空格划分成三部分,第一部分为当前的URL(也就是网址不过这个URL是不把主机头(也就是域名)算在内的。第二部分为要跳转的目标地址,这个地址可以写全(包含了主机头),当然也可以不加主机头,默认就是前面定义的 ServerName。第三部分为一些选项,需要用方括号括起来,301为状态码,它称作“永久重定向”(还有一种跳转用的状态码为302,叫作“临时重定向”),L表示“ last”,意思是跳转一次就结束了。要实现域名跳转,需要有 rewrite模块支持,所以先查看httd是否已经加载该模块,如果没有还需要配置:

# /usr/local/apache2. 4/bin/apachectl -MIgrep -i rewrite
/如果没有任何输出,则需要编辑配置文件
4vim/usr/local/apache2.4/conf/httpd.conf//搜索rewrite找到那行把前面的#删除
#f /usr/local/apache2. 4/bin/apachectl graceful
#f /usr/local/apache2. 4/bin/apachectl -M grep -i rewrite
( shared)//有这一行输出,说明正常加载 rewrite模块
rewrite module

配置完后,进行测试,在这里阿铭用cur测试就可以看到效果,如下

# cur1-x127.0.0.1:80-I 123.com
Http/1.1 301 Moved Permanently
Date: Sat, 18 Mar 2017 02: 26: 03 GMT
Server: Apache/2. 4.25(Unix)PHP/5.6.30
Locationhttp://
Content-Type: text/html; charset=iso-8859-1

可以看到状态码为301,跳转后的网址( Location那行)为htp:/ww.123com/。

 11.21 Apache访问日志

访问日志作用很大,不仅可以记录网站的访问情况,还可以在网站有异常发生时帮助我们定位问题,比如当有攻击时,是可以通过查看日志看到一些规律的。要配置httpd访问日志,首先要在主配置
文件中定义访问日志的格式,打开主配置文件

#vim/usr/local/apache2.4/conf/httpd.conf//搜索logformat
LogFormat"%h‰1‰u%t\"%r\"‰s‰b\"%{ Referer}i""%{User- Agent}il"" combined
LogFormat"%h‰1‰%t\"%r\"‰>s‰b" common

可以看到两个格式的日志,建议使用第一个,记录的信息会更全。‰h为访问网站的IP;‰为远程登录名,这个字段基本上为“-”;%u为用户名,当使用用户认证时,这个字段为认证的用户名;%t为
时间;%r为请求的动作(比如用cur1-I 时就为 HEADE;%s为请求的状态码,写成%>s为最后的状态码;%b为传输数据大小;%{ Referer}i为 referer信息(请求本次地址上一次的地址就为 referer,比如在百度中搜索阿铭 Linux,然后通过百度的搜索结果页面点击然后到了阿铭的论坛,那访问阿铭论坛的这次请求的 referer就是 baidu,当然那个地址肯定是很长的);%{User- Agent}为浏览器标识,比如你用Firefox或者 Chrome浏览器,则该字段显示内容不一样,是带有浏览器的标识的。对于这个日志格式,也可以自定义调整各个字段的位置,也可以额外增加其他字段,比如可以增加%D(请求耗费时间)。

然后继续编辑虚拟主机配置文件:

[root@hongwei ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/123.com"
    ServerName 123.com

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/123.com"
    ServerName 123.com
    ServerAlias www.123.com
    <IfModule mod_rewrite.c> 
        RewriteEngine on          RewriteCond %{HTTP_HOST} !^www.123.com$  
        RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L] 
</IfModule>
CustomLog "logs/123.com-access_log" combined
</VirtualHost>




~                                                                                            
~                                                                                            
~                                                                                            
~                                                                                            
~                                                                                            
~                                                                                            
                                                                           30,0-1       底端

保存文件之后,测试语法错误并重新加载:

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@hongwei ~]# 

然后我们curl一下,在看一下日志文件,发现生成了许多相关的日志文件
 

[root@hongwei ~]# curl -x127.0.0.1:80 -I 123.com
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2018 07:09:27 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8

[root@hongwei ~]# curl -x127.0.0.1:80 -I 123.com
HTTP/1.1 200 OK
Date: Thu, 28 Jun 2018 07:09:28 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8

[root@hongwei ~]# tail /usr/local/apache2.4/logs/123.com-access_log
127.0.0.1 - - [27/Jun/2018:22:35:36 +0800] "GET HTTP://www.example.com HTTP/1.1" 200 7
192.168.73.1 - - [28/Jun/2018:14:40:50 +0800] "GET / HTTP/1.1" 401 381
192.168.73.1 - - [28/Jun/2018:14:41:02 +0800] "GET / HTTP/1.1" 401 381
127.0.0.1 - hongwei [28/Jun/2018:14:45:47 +0800] "GET HTTP://123.com HTTP/1.1" 200 7
127.0.0.1 - hongwei [28/Jun/2018:14:46:13 +0800] "GET HTTP://123.com HTTP/1.1" 200 7
127.0.0.1 - - [28/Jun/2018:15:09:14 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:09:25 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:09:27 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:09:28 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0
[root@hongwei ~]# tail /usr/local/apache2.4/logs/123.com-access_log
127.0.0.1 - hongwei [28/Jun/2018:14:46:13 +0800] "GET HTTP://123.com HTTP/1.1" 200 7
127.0.0.1 - - [28/Jun/2018:15:09:14 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:09:25 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:09:27 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:09:28 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
192.168.73.1 - - [28/Jun/2018:15:11:06 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:11:09 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:11:14 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - hongwei [28/Jun/2018:15:11:20 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:11:21 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"

 

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

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

首先还是进入到虚拟主机配置文件中去,修改如下:

[root@hongwei ~]# !vim
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/123.com"
    ServerName 123.com
    ServerAlias www.123.com
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^www.123.com$
        RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
</IfModule>
    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/123.com-access_log" combined env=!img

然后接着保存,测试语法错误并重新加载:

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful

接着我们访问123.com下的一个随意的jpg格式的,发现没有被记录:

[root@hongwei ~]# curl -x127.0.0.1:80 123.com/sfdsfdsf.jpg -I
HTTP/1.1 404 Not Found
Date: Thu, 28 Jun 2018 07:31:14 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1

[root@hongwei ~]# tail /usr/local/apache2.4/logs/123.com-access_log
192.168.73.1 - - [28/Jun/2018:15:20:23 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:20:24 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:20:25 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:20:26 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:21:45 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.73.1 - - [28/Jun/2018:15:22:03 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:22:11 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:22:15 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:22:16 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
192.168.73.1 - - [28/Jun/2018:15:22:20 +0800] "GET / HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"

那我们访问一个jpg1格式的,因为jpg1格式没有被限制,所以能看到访问的日志:

be045de9e0498df703348ce2d8d14d996c7.jpg

11.23 访问日志切割

 我们前面限制了静态文件的日志,由于文件过大,需要把日志按天归档,一天一个日志,这样也可以防止单个日志文件过大。配置如下:

 <VirtualHost *:80>
    DocumentRoot "/data/wwwroot/www.123.com"
    ServerName www.123.com
    ServerAlias 123.com
   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/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>

先定义了一个 image- request环境变量,把gif、jpg、png、bmp、swf、js、cs等格式的文件全部归类到 Image- request里,后面的env=! Image- request有用到一个“!”,这相当于取反了,意思是把image- request以外的类型文件记录到日志里。正常应该 CustomLog后面为日志文件名,这里用了一个管道,它会把日志内容交给后面的rotatelogs命令处理。这个 rotetelogs为htpd自带切割日志的工具,它会把访问日志按我们定义的文件名格式进行切割,其中86400单位是“秒”,相当于“一天”。

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

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful

然后我们看一下/usr/local/apache2.4/logs/下,访问一下,才能看到新生成的日志。

44cb3975c1f1ae81c199225b69b3581482a.jpg

9865efb6a3e4d9f50e2c0dc12d220aa11fc.jpg

再来测试一下,切割日志:

[root@hongwei ~]# touch /data/wwwroot/123.com/hongwei.jpg
[root@hongwei ~]# touch /data/wwwroot/123.com/hongwei.txt
[root@hongwei ~]# curl -x127.0.0.1:80 123.com/hongwei.jpg
[root@hongwei ~]# curl -x127.0.0.1:80 123.com/hongwei.txt
[root@hongwei ~]# cat /usr/local/ap
apache2/   apache2.4/ apr/       apr-util/  
[root@hongwei ~]# cat /usr/local/apache2
apache2/   apache2.4/ 
[root@hongwei ~]# cat /usr/local/apache2.4/logs/123.com-access_20180628.log 
127.0.0.1 - - [28/Jun/2018:15:43:08 +0800] "HEAD HTTP://123.com HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [28/Jun/2018:15:48:18 +0800] "GET HTTP://123.com/hongwei.txt HTTP/1.1" 200 - "-" "curl/7.29.0"

可以看到,123 com-access_20180628.og日志中只有hongwei txt的请求日志,但没有 hongwei. Jpg的请求日志,去除了静态元素记录日志,日志文件会瘦身很多。

 11.24 静态元素过期时间

        在上面的日志里,会发现有一个状态码为304,这个状态码表示该文件已经缓存到用户的电脑里了,再次请求它的时候不用从服务器上下载,而是直接访问用户电脑里面的缓存。这样做的目的是降低服务器的资源消耗,还可以提升用户访问网站的速度。平时我们访问一个网站时,很多元素为静态的小图片,那这些小图片完全可以缓存在咱们的电脑里,这样再次访问该站点时,速度就会很快。
       那到底能缓存多久呢?如果服务器上的某个图片更改了,那么应该访问新的图片才对。这就涉及一个静态文件缓存时长的问题,也叫作“缓存过期时间”。在htpd的配置文件中,我们是可以控制这个时间的。编辑虚拟主机配置文件,内容如下:

[root@hongwei ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^www.123.com$
        RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
</IfModule>
    ErrorLog "logs/123.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/123.com-access_%Y%m%d.log 86400" combined env=!img
<IfModule mod_expires.c>
    ExpiresActive on  //打开该功能的开关
    ExpiresByType image/gif  "access plus 1 days"
    ExpiresByType image/jpeg "access plus 24 hours"
    ExpiresByType image/png "access plus 24 hours"
    ExpiresByType text/css "now plus 2 hour"
    ExpiresByType application/x-javascript "now plus 2 hours"
    ExpiresByType application/javascript "now plus 2 hours"
    ExpiresByType application/x-shockwave-flash "now plus 2 hours"
    ExpiresDefault "now plus 0 min"
</IfModule>
-- 插入 --           

接着保存并测试语法错误并重新加载:

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@hongwei ~]# 

这部分配置用到了 mod expires模块,这里gif、Jpeg、png格式的文件过期时长为1天,CSs、J5、f1ash格式的文件过期时长为2小时,其他文件过期时长为0,也就是不缓存。

检查httd是否加载 expires模块

d0970d9aaf17b1ac1b1cdbd58c538c5503f.jpg
没有任何输出,说明当前htpd并不支持 expires模块,所以需要修改配置文件,打开该模块
#vim/usr/local/apache2.4/conf/httpd.conf//搜索expires关键词,找到下面的行
#LoadModule expires module modules/mod expires.so
59c61008805e56591a65d05f6077344fc84.jpg
重新加载服务

[root@hongwei ~]# /usr/local/apache2.4/bin/apachectl graceful

然后看看是否加载了expires模块

58b546fe4c2707e05c1672a893cf6f31181.jpg
expires module( shared)有这行输出,说明已经正确加载 expires模块

下面使用curl来测试一下效果:

da2a8f017a2abfac1f8f38f420f1c279b0e.jpg

可以看到max-age=86400,这说明jpg的图片将缓存86400秒,也就是一天。在上面提到了状态码为304,按理说既然有缓存,那我们们请求该图片时也应该为304才对,但这里却是200。这是因为我们是使用cur1工具来请求的,它并不像浏览器那样可以缓存这些文件。另外也可以测试一下txt的文件
2970c5d1956cc0edbcc2c1c09b4efcb2462.jpg
其中max-age=0,说明没有缓存该类型的文件。

转载于:https://my.oschina.net/u/3851487/blog/1837108

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值