第十八课预习任务

目录

1.Apache默认虚拟主机

2.Apache用户认证

3.域名跳转

4.Apache访问日志

5.访问日志不记录静态文件

6.访问日志切割

7.静态元素过期时间


1.Apache默认虚拟主机

1.1访问web服务,本质上看(从协议上)是访问某个IP的主机上的某个端口(默认是80)。通常需要通过访问不同的域名或者端口实现对不同网站的访问(具体到服务器里就是不同目录),这个时候就需要设置虚拟主机(VirtualHost).通常分为这样3种:

  • 基于主机
  • 基于端口
  • 基于IP

1.2 首先我们要在配置文件中打开虚拟主机这个模块 httpd-vhost,非常重要

//这里去掉下面这个#号不然的话,虚拟配置文件不会生效
# Virtual hosts
Include conf/extra/httpd-vhosts.conf

1.3现在正式编辑虚拟主机的配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf

扫描二维码关注公众号,回复: 3108268 查看本文章
//每个VirtualHost *:80 代表一个主机,一个主机就是一个网站,虚拟主机配置文件可以定义多个VirtualHost。
在虚拟主机里有一个默认虚拟主机(第一段VirtualHost ),就是无论任何域名解析到这个IP上都会访问这个虚拟主机。当搜索所有配置段,你发现访问的域名没有在配置里面出现,那它就会默认走虚拟主机的配置。

