### 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)
若是是舊版本的apache 則要修改httpd.conf 文件,查找 Include conf/extra/httpd-vhosts.conf 將前面的#號去掉,
而後修改虛擬主機配置文件 Apache/Conf/extra/httpd-vhosts.conf 添加如下代碼 (新版本的apache直接修改httpd.conf文件,添加如下代碼)
在實際操做中,在這種狀況下並不須要域名訪問,採用的是徹底以實際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.基於不一樣的端口
重啓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
結果
如今要求不能使用ip地址訪問,只能使用域名訪問
解決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>