十八次课 2018-09-12

Apache默认虚拟主机

概念

一个服务器主机可以运行多个网站,每个网站都是一个虚拟主机;
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机;
在dns还未生效时,通过修改hosts文件,设置ip与域名的映射解析,来配置域名。

在这里插入图片描述

问题:为什么我们在 创建一个php测试文本:vi /usr/local/apache2.4/htdocs/1.php

把定义的测试网页放在 htdocs下,我们就能在浏览器访问到1.php呢?

答:原因是: vim /usr/local/apache2.4/conf/httpd.conf配置文件中:
在这里插入图片描述

则它 的域名就是上面定义的ServerName
在这里插入图片描述

这个就是apache的默认主机,当任意一个域名指向到机器的ip就可以访问到我们机器的站点

window下hosts的使用

Hosts文件是什么

Hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定。可以用文本文件打开!当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,浏览器会立即打开对应网页,如果没有找到,则浏览器会将网址提交DNS服务器进行IP地址解析。这也是提高快速打开网页的方法!

host路径

C:\Windows\System32\drivers\etc

在hosts文件定义一个域名让它解析到我们的ip

检测是否域名正确的解析到所指向的ip

ping 域名 看看显示是不是指向到我们的定义ip中
这个是临时的让 定义的域名访问到我们ip服务器上,仅是在DNS未启用时有效

//在host文件里新增一行
39.107.91.237 	www.abc.com www.123.com
//打开命令行ping www.abc.com 
ping www.abc.com
PING www.abc.com (39.107.91.237): 56 data bytes
64 bytes from 39.107.91.237: icmp_seq=0 ttl=49 time=24.158 ms
64 bytes from 39.107.91.237: icmp_seq=1 ttl=49 time=22.788 ms
64 bytes from 39.107.91.237: icmp_seq=2 ttl=49 time=22.147 ms
64 bytes from 39.107.91.237: icmp_seq=3 ttl=49 time=23.822 ms
64 bytes from 39.107.91.237: icmp_seq=4 ttl=49 time=22.784 ms
64 bytes from 39.107.91.237: icmp_seq=5 ttl=49 time=22.741 ms
64 bytes from 39.107.91.237: icmp_seq=6 ttl=49 time=22.865 ms

在这里插入图片描述

Linux下hosts

Linux下hosts文件在/etc/hosts
/etc/hosts里新增一行同样配置

39.107.91.237 	www.abc.com www.123.com

然后使用curl命令访问

#  curl www.abc.com
didibibabo

默认虚拟主机配置(可以定义多个ServerName)

好处是我们的一台服务器可以跑多个域名,不用局限所有域名都是解析到我们的同一个地方,一个配置文件只能定义到一个ServerName

1.在httpd.conf配置文件中启用虚拟主机配置文件

# vim /usr/local/apache2.4/conf/httpd.conf
//找到#Include conf/extra/httpd-vhosts.conf将#号去掉
Include conf/extra/httpd-vhosts.conf

2.打开虚拟主机配置文件

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
//将下面配置写入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>

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

说明

httpd-vhosts.conf配置文件中第一个<VirtualHost>就是默认虚拟主机
当一个域名解析到httpd服务器上,如果httpd服务器开启了虚拟主机功能。
而且httpd-vhosts.conf文件中没有配置使用该域名为ServerName或ServerAlias的虚拟主机
那么这个访问就会使用第一个虚拟主机的配置,这就是默认虚拟主机的作用。

一个 <VirtualHost> </VirtualHost> 标签的范围就是一个虚拟主机
<VirtualHost *:80> : *:80表示监听80端口
ServerAdmin  管理员的邮箱,没什么实际用处
DocumentRoot 网站的根目录,一般是网站主页文件所在的目录
ServerName   网站的域名  只能设置一个。
ServerAlias  网站的域名别名,可以设置多个
ErrorLog     错误日志文件所在的路径
CustomLog    访问日志文件所在的路径
common       固定格式,是指的日志格式,这个需要在httpd.conf文件中修改

3.创建虚拟主机的目录和测试文件

# mkdir -p /data/wwwroot/abc.com /data/wwwroot/123.com
# echo -e '<?php\n echo "www.test.com"\n?>' > /data/wwwroot/abc.com/index.php
# echo -e '<?php\n echo "www.1111.com"\n?>' > /data/wwwroot/1111.com/index.php

检查配置是否有语法错误,然后重载httpd配置

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

