目录
- 默认虚拟主机
- Apache 用户认证
- 域名跳转
- Apache 访问日志
- 使 Apache 访问日志不记录静态文件
- 访问日志切割
- 静态元素过期时间
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 结论
- 只要配置了 vhosts,则 httpd.conf 中的 ServerName 就将失效;
- 一条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
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 # 去掉该行的注释