zoukankan      html  css  js  c++  java
  • Apache httpd.conf配置文件 3(虚拟主机)

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


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

    # Virtual hosts
    #Include conf/extra/httpd-vhosts.conf

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

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



    # 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地址的问题

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

    #

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


     

     


  • 相关阅读:
    js 数组扁平
    leetcode 15 三数之和
    leetcode 1 两数之和
    编写一个自定义事件类,包含on/off/emit/once方法
    css常见双栏和三栏布局
    关于js中this指向的问题
    函数防抖和节流
    ie6 js报错汇总
    windows PHP配置随笔
    上传文件表单file,限制上传文件类型的方法--参数accept
  • 原文地址:https://www.cnblogs.com/centos2017/p/7896698.html
Copyright © 2011-2022 走看看