Apache httpd.conf配置文件 3(虚拟主机)

### Section 3: Virtual Hosts 第三部分 虚拟主机html


注意:在使用虚拟主机前,请先检查  http.conf 的 辅助配置文件httpd-vhosts.conf 是否注释
linux

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf程序员

此命令是否被注释,若被注释,请先去除 Include前的 #,使虚拟主机配置生效。web

而后打开Apache目录下 /conf/extra/httpd-vhosts.conf  此文件  开始配置apache



# VirtualHost: If you want to maintain multiple domains/hostnames on your 虚拟主机:若是你想维持多个域名和主机在你的机器上,你可服务器

# machine you can setup VirtualHost containers for them. Most configurations 设置虚拟主机。大多数配置信息只使用基于名字的虚拟主机网络

# use only name-based virtual hosts so the server doesn't need to worry about 所以服务器 没必要担忧IP地址的问题dom

# IP addresses. This is indicated by the asterisks in the directives below. 下面的命令以*号代替虚拟主机名ide

#学习

# Please see the documentation at 请参看文档 地址……

# <URL:http://httpd.apache.org/docs/2.2/vhosts/>

# for further details before you try to setup virtual hosts. 在你设置虚拟主机前请了解详细状况

#

# You may use the command line option '-S' to verify your virtual host 你能够用命令行选项 -S 来核实你虚拟主机的配置

# configuration.

#

# Use name-based virtual hosting. 使用基于名字的虚拟主机

#

#NameVirtualHost *:80
若是您要配置基于域名的虚拟主机,若是是基于ip地址的能够将本行注释。
NameVirtualHost
指令就是您必须的指令之一。尽管addr参数可使用主机名,但建议您仍是使用IP地址。好比:
NameVirtualHost 111.22.33.44
请注意,<VirtualHost>指令的参数必须与NameVirtualHost指令的参数彻底匹配。
NameVirtualHost 1.2.3.4
<VirtualHost 1.2.3.4>

#

# NOTE: NameVirtualHost cannot be used without a port specifier 注意:命名虚拟主机没有指定端口不能使用

# (e.g. :80) if mod_ssl is being used, due to the nature of the 例如(xxx:80) 若是使用ssl模块,是由于SSL协议的性质

# SSL protocol.

#

#

# VirtualHost example: 虚拟主机 例子

# Almost any Apache directive may go into a VirtualHost container. 几乎任何apache指令均可以加入 虚拟主机容器

# The first VirtualHost section is used for requests without a known 第一个虚拟主机用于 没有已知服务器域名的请求

# server name.

#

#<VirtualHost *:80> 添加实例

# ServerAdmin webmaster@dummy-host.example.com 管理员邮箱

# DocumentRoot /www/docs/dummy-host.example.com 文档根目录

# ServerName dummy-host.example.com 服务器名字(域名)

# ErrorLog logs/dummy-host.example.com-error_log 错误日志

# CustomLog logs/dummy-host.example.com-access_log common 对服务器的请求进行记录的日志

#</VirtualHost>



补充:虚拟主机有三种配置方式  基于IP   基于端口  基于域名


1.基于不一样IP

说明:在实际环境中,通常服务器没那么多公网IP,并且你们通常都是用域名访问的.因此这个实际用处不大.可是能够用来测试和学习,以便深刻理解apache运行原理。

 1. 假设服务器有个IP地址为192.168.1.1,使用ifconfig在同一个网络接口eth0上再绑定3个IP:(这些子接口ip都为临时增长,重启后消失)
(能够将这些命令加入开机启动项中,也能够在/etc/sysconfig/network-scripts中增长一个文件ifcfg-eth0:1)

[root@localhost root]# ifconfig eth0:1 192.168.1.2 netmask 255.255.255.0
[root@localhost root]# ifconfig eth0:2 192.168.1.3 netmask 255.255.255.0
[root@localhost root]# ifconfig eth0:3 192.168.1.4 netmask 255.255.255.0


若是是旧版本的apache 则要修改httpd.conf 文件查找 Include conf/extra/httpd-vhosts.conf 将前面的#号去掉,

而后修改虚拟主机配置文件 Apache/Conf/extra/httpd-vhosts.conf  添加如下代码 (新版本的apache直接修改httpd.conf文件,添加如下代码)

<VirtualHost 192.168.1.2:80>
    ServerAdmin webmaster@dummy-host.example.com           (能够省略,省略后按默认设置)
    DocumentRoot /www/test1
    ServerName 192.168.1.2
    ErrorLog logs/dummy-host.example.com-error_log         (能够省略,省略后按默认设置)
    CustomLog logs/dummy-host.example.com-access_log common(能够省略,省略后按默认设置)
      
<Directory "/www/test1">                           (能够省略或修改访问权限,默认容许)
     Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow From All
     </Directory>
