1. 程式人生 > >Apache 虛擬主機概念介紹

Apache 虛擬主機概念介紹

一.定義

所謂虛擬主機是指在一臺伺服器裡執行幾個網站(如:www.company1.comwww.company2.com),提供WEB、FTP、Mail等服務。

二.虛擬主機的實現方法有三種:

基於IP的方法,基於主機名的方法 和 基於埠的方法。

①基於IP的方法:
在伺服器裡繫結多個IP,然後配置WEB伺服器,把多個網站繫結在不同的IP上。訪問不同的IP,就看到不同的網站。
②基於埠的方法:

一個IP地址,通過不同的埠實在不同網站的訪問。
③基於主機名的方法:
  設定多個域名的A記錄,使它們解析到同一個IP地址上,即同一個伺服器上。然後,在伺服器上配置WEB服務端,新增多個網站,為每個網站設定一個主機名。因為HTTP協議訪問請求裡包含有主機名資訊,當WEB伺服器收到訪問請求時,就可以根據不同的主機名來訪問不同的網站。


三.三種虛擬主機實現的基本配置

①基於IP虛擬主機的實現:
多個ip,需要把中心主機取消

開啟web服務的主配置文件:vim /etc/httpd/conf/httpd.conf

DocumentRoot 註釋掉
配置虛擬主機:
<VirtualHost 192.168.0.20:80>
DocumentRoot "/www/a.com"
ServerName  www.a.com
<VirtualHost/>
<VirtualHost 192.168.0.25:80>
DocumentRoot "/www/b.com"
ServerName  www.b.com
<VirtualHost/>

vi /etc/hosts

瀏覽器中輸入IP地址進行實驗效果的驗證。

②基於埠:
<VirtualHost 192.168.0.20:80>
DocumentRoot "/www/a.com"
ServerName  www.a.com
<VirtualHost/>
<VirtualHost 192.168.0.20:8080>
DocumentRoot "/www/b.com"
ServerName  www.b.com
<VirtualHost/>

③基於主機名:
開啟:NameVirtualHost 192.168.0.20:80
<VirtualHost *:80>
    ServerAdmin    www.a.com


    DocumentRoot /etc/httpd/aaa/a.com 
    ServerName dummy-host.example.com
  ErrorLog logs/dummy-host.example.com-error_log
  CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>


<VirtualHost *:80>

    ServerAdmin    www.b.com
    DocumentRoot /etc/httpd/aaa/b.com
</VirtualHost>

基於域名(主機名)的虛擬主機相對比較簡單,因為你只需要配置你的DNS伺服器將每個主機名對映到正確的IP地址,然後配置Apache HTTP伺服器,令其辨識不同的主機名就可以了。基於域名的伺服器也可以緩解IP地址不足的問題。所以,如果沒有特殊原因使你必須使用基於IP的虛擬主機,您最好還是使用基於域名的虛擬主機。下列情況下,你可能會想要使用基於IP的虛擬主機:

  • 一些古董級的客戶端與基於域名的虛擬主機不相容。為了與基於域名的虛擬主機相容,客戶端必須傳送"Host"頭。HTTP/1.1規範中對此做了要求。而所有現在常見的僅支援HTTP/1.0的舊版本瀏覽器都以附加的方式實現了這個要求。如果你又想支援這些老瀏覽器,又想使用基於域名的虛擬主機。我們提供了一個技術方案,你可以在本文末尾看到它。
  • SSL協議先天特性決定了基於域名的虛擬主機無法成為SSL安全伺服器。
  • 一些作業系統和網路裝置實現的頻寬管理技術無法在多個主機共享一個IP的情況下區別它們。

四.基於域名虛擬主機案例綜合實現

為了使用基於域名的虛擬主機,你必須指定伺服器IP地址(和可能的埠)來使主機接受請求,這個可以用指令來進行配置。如果伺服器上所有的IP地址都會用到,你可以用"*"作為的引數。如果你打算使用多埠(如執行SSL)你必須在引數中指定一個埠號,比如"*:80"。請注意,在指令中指定IP地址並不會使伺服器自動偵聽那個IP地址。請參閱設定Apache使用的地址和埠一章獲取更多詳情。另外,這裡設定的IP地址必須對應伺服器上的一個網路介面。

取消中心主機(Mainhost)

如果你想在現有的web伺服器上增加虛擬主機,你必須也為現存的主機建造一個定義塊。這個虛擬主機中和所包含的內容應該與全域性的和保持一致。還要把這個虛擬主機放在配置檔案的最前面,來讓它扮演預設主機的角色。

比如說,假設你正在為域名www.domain.tld提供服務,而你又想在同一個IP地址上增加一個名叫www.otherdomain.tld的虛擬主機,你只需在httpd.conf中加入以下內容:

NameVirtualHost *:80     ————現在版本,這個引數已經廢棄。

<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>

當然,你可以用一個固定的IP地址來代替和指令中的"*"號,以達到一些特定的目的。比如說,你可能會希望在一個IP地址上執行一個基於域名的虛擬主機,而在另外一個IP地址上執行一個基於IP的或是另外一套基於域名的虛擬主機。

很多伺服器希望自己能通過不只一個域名被訪問。我們可以把指令放入小節中來解決這個問題。比如說在上面的第一個配置段中指令中列出的名字就是使用者可以用來訪問同一個web站點的其它名字:

