第十八课 LAMP

目录

  1. 默认虚拟主机
  2. Apache 用户认证
  3. 域名跳转
  4. Apache 访问日志
  5. 使 Apache 访问日志不记录静态文件
  6. 访问日志切割
  7. 静态元素过期时间

1. 默认虚拟主机

~在同一台 Apache 服务器上,配置两个站点(虚拟主机),分别对应不同的主机名。当客户程序向 Apache 服务器发出请求时,客户想要访问的主机名也通过请求头中的“Host:”语句传递给 Apache 服务器。Apache 服务器程序接收到这个请求后,可以通过检查“Host:”语句,来判定客户程序请求是哪个虚拟主机的服务,然后再进一步的处理。
~对于未在 Apache 服务器中定义的主机名,如果转到该 Apache 服务器,则将访问默认虚拟主机

1.1 修改 httpd.conf , 开启虚拟主机的配置

一旦虚拟主机生效,httpd.conf 中的 ServerName、DirectoryRoot 等配置就失效了

## 在 httpd.conf 文件中搜索关键字:vhosts
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/httpd.conf
    .
    .
    .
475 # Virtual hosts
476 Include conf/extra/httpd-vhosts.conf   # 将该行的注释去掉

1.2 修改 httpd-vhosts.conf , 配置虚拟主机