</VirtualHost>

 

 

<VirtualHost 192.168.1.2:80>    (最简添加方式)
   DocumentRoot /www/test2
   ServerName 192.168.1.2
</VirtualHost>
 
 
<VirtualHost 192.168.1.3:80> 
  DocumentRoot /www/test3
  ServerName 192.168.1.3
  <Directory "/www/test3"> (在这里配置访问权限)
     Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow From All
         Deny From 192.168.1.10
 </Directory>

</VirtualHost>

这里重点说下  ServerName 选项

在实际操做中,在这种状况下并不须要域名访问,采用的是彻底以实际IP进行访问.相应的ServerName这个字段应该是没有意义的.事实也代表了咱们配置任何值都是能够经过的.

 

重启http时可能报错

1.Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName (不能肯定服务器主域名,请使用localhost.localdomain 作为服务器名)
解决方法:这个问题就在于没有在httpd.conf 中設定 ServerName ,若是你真没有域名的话,找到#ServerName www.example.com:80   把#去掉,再重启apache 就行了。若是有的话,根据你的实际状况修改成本机的IP或者域名

2.Name or service not known: Failed to resolve server name for 10.0.7.101 (check DNS) -- or specify an explicit ServerName
(未知的名字或服务:处理10.0.7.101服务器域名失败。检查DNS设置,或指定一个详细的服务器域名)

解决方法:检查在上面的虚拟主机设置中,有没有ServerName选项,并将其值改成虚拟主机IP

 

 

2.基于不一样的端口

经过访问同一个IP(或者域名)的不一样端口来访问到不一样的文件
httpd.conf作以下修改
增长监听口
Listen 80
Listen 8001
Listen 8002
将以前作的多域名虚拟主机去掉(由于此时是用IP加端口来访问的),
# Use name-based virtual hosting.
#
# NameVirtualHost * 注释掉这句话
如下是虚拟主机配置(注意下面的配置部分我并没用ServerName字段)
<VirtualHost *:8001>
ServerAdmin xxx@xxx.com (能够省略)
DocumentRoot /var/www/7.101
</VirtualHost>

<VirtualHost *:8002>
ServerAdmin xxx@xxx.com (能够省略)
DocumentRoot /var/www/7.102
</VirtualHost>
 
 
 
这里重点说下防火墙问题
若是没有配置经验请关闭seLinux和iptables两个防火墙
关闭selinux:修改/etc/selinux/config找到SELINUX=enforcing 修改成SELINUX=disable,而后reboot便可。
一次性的执行命令setenforce 0,这样不用重启,也能够生效。
关闭iptables:service iptables stop


重启http时可能报错

1.Permission denied: make_sock: could not bind to address

解决方法:查看上述两个防火墙是否关闭,通常为防火墙问题;还有就是用户权限问题,查看当前用户有无权限。


 

 

3.基于不一样的域名

这是在实际应用中最常遇到的,一个apache服务器上放置多个网站,以不一样的域名来区分

在测试环境中,咱们修改/etc/hosts文件 添加咱们域名解析的信息,方便咱们测试

10.0.7.100  www.example.com
10.0.7.100  www1.example.com
10.0.7.100  www2.example.com

修改httpd.conf的配置
# Use name-based virtual hosting.
#
NameVirtualHost *  

这是很是重要的一条指令,正是该指令激活了基于名字的虚拟主机的功能

表示在apache监听的全部IP和全部端口(此时只有80)上作多域名虚拟主机,也能够单独设定开启域名虚拟主机的ip(NameVirtualHost 10.0.7.100:80)


<VirtualHost *:80>
    ServerAdmin xxx@xxx.com
    DocumentRoot /var/www/7.100
    ServerName www.example.com

    ErrorLog logs/ error_log 
    TransferLog logs/ access_log
</VirtualHost>
 
<VirtualHost *:80>
    ServerAdmin xxx@ixxx.com
    DocumentRoot /var/www/7.101
    ServerName  www1.example.com

    ErrorLog logs/error_log
    TransferLog logs/access_log
</VirtualHost>

<VirtualHost *:80>
ServerAdmin xxx@ixxx.com
DocumentRoot /var/www/7.102
ServerName www2.example.com

ErrorLog logs/error_log
TransferLog logs/access_log
</VirtualHost>



这里要重点说明的就是 NameVirtualHost *  选项的设置,它表示在apache监听的哪一个IP和哪一个端口上作多域名虚拟主机

#NameVirtualHost *:80

若是您要配置基于域名的虚拟主机,
NameVirtualHost
指令就是您必须的指令之一。尽管addr参数可使用主机名,但建议您仍是使用IP地址。好比:
NameVirtualHost 111.22.33.44
请注意,<VirtualHost>指令的参数必须与NameVirtualHost指令的参数彻底匹配
NameVirtualHost 1.2.3.4:80
<VirtualHost 1.2.3.4:80>
 注意:命名虚拟主机没有指定端口不能使用

 

 

 

