频道栏目
首页 > 资讯 > 虚拟机 > 正文

默认虚拟主机 Apache 的操作和使用学习

18-07-02        来源:[db:作者]  
收藏   我要投稿

目录

默认虚拟主机 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 
 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 
 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   #刷新配置

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 
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 
 24     DocumentRoot "/usr/local/apache2.4/htdocs/upload/"
 25     ServerName www.111.com
 26     ServerAlias 111.com

 27 ## 添加如下代码块    
 28          # 指定需要认证的访问目录
 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 


[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
3.3 验证

使用 curl 验证

使用浏览器验证


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 
.
.
.

    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
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.cssetm" "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 
 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 
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 文件
7.2 验证效果
相关TAG标签
上一篇:用JDBC进行简单的MySql数据库数据查询操作
下一篇:centos7下备份postgresql数据库为.bak文件的操作教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站