测试
1.
在此使用浏览器和curl命令分别进行测试,如果使用浏览器测试可以在Windows电脑中的 C:\Windows\System32\drivers\etc 目录下hosts文件中加入重定向域名,使直接访问Apache服务站点上,否则将无法测试,导致DNS直接解析到外网,从而访问外网网站,导致测试失败。
在这里插入图片描述

(出现此界面是因为使用的阿里云服务器,如果是虚拟机则会显示正常)
在这里插入图片描述
2.

# curl -x127.0.0.1:80 abc.com
www.test.com
# curl -x127.0.0.1:80 1111.com
www.1111.com
# curl -x39.107.91.237:80 abkjc.com  //注意abkjc.com,并没有在httpd-vhost.conf配置文件中有定义但是访问到的却是www.test.com的页面。

www.test.com

Apache的用户认证

当一些页面涉及安全问题,或者有某些页面有需要输入用户名和密码才能访问的需求时,可以开启这个功能,虽然现在的网站后台都需要使用管理员账号密码才能登陆,但是也不是十分的安全。

在这里插入图片描述

修改配置文件,开启用户认证

用户认证功能的配置可以在httpd.conf 文件中配置,也可以在虚拟主机的配置文件中实现,当然我们一般都是在虚拟主机的配置文件中增加相应的配置来实现用户认证的功能。

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把1111.com那个虚拟主机编辑成如下内容,一般不会在默认虚拟主机中使用用户认证功能

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
    <Directory /data/wwwroot/1111.com>
        AllowOverride AuthConfig
        AuthName "1111.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>
  • 配置文件说明
  <Directory /data/wwwroot/1111.com>  //指定认证的目录,另外也可以对指定的文件进行认证。
        AllowOverride AuthConfig       //这个相当于打开认证的开关
        AuthName "1111.com user auth"   //自定义认证的名字,作用不大
        AuthType Basic                 //认证的类型,一般为Basic,其他类型没用过
        AuthUserFile /data/.htpasswd   //指定密码文件所在位置
        require valid-user             //指定需要认证的用户为全部可用用户,
                                       //valid-user就是.htpasswd所有已定义的用户
    </Directory>                       //配置结束标签

生成用户和密码

这里需要使用apache的一个工具命令来创建用于认证的用户名和密码

//创建一个用户test
# /usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd test  
//-c 表示创建  -m 指定MD5加密 指定所在位置  如果再次增加用户可以不用-c选项,-c是首次创建文件使用的
New password: 
Re-type new password: 
Adding password for user test
# cat /data/.htpasswd
test:$apr1$fY/5c0/C$F9qwre8ct6ukR6Vn7qaWT/

检测并重新加载htppd配置文件

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

测试

浏览器测试
在这里插入图片描述
命令行测试

# curl -x127.0.0.1:80 1111.com -i
HTTP/1.1 401 Unauthorized
Date: Sun, 07 Oct 2018 05:44:01 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="1111.com user auth"
Content-Length: 381
Content-Type: text/html; charset=iso-8859-1
//-I选项表示自获取网页的头部信息 ,返回的状态码 401 表示该网页需要进行用户认证才能访问
//这时可以使用 -u选项指定用户名和密码,格式为 -uUserName:Password
# curl -x127.0.0.1:80 -utest:12345678 1111.com -i
HTTP/1.1 200 OK
Date: Sun, 07 Oct 2018 05:45:46 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Length: 12
Content-Type: text/html; charset=UTF-8
//状态码为200 表示可以正常访问。
# curl -x127.0.0.1:80 -utest:12345678 1111.com
www.1111.com

htpasswd命令介绍

htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。

语法: htpasswd [option] [参数]
Options:
-c:=create,创建一个加密文件
-n:不更新加密文件,只将更新后的用户名密码显示在屏幕上
-m:使用MD5算法对密码进行加密(默认)
-d:使用CRYPT算法对密码进行加密
-p:不对密码进行加密,即明文密码
-s:使用SHA算法对密码进行加密
-b:在命令行一并输入用户名和密码,而不是根据提示输入密码
-D:删除指定用户

针对文件的用户认证

修改配置文件

针对文件的用户认证和对目录的用户认证配置类似,只是一个标签的不同。
将前面针对目录的用户认证配置内容,修改为下面的内容:

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
#    <Directory /data/wwwroot/1111.com>  //注释Directory标签
     <FilesMatch 123.php>  //改成FilesMatch标签,针对123.php进行用户认证。
        AllowOverride AuthConfig
        AuthName "1111.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
     </FilesMatch>