配置实例:

我用三种方法同时配置一台apache,以此来对比其中差别

10.0.7.100:80
10.0.7.100:8001
10.0.7.101:80      www.example.com    www1.example.com      www2.example.com

在10.0.7.100上使用基于不一样端口的虚拟主机(两个端口)
在10.0.7.101上使用基于不一样名字的虚拟主机(三个域名)
这也是两个IP地址
共五台虚拟主机,均使用最简配置

 

首先增长一个IP地址:
ifconfig eth0:1 10.0.7.101 netmask 255.255.255.0(
也能够在/etc/sysconfig/network-scripts中增长一个文件ifcfg-eth0:1

增长各个虚拟主机对应的文件夹

修改/etc/hosts文件 添加咱们域名解析的信息,方便咱们测试
10.0.7.101 www.example.com
10.0.7.101 www1.example.com
10.0.7.101 www2.example.com


修改httpd.conf 文件,监听本机全部ip地址的80和8001端口:
Listen 80
Listen 8001

配置虚拟主机部分:

NameVirtualHost  10.0.7.101:80     指定在这个ip的80端口上启动基于不一样域名的虚拟主机

<VirtualHost 10.0.7.100:80>
          DocumentRoot /var/www/html         
         ServerName 10.0.7.100
</VirtualHost>


<VirtualHost 10.0.7.100:8001>
         DocumentRoot  /var/www/8001
        ServerName 10.0.7.100
</VirtualHost>


<VirtualHost 10.0.7.101:80>
         DocumentRoot /var/www/www
        ServerName www.example.com 
</VirtualHost>

<VirtualHost 10.0.7.101:80>
        DocumentRoot /var/www/www1
       ServerName www1.example.com 
</VirtualHost>

<VirtualHost 10.0.7.101:80>
       DocumentRoot /var/www/www2
       ServerName www2.example.com 
</VirtualHost>

 

重启apache
service httpd restart

结果

Apache httpd.conf配置文件 3(虚拟主机) - 朝鲜程序员 - 朝鲜程序员的博客

 

Apache httpd.conf配置文件 3(虚拟主机) - 朝鲜程序员 - 朝鲜程序员的博客

 

Apache httpd.conf配置文件 3(虚拟主机) - 朝鲜程序员 - 朝鲜程序员的博客

 

Apache httpd.conf配置文件 3(虚拟主机) - 朝鲜程序员 - 朝鲜程序员的博客

 

Apache httpd.conf配置文件 3(虚拟主机) - 朝鲜程序员 - 朝鲜程序员的博客
 
 
配置实例:
对于在10.0.7.101上的三台基于名称虚拟主机 www.example.com  www1.example.com  www2.example.com 
若是咱们使用ip 10.0.7.101访问,结果会匹配到httpd.conf中位置最靠前的www.example.com 这台虚拟主机上。

 


如今要求不能使用ip地址访问只能使用域名访问

 
解决1:设置一个错误提示页面,提醒用户使用域名访问
新增长一台虚拟主机,将ip访问定位到这里 
<VirtualHost 10.0.7.101:80>
      DocumentRoot /var/www/error
(将error下的index.html内容改成 “请使用域名访问,域名是……”)
      ServerName 10.0.7.101                    (这里必定将域名改成IP地址)
</VirtualHost>
必定将这个虚拟主机放在 基于名称访问的全部虚拟主机 最前的位置

 

解决2:使用apache网络容器 <Location>
新增长一台虚拟主机,将ip访问定位到这里 
 <VirtualHost 10.0.7.101:80>
       DocumentRoot /var/www/www
      ServerName 10.0.7.101                   
(这里必定将域名改成IP地址)
      <Location />                                     (配置location网络容器)
          Order allow,deny
          Deny from all
      </Location>
</VirtualHost>

必定将这个虚拟主机放在 基于名称访问的全部虚拟主机 最前的位置

 

解决3:使用apache文件容器 <Directory>
新增长一台虚拟主机,将ip访问定位到这里 
<VirtualHost 10.0.7.101:80>
   DocumentRoot /var/www/www
   ServerName 10.0.7.101                             
(这里必定将域名改成IP地址)
    <Directory /var/www/www>                  (配置Directory容器)
        Order allow,deny
        Deny from all
   </Directory>
</VirtualHost>

也将这个虚拟主机放在 基于名称访问的全部虚拟主机 最前的位置

 

apache的容器 <Location> <Directory>放在另外一篇中讲


 注意:主配置文件中的域名若是也须要访问,可使用下列方法

<VirtualHost 10.0.7.101:80>
   DocumentRoot /var/www/www
   ServerName              </VirtualHost>

相关文章
相关标签/搜索