默认虚拟主机 Apache 用户认证 域名跳转 Apache 访问日志 使 Apache 访问日志不记录静态文件 访问日志切割 静态元素过期时间
~在同一台 Apache 服务器上,配置两个站点(虚拟主机),分别对应不同的主机名。当客户程序向 Apache 服务器发出请求时,客户想要访问的主机名也通过请求头中的“Host:”语句传递给 Apache 服务器。Apache 服务器程序接收到这个请求后,可以通过检查“Host:”语句,来判定客户程序请求是哪个虚拟主机的服务,然后再进一步的处理。
~对于未在 Apache 服务器中定义的主机名,如果转到该 Apache 服务器,则将访问默认虚拟主机
一旦虚拟主机生效,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 # 将该行的注释去掉
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 2324 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 30 31 32# 定义第二台虚拟主机的相关信息,配置项与第一台相同 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 [root@VMware01 ~]# apachectl -t #检测配置与法 Syntax OK [root@VMware01 ~]# apachectl graceful #刷新配置
编辑 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进行绑定
[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
## 通过主机名 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
使用 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 这台虚拟主机为默认虚拟主机
不是登录邮箱、登录论坛的那种认证,而是在请求到特定资源时,由浏览器弹出对话框,要求进行认证后才能访问。
该功能并不常用,一般用在对站点中部分需要重点保护的目录及文件的访问限制上
2324 DocumentRoot "/usr/local/apache2.4/htdocs/upload/" 25 ServerName www.111.com 26 ServerAlias 111.com 27 ## 添加如下代码块 28 [root@VMware01 ~]# apachectl -t Syntax OK [root@VMware01 ~]# apachectl graceful# 指定需要认证的访问目录 29 AllowOverride AuthConfig # 认证的开关 30 AuthName "Default vServer Auth" # 认证弹出窗口中显示的认证名 31 AuthType Basic # 认证类型 32 AuthUserFile /data/.htpasswd # 认证所需的 账号/密码 文件 33 require valid-user # 仅允许存在于 账号/密码文件中的账号登录 34 35 36 37 ErrorLog "logs/111.com-error_log" 38 CustomLog "logs/111.com-access_log" common 39
## -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.
## 不指定账号密码进行访问 [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
域名更换时,一是由于客户可能更多的使用老域名,所以需要在一段较长的时间内保持新老域名的共存,作为新老域名的过渡时期;二是考虑到搜索引擎的 SEO 排名,如果两个不同域名但是相同内容的站点,搜索引擎由于经常与老域名打交道,其可能会将新域名识别为仿冒站点而不做理会,导致新域名在搜索引擎中的排名迟迟无法提高
使用 curl 验证
使用浏览器验证
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 日期 动作 状态码 文件大小
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:使用的浏览器类型
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf . . .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 [root@VMware01 ~]# apachectl -t Syntax OK [root@VMware01 ~]# apachectl graceful
[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.cssetm" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
一个页面中往往包含大量的静态文件,如果每个静态文件都产生一条日志,日志量将相当庞大,不仅费磁盘,还会占用大量磁盘 I/O
[root@VMware01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 2324 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
[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"
日志是以追加的方式不断地增加的,因此日志文件会不断增大,最终会占满磁盘。日志切割可以以某一段时间为周期,按周期地不断产生新的日志文件,这样能够更方便地找到某一日期的日志,且日志文件按周期产生,能够方便删除无用的日志
[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
[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
浏览器浏览网页时,会缓存网站的静态文件,那缓存下来的文件能保留多久,在 Apache 上可以定义
由于之前请求过 bd.png 文件,这时刷新页面,能够看到该文件的状态码为 304