#    </Directory>
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>

创建测试文件

# echo '<?php echo "1111.com/index.php " ?>' > /data/wwwroot/1111.com/123.php

重载配置文件

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

测试

# curl -x127.0.0.1:80 1111.com
www.1111.com
# curl -x127.0.0.1:80 1111.com/123.php -I  //访问1111.com/目录下的123.php 报错:401,需要用户认证
HTTP/1.1 401 Unauthorized
Date: Sun, 07 Oct 2018 06:00:53 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="1111.com user auth"
Content-Type: text/html; charset=iso-8859-1

# curl -x127.0.0.1:80 1111.com/123.php -I -utest:12345678 //用指定用户名&密码访问
HTTP/1.1 200 OK
Date: Sun, 07 Oct 2018 06:01:11 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8
# curl -x127.0.0.1:80 1111.com/123.php -utest:12345678
1111.com/index.php

域名跳转

当一个网站需要使用一个新的域名时,但是用户还只知道老的域名,这时就需要用到域名跳转的功能了,可以将旧的域名跳转到新的域名。

  • 302跳转是暂时的跳转,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。
  • 301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
  • SEO(Search Engine Optimization)搜索引擎优化,在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的预期目标。

配置域名跳转

# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
//继续修改1111.com的配置
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/1111.com"
    ServerName 1111.com
    ServerAlias www.example.com
#    <Directory /data/wwwroot/1111.com>  //可以将刚才的用户认证的配置注释
#     <FilesMatch 123.php>
#        AllowOverride AuthConfig
#        AuthName "1111.com user auth"
#        AuthType Basic
#        AuthUserFile /data/.htpasswd
#        require valid-user
#     </FilesMatch>
#    </Directory>
//添加如下的配置
     <IfModule mod_rewrite.c>  
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^1111.com$   
        RewriteRule ^/(.*)$ http://1111.com/$1 [R=301,L]
     </IfModule>
    ErrorLog "logs/1111.com-error_log"
    CustomLog "logs/1111.com-access_log" common
</VirtualHost>

  • 配置说明
<IfModule mod_rewrite.c>  //需要mod_rewrite模块支持

RewriteEngine on    //打开rewrite功能,off表示关闭

RewriteCond %{HTTP_HOST} !^1111.com$  //定义rewrite的条件,当请求的域名不是1111.com时满足条件。

RewriteRule ^/(.*)$ http://1111.com/$1 [R=301,L]  //定义rewrite规则,当满足上面的条件时,这条规则才会执行,这条规则表示主将域名后的内容也同步跳转到新域名。
^/(.*)$ 	正则匹配:匹配域名后面所有的内容
http://1111.com/$1	$1是前面第一个小括号匹配到的内容,如果有多个小括号可以一次类推
[R=301,L]	跳转所使用的状态码,301是永久跳转,使用301时搜索引擎会给新的域名增加权重
[302]	使用302作为跳转状态码。搜索引擎不会增加或减少域名的权重。
</IfModule>

修改httpd.conf配置文件,打开rewrite模块

//在httpd.conf配置文件找到下面的内容
# vim /usr/local/apache2.4/conf/httpd.conf

#LoadModule rewrite_module modules/mod_rewrite.so
//删除该内容开头的符号 ‘ # ’ 就可以打开rewrite功能模块了

重载配置文件

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

检查是否正常加载rewrite模块

# /usr/local/apache2.4/bin/apachectl -M | grep rewrite
 rewrite_module (shared)

测试

# curl -x127.0.0.1:80 www.example.com -I
HTTP/1.1 301 Moved Permanently
Date: Sun, 07 Oct 2018 06:36:04 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Location: http://1111.com/
Content-Type: text/html; charset=iso-8859-1
# curl -x127.0.0.1:80 www.example.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://1111.com/">here</a>.</p>
</body></html>

状态码为301,即设定了域名永久跳转

在浏览器进行检测时,访问“www.example.com”会直接跳转到“1111.com”。

Apache访问日志

所在目录

apache的日志分为访问日志,和错误日志两种,访问日志和错误日志默认都放在/usr/local/apache2.4/logs目录的下