//更改后的配置
[root@knightlai ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/test.com"  //这个为该虚拟主机站点的根目录,网站的程序就放在这个目录下面。
    ServerName test.com //网站的域名,不支持写多个
    ServerAlias www.test.com www.123.com//为网站的第二域名,只有alias可以写多个域名,用空格分隔。
    ErrorLog "logs/test.com-error_log" //站点的错误日志记录的目录
    CustomLog "logs/test.com-access_log" common //站点的访问日志的目录
</VirtualHost>

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

1.4 下面我们为网站设置数据目录文件夹,并且设置两个首页文件

//存放网站的目录
[root@knightlai ~]# mkdir -p /data/wwwroot/test.com
[root@knightlai ~]# mkdir -p /data/wwwroot/123.com
[root@knightlai ~]# vim /data/wwwroot/test.com/1.php
<?php
ehco test.com;
?>
[root@knightlai ~]# vim /data/wwwroot/123.com/1.php
<?php
ehco test.com;
?>

1.5 检查配置文件语法,并重新加载配置文件,用curl访问网站试一下

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

//用curl访问一下看到我们刚才写的php文件test就成功了
[root@knightlai wwwroot]# curl -x192.168.139.138:80 test.com/1.php
test.com

提示:这里刚开始的时候出现了一个403错误

//修改下面的配置文件才成功
[root@knightlai wwwroot]#vim /usr/local/apache2.4/conf/httpd.conf
#<Directory />
   # AllowOverride none
   # Require all denied
#</Directory>

一定是要注释的。 
注释之后,再修改下面的路径为自己要访问的目录下,就OK了。

DocumentRoot "/data/wwwroot"
<Directory "/data/wwwroot">
    Options Indexes FollowSymLinks
    AllowOverride none
    Require all granted
</Directory>

2.Apache用户认证

2.1有些网站为了增加安全性,在你打开网站时,要输入用户名和密码,这里的用户名和密码还不是你自己能注册的,得管理员给你权限。通常这样的做法不多,但是有这样一种可能,打开网站时不需要认证,但你打开某个特定的页面时,通常是只允许内部人员打开,就要用户认证。

2.2 下面我们给网站上面一个指定的页面增加用户认证,首先编辑配置文件

[root@knightlai wwwroot]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/test.com"
    ServerName test.com
   <Directory /data/wwwroot/test.com/1.phpp>   //指定认证的页面或者目录    
        AllowOverride AuthConfig             //这个相当于打开认证的开关
        AuthName "test.com user auth"       //自定义认证的名字,作用不大
        AuthType Basic                            //认证的类型,一般为Basic
        AuthUserFile /data/.htpasswd      //指定密码文件所在位置
        require valid-user                        //指定需要认证的用户为全部可用用户
    </Directory>
    ErrorLog "logs/test.com-error_log"
    CustomLog "logs/test.com-access_log" common
</VirtualHost>

2.3 指定访问相关的用户名和密码文件 htpasswd命令

htpasswd命令
选项说明:
passwdfile:包含用户名及其密码的用户密码文件。如果使用了"-c"选项,则会创建或覆盖文件。不使用"-n"选项时必须指定passwdfile参数。
username:为指定的用户名创建密码。如果该用户记录已存在,则更新。
-c:创建用户密码文件passwdfile,如果文件已经存在则会覆盖已存在的文件。不能和"-n"一起使用。
-n:在标准输出中输出结果,而不是将其写入到用户密码文件中。该选项会忽略用户密码文件passwdfile参数。不能和"-c"选项一起使用。
-m:使用MD5加密算法。默认。
-d:使用crypt()函数计算密码,不安全。
-s:使用SHA加密算法。安全。
-P:强制不加密密码,保持明文状态,不安全。
-B:强制bcrypt加密密码,非常安全。
-D:从用户密码文件中删除指定的用户及其密码。
-b:使用批处理模式,即非交互模式,可以直接待加密的传递明文密码。
password:指定要输入的明文密码。只能在批处理模式中使用,即和"-b"一起使用。
[root@knightlai wwwroot]# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd test
New password: 
Re-type new password: 
Adding password for user test

2.4 检查配置文件语法,重新加载配置文件,测试网站页面

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

如果出现下面这个提示框说明配置成功,输入我们刚刚设置好的用户名密码就可以登入我们的页面了!

3.域名跳转

3.1域名跳转类似于将网页重新指向另一个网站,但区别是域名跳转会将域名本身重新指向网站,而不使用HTML或脚本来进行重新指向。如果网站有多个域名,而又不希望分散权重,则可以通过开启Rewrite设置,将多个域名都301跳转到主域名之下。

3.2 这里我们把www.test.com 跳转到test.com首先还是编辑我们的配置文件

[root@knightlai wwwroot]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
ServerAlias www.test.com
    <IfModule mod_rewrite.c>          //需要mod_rewrite模块支持
    RewriteEngine on                   //打开rewrite功能
   RewriteCond %{HTTP_HOST} !^test.com$     //定义rewrite的条件
   RewriteRule ^/(.*)$ http://test.com/$1 [R=301,L]     
//定义rewrite规则:当满足上面条件时才执行当前规则,即跳转到test.com。
  301表示永久跳转;302表示临时跳转。
   </IfModule>

3.3 还是跟前面的一样检查配置文件语法,加载配置文件,测试配置是否成功

//编辑配置文件,将下面这个模块的#号去掉才能支持跳转
[root@knightlai wwwroot]# vim /usr/local/apache2.4/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
//检查语法,重新加载配置文件
[root@knightlai wwwroot]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@knightlai wwwroot]# /usr/local/apache2.4/bin/apachectl graceful

//这里出现301代码说明配置成功
[root@knightlai wwwroot]# curl -x192.168.139.138:80 www.test.com -I
HTTP/1.1 301 Moved Permanently
Date: Thu, 30 Aug 2018 16:14:34 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Location: http://test.com/
Content-Type: text/html; charset=iso-8859-1

4.Apache访问日志

4.1 Apache日志文件为系统管理员提供了有用的信息,比如,为 Web 服务器排障,保护系统不受各种各样的恶意活动侵犯,或者只是进行各种各样的分析以监控 HTTP 服务器。根据你 Web 服务器配置的不同,其错误/访问日志可能放在你系统中不同位置。

4.2 查看apache日志文件

[root@knightlai wwwroot]# ls /usr/local/apache2.4/logs/
123.com-access_log  123.com-error_log  access_log  error_log  httpd.pid  test.com-access_log  test.com-error_log