[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
 23 <VirtualHost *:80>
 24     DocumentRoot "/usr/local/apache2.4/htdocs/upload/"  # 定义默认虚拟主机的根目录
 25     ServerName www.111.com   # 定义默认虚拟主机的主机名
 26     ServerAlias 111.com    # 定义默认虚拟主机的别名
 27     ErrorLog "logs/111.com-error_log"   # 定义错误日志路径及命名
 28     CustomLog "logs/111.com-access_log" common  # 定义访问日志路径及命名以及日志类型
 29 </VirtualHost>
 30 
 31 
 32 <VirtualHost *:80>   # 定义第二台虚拟主机的相关信息,配置项与第一台相同
 33     DocumentRoot "/usr/local/apache2.4/htdocs/test/"
 34     ServerName www.kkk.com
 35     ServerAlias kkk.com
 36     ErrorLog "logs/kkk.com-error_log"
 37     CustomLog "logs/kkk.com-access_log" common
 38 </VirtualHost>



[root@VMware01 ~]# apachectl -t    #检测配置与法
Syntax OK
[root@VMware01 ~]# apachectl graceful   #刷新配置

1.3 验证

1.3.1 修改 windows hosts 文件(hosts 文件是最古老的域名解析方式,采取本地解析,且优先级高于DNS服务)

编辑 windows中的C:\Windows\System32\drivers\etc,增加一行如下:

192.168.1.3 www.111.com www.kkk.com 111.com kkk.com www.abc.com   # 将虚拟主机的主机名与IP对应上

ps.完成hosts文件的正确编辑后,即可在本地将域名与IP进行绑定

1.3.2 在两台虚拟主机的 DocumentRoot 目录中放入不同的静态文件
[root@VMware01 ~]# ls /usr/local/apache2.4/htdocs/upload/  # 默认虚拟主机的目录下本就有 Discuz 的内容
admin.php  archiver     cp.php           favicon.ico  home.php   member.php  portal.php  source    uc_client
api        config       crossdomain.xml  forum.php    index.php  misc.php    robots.txt  static    uc_server
api.php    connect.php  data             group.php    install    plugin.php  search.php  template  userapp.php
[root@VMware01 ~]# vim /usr/local/apache2.4/htdocs/test/index.php # 第二台虚拟主机的目录下有一个PHP的信息文件

  1 <?php
  2 phpinfo();
  3 ?>
1.3.3 使用 curl 验证
## 通过主机名 www.111.com 能够准确找到其根目录下的 forum.php 文件
[root@VMware01 ~]# curl -x 192.168.1.3:80 www.111.com/forum.php -I 
HTTP/1.1 200 OK
Date: Fri, 29 Jun 2018 02:49:26 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Set-Cookie: HkhI_2132_saltkey=rrb4Tt1R; expires=Sun, 29-Jul-2018 02:49:26 GMT; Max-Age=2592000; path=/; httponly
Set-Cookie: HkhI_2132_lastvisit=1530236966; expires=Sun, 29-Jul-2018 02:49:26 GMT; Max-Age=2592000; path=/
Set-Cookie: HkhI_2132_sid=euwwYO; expires=Sat, 30-Jun-2018 02:49:26 GMT; Max-Age=86400; path=/
Set-Cookie: HkhI_2132_lastact=1530240566%09forum.php%09; expires=Sat, 30-Jun-2018 02:49:26 GMT; Max-Age=86400; path=/
Set-Cookie: HkhI_2132_onlineusernum=2; expires=Fri, 29-Jun-2018 02:54:26 GMT; Max-Age=300; path=/
Set-Cookie: HkhI_2132_sid=euwwYO; expires=Sat, 30-Jun-2018 02:49:26 GMT; Max-Age=86400; path=/
Content-Type: text/html; charset=utf-8

## 通过主机名 www.kkk.com 就找不到 forum.php,因为这个文件是在默认虚拟主机上的,而不是在 www.kkk.com 这台虚拟主机上的
[root@VMware01 ~]# curl -x 192.168.1.3:80 www.kkk.com/forum.php -I
HTTP/1.1 404 Not Found
Date: Fri, 29 Jun 2018 02:49:41 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1

## 但是能够在 www.kkk.com 这台虚拟主机上找到 index.php 
[root@VMware01 ~]# curl -x 192.168.1.3:80 www.kkk.com/index.php -I
HTTP/1.1 200 OK
Date: Fri, 29 Jun 2018 02:51:51 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8


## 我们再使用其他没有定义的主机名进行访问,也能访问到默认虚拟主机下的资源
[root@VMware01 ~]# curl -x 192.168.1.3:80 www.abc.com/forum.php -I
HTTP/1.1 200 OK
Date: Fri, 29 Jun 2018 02:52:55 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Set-Cookie: HkhI_2132_saltkey=AQ1QNzND; expires=Sun, 29-Jul-2018 02:52:56 GMT; Max-Age=2592000; path=/; httponly
Set-Cookie: HkhI_2132_lastvisit=1530237176; expires=Sun, 29-Jul-2018 02:52:56 GMT; Max-Age=2592000; path=/
Set-Cookie: HkhI_2132_sid=Wo9Ss3; expires=Sat, 30-Jun-2018 02:52:56 GMT; Max-Age=86400; path=/
Set-Cookie: HkhI_2132_lastact=1530240776%09forum.php%09; expires=Sat, 30-Jun-2018 02:52:56 GMT; Max-Age=86400; path=/
Set-Cookie: HkhI_2132_onlineusernum=2; expires=Fri, 29-Jun-2018 02:57:56 GMT; Max-Age=300; path=/
Set-Cookie: HkhI_2132_sid=Wo9Ss3; expires=Sat, 30-Jun-2018 02:52:56 GMT; Max-Age=86400; path=/
Content-Type: text/html; charset=utf-8

1.3.4 使用浏览器验证
  • 使用 www.111.com 主机名,能够找到其下的 forum.php 文件,浏览器反馈状态码200
    这里写图片描述

  • 使用 www.kkk.com 主机名,就无法找到 forum.php 文件,因为在该虚拟主机的根目录下没有该文件

  • 但使用 www.kkk.com 主机名,能够找到该虚拟主机根目录下的 index.php

  • 再使用一个未定义的主机名 www.abc.com ,也能找到 www.111.com 根目录下的 forum.php,因为 www.111.com 这台虚拟主机为默认虚拟主机
    这里写图片描述

1.4 结论

  1. 只要配置了 vhosts,则 httpd.conf 中的 ServerName 就将失效;
  2. 一条HTTP请求到达主机后,如果 httpd-vhosts.conf 文件中找不到对应的 ServerName,则访问默认虚拟主机

2. Apache 用户认证

不是登录邮箱、登录论坛的那种认证,而是在请求到特定资源时,由浏览器弹出对话框,要求进行认证后才能访问。
该功能并不常用,一般用在对站点中部分需要重点保护的目录及文件的访问限制上

2.1 修改 httpd-vhosts.conf
  • 针对目录的用户认证
 23 <VirtualHost *:80>
 24     DocumentRoot "/usr/local/apache2.4/htdocs/upload/"
 25     ServerName www.111.com
 26     ServerAlias 111.com

 27 ## 添加如下代码块    
 28     <Directory /usr/local/apache2.4/htdocs/upload>     # 指定需要认证的访问目录
 29         AllowOverride AuthConfig                       # 认证的开关
 30         AuthName "Default vServer Auth"                # 认证弹出窗口中显示的认证名
 31         AuthType Basic                                 # 认证类型
 32         AuthUserFile /data/.htpasswd                   # 认证所需的 账号/密码 文件
 33         require valid-user                             # 仅允许存在于 账号/密码文件中的账号登录
 34     </Directory>
 35     
 36     
 37     ErrorLog "logs/111.com-error_log"
 38     CustomLog "logs/111.com-access_log" common
 39 </VirtualHost>


[root@VMware01 ~]# apachectl -t
Syntax OK
[root@VMware01 ~]# apachectl graceful
2.2 产生账号/密码文件:htpasswd
## -c 选项代表新建账/密文件,-m 选项指定加密算法为 MD5,后接账/密文件名以及带创建的账户
[root@VMware01 ~]# htpasswd -c -m /data/.htpasswd chocolee
New password: 
Re-type new password: 
Adding password for user chocolee


[root@VMware01 ~]# cat /data/.htpasswd 
chocolee:$apr1$XwjtRMu0$PfnkYzOeG2LihTBZAoihF.
2.3 验证
2.3.1 使用 curl 验证
## 不指定账号密码进行访问
[root@VMware01 ~]# curl -x 192.168.1.3:80 www.111.com/forum.php -I
HTTP/1.1 401 Unauthorized            # 此时HTTP状态码为401 未授权
Date: Fri, 29 Jun 2018 03:38:19 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="Default vServer Auth"
Content-Type: text/html; charset=iso-8859-1


## 指定账号密码
[root@VMware01 ~]# curl -x 192.168.1.3:80 -u chocolee:123123 www.111.com/forum.php -I
HTTP/1.1 200 OK                   # 指定账号密码后,HTTP状态码为200,成功
Date: Fri, 29 Jun 2018 03:40:08 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Set-Cookie: HkhI_2132_saltkey=H55lznw9; expires=Sun, 29-Jul-2018 03:40:08 GMT; Max-Age=2592000; path=/; httponly
Set-Cookie: HkhI_2132_lastvisit=1530240008; expires=Sun, 29-Jul-2018 03:40:08 GMT; Max-Age=2592000; path=/
Set-Cookie: HkhI_2132_sid=Cm3Uqx; expires=Sat, 30-Jun-2018 03:40:08 GMT; Max-Age=86400; path=/
Set-Cookie: HkhI_2132_lastact=1530243608%09forum.php%09; expires=Sat, 30-Jun-2018 03:40:08 GMT; Max-Age=86400; path=/
Set-Cookie: HkhI_2132_onlineusernum=5; expires=Fri, 29-Jun-2018 03:45:08 GMT; Max-Age=300; path=/
Set-Cookie: HkhI_2132_sid=Cm3Uqx; expires=Sat, 30-Jun-2018 03:40:08 GMT; Max-Age=86400; path=/
Content-Type: text/html; charset=utf-8
2.3.2 使用浏览器验证


3. 域名跳转

域名更换时,一是由于客户可能更多的使用老域名,所以需要在一段较长的时间内保持新老域名的共存,作为新老域名的过渡时期;二是考虑到搜索引擎的 SEO 排名,如果两个不同域名但是相同内容的站点,搜索引擎由于经常与老域名打交道,其可能会将新域名识别为仿冒站点而不做理会,导致新域名在搜索引擎中的排名迟迟无法提高

3.1 301与302的区别
  • 301:永久重定向,搜索引擎将原域名的权重降低,加到新的域名上
  • 302:临时重定向,两边的权重的不会因此改变
  • *
3.2 配置 httpd-vhost.conf
## 在默认虚拟主机的配置块内,增加如下配置
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{HTTP_HOST} !^www.111.com$
 RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301.L]