# ll /usr/local/apache2.4/logs/
total 292
-rw-r--r-- 1 root root   2685 Oct  7 14:41 1111.com-access_log
-rw-r--r-- 1 root root    205 Oct  7 13:27 1111.com-error_log
-rw-r--r-- 1 root root  58978 Oct  7 14:29 abc.com-access_log
-rw-r--r-- 1 root root 120231 Oct  7 14:00 abc.com-error_log
-rw-r--r-- 1 root root  32693 Sep 11 22:51 access_log
-rw-r--r-- 1 root root  50364 Oct  7 14:29 error_log
-rw-r--r-- 1 root root      5 Oct  7 14:29 httpd.pid

如果没有定义日志文件的虚拟主机的访问日志都会放在access_log文件中

# tail -5 /usr/local/apache2.4/logs/access_log 
111.50.68.198 - - [11/Sep/2018:22:03:40 +0800] "GET /1.php HTTP/1.1" 200 77024
111.50.68.198 - - [11/Sep/2018:22:03:41 +0800] "GET /favicon.ico HTTP/1.1" 404 209
180.242.42.87 - - [11/Sep/2018:22:32:05 +0800] "GET / HTTP/1.1" 200 45
177.94.109.15 - - [11/Sep/2018:22:44:33 +0800] "GET / HTTP/1.1" 200 45
103.53.19.22 - - [11/Sep/2018:22:51:39 +0800] "GET / HTTP/1.1" 200 45

日志格式

apache 初始的日志格式比较简单,记录不够详细。我们可以修改配置文件来实现自定义的日志格式

查看httpd.conf配置文件中的初始日式格式

#   grep 'LogFormat' /usr/local/apache2.4/conf/httpd.conf
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

其中最后的combined 和 common 为日志格式的名字,在虚拟主机配置文件中使用CustomLog指令来指定日志格式,默认使用common模式,combined为更加详细的Log格式。

日志字段说明

%h:为访问网站的IP;
%l:为访问远程登录名,这个字段基本上为"-";
%u:为用户名,当使用用户认证时,这个字段为认证的用户名;
%t:访问时间;
%r:为请求的动作(比如用ctrl-I是就为HEADE);
%s:为请求的状态,写成%>s为最后的状态码;
%b:为传输数据大小;
%{Referer}i:为referer信息(请求本次地址上一次的地址就为referer,比如在百度中搜索阿铭linux,然后通过百度的搜索结果页面点击然后到了阿名的论坛,那访问阿铭的论坛的这次请求的referer就是baidu,当然那个地址肯定是很长的);
%{User-Agent}i:为浏览器标识,比如你用Firefox或者Chrome浏览器,则该字段显示内容不一样,是带有浏览器的标识的。

设置日志格式

编辑配置文件httpd-vhosts.conf
将abc.com的日志格式设置为combined

//在abc.com虚拟主机的配置中修改为如下配置
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 

 CustomLog "logs/abc.com-access_log" combined

重载apache 配置

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

查看新记录的访问日志

# curl -x127.0.0.1:80 abc.com
www.test.com
# tail -1 /usr/local/apache2.4/logs/abc.com-access_log 
127.0.0.1 - - [07/Oct/2018:15:00:34 +0800] "GET HTTP://abc.com/ HTTP/1.1" 200 12 "-" "curl/7.29.0"

访问日志不记录静态文件

一个网站很多内容都是静态的文件,比如jpg,css,js,mp4,flv,等等
当用户访问这个网站的时候,就会记录大量的访问这些静态文件的访问日志。
这样会造成存储空间的浪费,我们可以修改配置文件来实现不记录这些文件的访问日志。

修改配置文件

//将虚拟主机abc.com的配置改为下面的配置
# 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" combined
    //新增如下
    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
</VirtualHost>
  • 配置说明
SetEnvIf Request_URI ".*\.gif$" img  
    #将访问请求为 *.*\.gif& 这个格式的资源的时候,生成一个变量名 img
CustomLog "logs/123.com-access_log" combined env=!img  
    #表示当env不是img的时候才会记录日志。

重载apache配置文件

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

测试

/data/wwwroot/abc.com目录下创建一个文件test.jpg

# touch /data/wwwroot/abc.com/test.jpg

使用curl命令测试访问abc.com/test.jpg

# curl -x127.0.0.1:80 abc.com/test.jpg
# curl -x127.0.0.1:80 abc.com
www.test.com
# tail /usr/local/apache2.4/logs/123.com-access_log 
127.0.0.1 - - [07/Oct/2018:15:18:33 +0800] "GET HTTP://abc.com/ HTTP/1.1" 200 12 "-" "curl/7.29.0"

