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>

相關文章
相關標籤/搜索