</IfModule>
3.3 httpd.conf 中开启 rewrite 模块
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
3.3 验证
[root@VMware01 ~]# curl -x 192.168.1.3:80 abc.com -I
HTTP/1.1 301 Moved Permanently
Date: Fri, 29 Jun 2018 07:21:07 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Location: http://www.111.com/
Cache-Control: max-age=0
Expires: Fri, 29 Jun 2018 07:21:07 GMT
Content-Type: text/html; charset=iso-8859-1

4. Apache 访问日志

Apache 访问日志记录了用户的每个请求,其中的相应字段自己可以进行调整

4.1 Apache 访问日志字段介绍
[root@VMware01 ~]# tail /usr/local/apache2.4/logs/111.com-access_log 
192.168.1.1 - - [29/Jun/2018:12:08:12 +0800] "GET /upload/static/image/common/pt_item.png HTTP/1.1" 404 236
## 访问原IP      日期                        动作                                                  状态码 文件大小
4.2 编辑 httpd.conf 文件,定义自己想要的日志格式
282     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
283     LogFormat "%h %l %u %t \"%r\" %>s %b" common    # 默认用 common 格式
  • %h:host,用户主机的IP
  • %l
  • %u:user,用户名
  • %t:time,时间
  • %r:request,请求
  • %s:state,HTTP状态码
  • %b:bytes,文件大小
  • %{Referer}i:从哪里跳转过来
  • %{User-Agent}i:使用的浏览器类型