并没有记录访问abc.com/test.jpg的访问请求。

访问日志切割

果一个网站的访问量很大,那么日志记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件

修改配置文件

将虚拟主机abc.com的配置修改为如下的内容

# 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" combined
    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
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
  • 配置说明
/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%F.log 86400 
    ##这一部分就是日志切割的配置了
    ##管道符: ' | ' : 可以在httpd的配置文件中使用apache自带的一些工具

/usr/local/apache2.4/bin/rotatelogs  -l
    ##这个是apache自带的一个日志切割工具rotatelogs
    ## -l 选项是表示使用本地系统的时区来区分时间, 否则默认以美国的UTC时区来区分时间,会有时差

logs/123.com-access_%F.log
    ##这个指定日志的路径和日志文件名,
    ##%F是date命令的一个日期的格式,代表的是当天的年月日。例如:2018-06-29

86400,表示的是以多少秒来切割日志文件, 一般都是84600 等于一天

重载apache配置文件

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
#  /usr/local/apache2.4/bin/apachectl graceful

测试

# curl -x127.0.0.1:80 abc.com
www.test.com
# curl -x127.0.0.1:80 abc.com/index.php
www.test.com
//查看日志存放目录,其中 23.com-access_20181007.log就是刚才生成的日志文件了
# ll /usr/local/apache2.4/logs/
total 300
-rw-r--r-- 1 root root   2685 Oct  7 14:41 1111.com-access_log
-rw-r--r-- 1 root root    205 Oct  7 13:27 1111.com-error_log
-rw-r--r-- 1 root root    310 Oct  7 15:29 123.com-access_20181007.log
-rw-r--r-- 1 root root     99 Oct  7 15:18 123.com-access_log
-rw-r--r-- 1 root root  59779 Oct  7 15:29 abc.com-access_log
-rw-r--r-- 1 root root 120426 Oct  7 15:29 abc.com-error_log
-rw-r--r-- 1 root root  32693 Sep 11 22:51 access_log
-rw-r--r-- 1 root root  51672 Oct  7 15:27 error_log
-rw-r--r-- 1 root root      5 Oct  7 15:27 httpd.pid

在实际过程中,需要建立一个任务计划,把一段时间的文件进行拷贝或删除,以保证磁盘容量永远是足够的。

静态元素过期时间

浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了,我们可以设置静态文件在客户的电脑里缓存的有效时间,超过时间才会重新再向服务器请求新的资源

修改配置文件

在虚拟主机abc.com的配置中添加以下配置

<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" combined
    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
    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>
</VirtualHost>
  • 配置说明
<IfModule mod_expires.c>                          //需要用到expires模块
    ExpiresActive on                                //打开该功能的开关
    ExpiresByType image/gif  "access plus 1 days"   //gif格式的图片缓存时间为1天
    ExpiresByType image/jpeg "access plus 24 hours" //peg格式的图片缓存时间为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"  //其他文件不进行缓存
</IfModule>

开启expires_module 模块

# vim /usr/local/apache2.4/conf/httpd.conf

LoadModule expires_module modules/mod_expires.so //找到这一行,去掉前面的 ‘#’ 

# /usr/local/apache2.4/bin/apachectl -M | grep expires  //检查是否开启expires模块
 expires_module (shared)

重载配置文件

# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful

测试
首先随便下载一张图片,移动到/data/wwwroot/abc.com目录下

# curl -x127.0.0.1:80 abc.com/1.png -I
HTTP/1.1 200 OK
Date: Sun, 07 Oct 2018 07:46:12 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Last-Modified: Sun, 07 Oct 2018 03:34:23 GMT
ETag: "6465-5779b2e3dedc0"
Accept-Ranges: bytes
Content-Length: 25701
Cache-Control: max-age=86400
Expires: Mon, 08 Oct 2018 07:46:12 GMT
Content-Type: image/png
//多了cache-control参数等

#拓展

apache虚拟主机开启php的短标签 http://ask.apelearn.com/question/5370
apache日志记录代理IP以及真实客户端IP http://ask.apelearn.com/question/960
apache只记录指定URI的日志 http://ask.apelearn.com/question/981
apache日志记录客户端请求的域名 http://ask.apelearn.com/question/1037
apache 日志切割问题 http://ask.apelearn.com/question/566

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值