[root@knightlai wwwroot]# cat /usr/local/apache2.4/logs/test.com-access_log
127.0.0.1 - - [30/Aug/2018:11:01:12 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.138 - - [30/Aug/2018:11:02:01 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.138 - - [30/Aug/2018:11:03:43 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.138 - - [30/Aug/2018:11:03:53 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.138 - - [30/Aug/2018:11:05:02 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.138 - - [30/Aug/2018:11:06:30 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.138 - - [30/Aug/2018:11:09:04 -0400] "GET HTTP://test.com/ HTTP/1.1" 403 209
192.168.139.112 - - [30/Aug/2018:11:09:24 -0400] "GET /favicon.ico HTTP/1.1" 404 209
192.168.139.112 - - [30/Aug/2018:11:09:31 -0400] "GET / HTTP/1.1" 403 209
192.168.139.112 - - [30/Aug/2018:11:09:31 -0400] "GET / HTTP/1.1" 403 209

4.3 查看apache日志格式文件,并修改它

//这样的一行就是log格式文件common就是我们现在使用的格式
<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
//修改默认的日志格式格式
[root@knightlai wwwroot]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
 CustomLog "logs/test.com-access_log" common修改为combined

4.4测试更改后的日志文件

[root@knightlai wwwroot]# cat /usr/local/apache2.4/logs/test.com-access_log
192.168.139.138 - - [30/Aug/2018:12:17:37 -0400] "HEAD HTTP://www.acd.com/ HTTP/1.1" 301 -
192.168.139.138 - - [30/Aug/2018:12:17:55 -0400] "HEAD HTTP://www.123.com/ HTTP/1.1" 301 -
192.168.139.112 - - [30/Aug/2018:12:34:11 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:13 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:13 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:13 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:14 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:16 -0400] "GET /favicon.ico HTTP/1.1" 301 235
[root@knightlai wwwroot]# data

5.访问日志不记录静态文件

5.1如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有js、css等静态对象。而这些文件的访问往往是很大的,而且即使记录这些日志也没有什么用,下面我们来讲一下怎么不记录这些文件。

5.2首先还是编辑配置文件定义不要记录日志的文件类型

[root@knightlai wwwroot]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/test.com"
    ServerName test.com
   ServerAlias www.test.com www.123.com
  //以下为定义变量:将所有关于图片,css,js的请求定义为变量img
    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
    # "env=!img"表示非img变量。意思是:不记录关于变量img的请求日志。
    CustomLog "logs/123test-access_log" combined env=!img
    ErrorLog "logs/test.com-error_log"
    CustomLog "logs/test.com-access_log" combined
</VirtualHost>

5.3 下面我们就来测试一下配置是否成功,我们先在网站目录下面创建一个图片文件夹并上传一个图片文件,然后我们再访问一下它看是否记录到日志文件里面。

[root@knightlai wwwroot]# mkdir /data/wwwroot/test.com/images/
[root@knightlai images]# rz
[root@knightlai images]# ls
1.jpg
[root@knightlai images]# curl -x192.168.139.138:80 www.test.com/images/1.jpg  -I
HTTP/1.1 200 OK
Date: Thu, 30 Aug 2018 16:55:31 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Last-Modified: Tue, 14 Jul 2009 05:32:31 GMT
ETag: "bea1f-46ea3c3d3b9c0"
Accept-Ranges: bytes
Content-Length: 780831
Content-Type: image/jpeg
//这里我们并没有看到相关的日志文件
[root@knightlai images]# tail /usr/local/apache2.4/logs/test.com-access_log 
192.168.139.112 - - [30/Aug/2018:12:34:13 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:14 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:16 -0400] "GET /favicon.ico HTTP/1.1" 301 235
192.168.139.112 - - [30/Aug/2018:12:35:03 -0400] "-" 408 -
192.168.139.112 - - [30/Aug/2018:12:35:03 -0400] "-" 408 -

//如果我们把配置文件改过来再查看一下日志,这里面就记录了jpg文件下载
[root@knightlai images]# tail /usr/local/apache2.4/logs/test.com-access_log 
192.168.139.112 - - [30/Aug/2018:12:34:14 -0400] "GET /1.php HTTP/1.1" 301 229
192.168.139.112 - - [30/Aug/2018:12:34:16 -0400] "GET /favicon.ico HTTP/1.1" 301 235
192.168.139.112 - - [30/Aug/2018:12:35:03 -0400] "-" 408 -
192.168.139.112 - - [30/Aug/2018:12:35:03 -0400] "-" 408 -
192.168.139.112 - - [30/Aug/2018:12:36:00 -0400] "GET /favicon.ico HTTP/1.1" 301 235
192.168.139.138 - - [30/Aug/2018:12:39:39 -0400] "HEAD HTTP://www.123.com/ HTTP/1.1" 301 -
192.168.139.138 - - [30/Aug/2018:12:40:26 -0400] "HEAD HTTP://www.123.com/ HTTP/1.1" 200 - "-" "curl/7.29.0"
192.168.139.138 - - [30/Aug/2018:12:55:23 -0400] "HEAD HTTP://www.test.com/images/1jpg HTTP/1.1" 404 - "-" "curl/7.29.0"
192.168.139.138 - - [30/Aug/2018:12:55:31 -0400] "HEAD HTTP://www.test.com/images/1.jpg HTTP/1.1" 200 - "-" "curl/7.29.0"
192.168.139.138 - - [30/Aug/2018:12:58:18 -0400] "HEAD HTTP://www.test.com/images/1.jpg HTTP/1.1" 200 - "-" "curl/7.29.0"

6.访问日志切割

6.1 为了避免长时间访问后生成大量的日志而导致磁盘空间不足。打开虚拟主机配置文件,修改以下内容将以每天生成的访问日志分隔成多个文件。

6.2 首先修改配置文件

[root@knightlai images]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
 CustomLog "|/usr/local/apache2/bin/rotatelogs -l logs/test-access_log_%Y%m%d_log 86400" combined env=!img
# /usr/local/apache2.4/bin/rotatelogs工具是apache自带的分割日志的工具
# -l参数按当前系统时间为基准进行切割(我国为CST),否则默认UTC
# %Y%m%d表示年月日,这样会每天记录一个带日期的日志文件,更方便
# 86400(s)表示每天都进行切割,一天24小时等于86400秒

6.3 检查配置文件语法,重新加载配置文件,并测试配置文件是否成功

[root@knightlai images]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@knightlai images]# /usr/local/apache2.4/bin/apachectl graceful
//有一个以时间命令的日志文件
[root@knightlai conf]# ls /usr/local/apache2.4/logs
123.com-access_log  123.com-error_log  123test-access_log  access_log  error_log  httpd.pid  test-access_log_20180909_log

6.4 定期删除老日志

 这里创建一个任务计划,第个月的28号删除大于30天的日志删掉。

[root@knightlai logs]# crontab -e
[root@knightlai logs]# 0 2 28 * * find /usr/local/apache2.4/logs/ -name "*_log" -mtime +30 -type f -exec /usr/bin/rm {}; 

7.静态元素过期时间

7.1浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了。如果网站图片更新了呢,那么应该访问新图片才是。所以这就涉及到静态文件缓存时长的问题了,也就是“缓存过期时间”。

7.2 首先我们要把相关的模块前面的#号去掉

[root@knightlai conf]# vim /usr/local/apache2.4/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so

7.3修改相关配置文件

[root@knightlai conf]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<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"

#    // 按文件类型来设置自定义过期时间
#    // acess表示从访问时间开始
#    // now表示按当前时间开始
#    // plus在前面的时间基础上加上
#    // 1 hours/days 表示文件的生命周期
#    // 例如 acess plus 1 days 表示该文件从访问的时间开始1天内有效,无需重新获取

    ExpiresDefault "now plus 0 min"    
#   //除上述外的文件指定默认的过期时间

提示:我在虚拟机里面遇到此问题,试了很多方法都没法启动,后来发现,问题出在/etc/httpd/conf/目录里面有一个叫httpd.conf的文件。在同一目录下还有另外一个叫httpd.conf.bak,只要把httpd.conf.bak的内容复制httpd.conf文件中,覆盖原来的内容就能启动了,到shell里运行service httpd start,惊喜发现,start httpd ok。启动httpd 确定

猜你喜欢

转载自blog.csdn.net/a1779078902/article/details/82555630