4.3 编辑 httpd-vhost.conf 文件,指定采用某种日志类型
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
.
.
.
<VirtualHost *:80>
    DocumentRoot "/usr/local/apache2.4/htdocs/upload/"
    ServerName www.111.com
    ServerAlias 111.com
    ErrorLog "logs/111.com-error_log"
    CustomLog "logs/111.com-access_log" combined    # 修改默认虚拟主机的访问日志格式为 combined
</VirtualHost>


[root@VMware01 ~]# apachectl -t
Syntax OK
[root@VMware01 ~]# apachectl graceful
4.4 查看 combined 格式的访问日志
[root@VMware01 ~]# tail /usr/local/apache2.4/logs/111.com-access_log 
192.168.1.1 - - [29/Jun/2018:13:49:18 +0800] "GET /upload/static/image/common/px.png HTTP/1.1" 404 231 "http://www.111.com/data/cache/style_1_common.css?etm" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"

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

一个页面中往往包含大量的静态文件,如果每个静态文件都产生一条日志,日志量将相当庞大,不仅费磁盘,还会占用大量磁盘 I/O

每个文件都会产生一条access日志

5.1 编辑 httpd-vhost.conf 文件
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
 23 <VirtualHost *:80>
 24     DocumentRoot "/usr/local/apache2.4/htdocs/upload/"
 25     ServerName www.111.com
 26     ServerAlias 111.com
 27     ## 插入如下代码块,将请求文件包含gif、jpg、js、css等文件的请求定义为 img 类型
 28     SetEnvIf Request_URL ".*\.gif$" img
 29     SetEnvIf Request_URL ".*\.jpg$" img
 30     SetEnvIf Request_URL ".*\.png$" img
 31     SetEnvIf Request_URL ".*\.jpeg$" img
 32     SetEnvIf Request_URL ".*\.bmp$" img
 33     SetEnvIf Request_URL ".*\.swf$" img
 34     SetEnvIf Request_URL ".*\.css$" img
 35     SetEnvIf Request_URL ".*\.js$" img
 36     
 37     ErrorLog "logs/111.com-error_log"
 38     CustomLog "logs/111.com-access_log" combined env=!img  # 访问日志设定的最后加上不产生与 img 类型的日志
 39 </VirtualHost>