ServerAlias domain.tld *.domain.tld

這樣,所有對域domain.tld的訪問請求都將由虛擬主機www.domain.tld處理。萬用字元標記"*"和"?"可以用於域名的匹配。當然你不能僅僅搞個名字然後把它放到或裡就算完了。你必須先在你的DNS伺服器上進行配置,將這些名字和您伺服器上的一個IP地址建立對映關係。

最後,你可以把其他一些指令放入段中,以更好的配置一個虛擬主機。大部分指令都可以放入這些段中以改變相應虛擬主機配置。如果您想了解一個特定的指令是否可以這樣運用,請參見指令的作用域主伺服器(main server)範圍內的配置指令(在所有配置段之外的指令)僅在它們沒有被虛擬主機的配置覆蓋時才起作用。

這樣,當一個請求到達的時候,伺服器會首先檢查它是否使用了一個能和相匹配的IP地址。如果能夠匹配,它就會查詢每個與這個IP地址相對應的段,並嘗試找出一個與請求的主機名相同的或配置項。如果找到了,它就會使用這個伺服器。否則,將使用符合這個IP地址的第一個列出的虛擬主機

綜上所述,第一個列出的虛擬主機充當了預設虛擬主機的角色。當一個IP地址與指令中的配置相符的時候,主伺服器中的將永遠不會被用到。所以,如果你想建立一段特殊的配置用於處理不對應任何一個虛擬主機的請求的話,你只要簡單的把這段配置放到段中,並把它放到配置檔案的最前面就可以了。


下面練習題:

建立http伺服器,要求:
 1)提供兩個基於名稱的虛擬主機:
  (a)www1.ilinux.org,頁面檔案目錄為/var/www/html/www1;錯誤日誌 為/var/log/httpd/www1.err,訪問日誌為/var/log/httpd/www1.access;
  (b)www2.ilinux.org,頁面檔案目錄為/var/www/html/www2;錯誤日誌為/var/log/httpd/www2.err,訪問日誌為/var/log/httpd/www2.access;
  (c)為兩個虛擬主機建立各自的主頁檔案index.html,內容分別為其對應的主機名;


  2)www1主機僅允許192.168.0.0/24網路中的客戶機訪問;www2主機可以被所有主機訪問;

為http服務提供第3個虛擬主機,要求:
 1)www3.ilinux.org,頁面檔案目錄為/var/www/html/www3;錯誤日誌為/var/log/httpd/www3.err,訪問日誌為/var/log/httpd/www3.access;
 2)為此虛擬主機提供基本認證功能,併為其提供兩個虛擬使用者webuser1和webuser2,
  密碼均為redhat,要求允許此兩使用者在提供密碼的情況下訪問此站點;


配置過程如下:

①安裝web服務:yum -y install httpd

②進入主配置文件vim /etc/httpd/conf/httpd.conf

<VirtualHost *:80>
  DocumentRoot "/var/www/html/www1"      
 ——DocumentRoot定義這個伺服器對外發布的超文字文件存放的路徑,

                                            ——客戶程式請求的UR L就被對映為這個目錄下的網頁檔案。
  ServerName  www1.ilinux.org                    ——這個就是客戶在瀏覽器裡輸入的網址
  Errorlog /var/log/httpd/www1.err                 ——錯誤日誌位置
  CustomLog /var/log/httpd/www1.access common
   <Directory "/var/www/html/www1">
                Options Indexes                   ——參考文件:http://blog.csdn.net/cymm_liu/article/details/7899049

                AllowOverride None
                Order allow,deny            
                Allow from 192.168.0.0/24                 ——www1主機僅允許192.168.0.0/24網路中的客戶機訪問
     </Directory>

</VirtualHost>

<VirtualHost *:80>
  DocumentRoot "/var/www/html/www2"
  ServerName  www2.ilinux.org
  Errorlog /var/log/httpd/www2.err
 CustomLog /var/log/httpd/www2.access common
    <Directory "/var/www/html/www2">
                Options Indexes
                AllowOverride None
               Order allow,deny
                Allow from all           ——這個就是允許所有的ip來訪問,如果設定成Deny from all,網頁就是顯403禁止訪問。
        </Directory> 
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot /var/www/html/www3
        ServerName www3.ilinux.org
        ErrorLog /var/log/httpd/www3.err
        CustomLog /var/log/httpd/www3.access combined
        <Directory "/var/www/html/www3">
                Options Indexes
                AllowOverride AuthConfig
                AuthName "AuthConfig.."
                AuthType basic
                AuthUserFile /etc/httpd/.htpasswd
                require user webuser1 webuser2
                Order allow,deny
                Allow from all
        </Directory>
 </VirtualHost>

 htpasswd -cm /etc/httpd/.htpasswd webuser1
 htpasswd -m /etc/httpd/.htpasswd webuser2

③分別在/var/www/html目錄下建立www1,www2,www3目錄

vim /var/www/html/www1/index.html

This is www1 test!

vim /var/www/html/www2/index.html

This is www2 test!

vim /var/www/html/www3/index.html

This is www3 test!

④service httpd start 啟動web服務

⑤進行實驗效果的驗證:瀏覽器中分別輸入www1.ilinux.org  www2.ilinux.org www3.ilinux.org