5.2 验证
  • 首先放一张图片到网站根目录,在配置未生效的情况下进行访问
[root@VMware01 logs]# tail 111.com-access_log 
192.168.1.1 - - [29/Jun/2018:14:24:18 +0800] "GET /baidu.png HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
  • 在配置生效后进行访问
[root@VMware01 ~]# apachectl -t
Syntax OK
[root@VMware01 ~]# apachectl graceful

## 并未显示 bd.png 相关的日志
[root@VMware01 logs]# tail 111.com-access_log 
192.168.1.1 - - [29/Jun/2018:14:24:18 +0800] "GET /baidu.png HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"

6. 访问日志切割

日志是以追加的方式不断地增加的,因此日志文件会不断增大,最终会占满磁盘。日志切割可以以某一段时间为周期,按周期地不断产生新的日志文件,这样能够更方便地找到某一日期的日志,且日志文件按周期产生,能够方便删除无用的日志

6.1 编辑 httpd-vhost.conf 文件
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 
## 其实就是用 apache 自带的 rotatelogs 工具,指定周期进行日志文件的生成
  CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img 
6.2 验证
[root@VMware01 ~]# ll /usr/local/apache2.4/logs/
总用量 108
-rw-r--r--. 1 root root   194 6月  29 14:45 111.com-access_20180629.log # 新产生的日志文件
-rw-r--r--. 1 root root     0 6月  29 08:38 111.com-error_log
-rw-r--r--. 1 root root 55763 6月  28 14:45 access_log
-rw-r--r--. 1 root root 30754 6月  29 14:45 error_log
-rw-r--r--. 1 root root     5 6月  29 14:45 httpd.pid
-rw-r--r--. 1 root root  1570 6月  29 12:06 kkk.com-access_log
-rw-r--r--. 1 root root  5931 6月  29 12:06 kkk.com-error_log

7. 静态元素过期时间

浏览器浏览网页时,会缓存网站的静态文件,那缓存下来的文件能保留多久,在 Apache 上可以定义

7.1 缓存文件演示

由于之前请求过 bd.png 文件,这时刷新页面,能够看到该文件的状态码为 304

7.2 修改 httpd-vhosts.com 文件
 <VirtualHost *:80>
 24     DocumentRoot "/usr/local/apache2.4/htdocs/upload/"
 25     ServerName www.111.com
 26     ServerAlias 111.com
 27 
 28     SetEnvIf Request_URL ".*\.gif$" img
 29     SetEnvIf Request_URL ".*\.jpg$" img
 30     SetEnvIf Request_URL ".*\.png$" img
 31     SetEnvIf Request_URL ".*\.jpeg$" img
 32     SetEnvIf Request_URL ".*\.bmp$" img
 33     SetEnvIf Request_URL ".*\.swf$" img
 34     SetEnvIf Request_URL ".*\.css$" img
 35     SetEnvIf Request_URL ".*\.js$" img
 36 ## 添加如下代码块
 37     <IfModule mod_expoires.c>
 38       ExpiresActive on
 39       ExpiresByType image/gif "access plus 1 day"
 40       ExpiresByType image/jpeg "access plus 24 hours"
 41       ExpiresByType image/png "access plus 24 hours"
 42       ExpiresByType image/css "now plus 2 hours"
 43       ExpiresByType application/x-javascript "now plus 2 hours"
 44       ExpiresByType application/javascript "now plus 2 hours"
 45       ExpiresByType application/x-shockwave-flash "now plus 2 hours"
 46       ExpiresDefault "now plus 0 min"
 47     </IfModule>
 48     
 49     ErrorLog "logs/111.com-error_log"
 50     CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
 51 </VirtualHost>
 52 
7.3 修改 httpd.conf 文件,开启 expire 模块
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/httpd.conf
109 LoadModule expires_module modules/mod_expires.so  # 去掉该行的注释
7.4 验证效果

猜你喜欢

转载自blog.csdn.net/chocolee911/article/details/80851254