輕鬆配置httpd的虛擬主機

apache httpd系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.htmlhtml


httpd使用VirtualHost指令進行虛擬主機的定義。支持三種虛擬主機:基於ip,基於端口和基於名稱。其中基於端口的虛擬主機在httpd的術語上(例如官方手冊)也屬於基於IP的。shell

當一個請求到達時,將首先匹配虛擬主機。匹配虛擬主機的規則爲最佳匹配法。所謂最佳,是指通配的越少,匹配的優先級越高。例如"192.168.100.14:80"的優先級高於"*:80"。若是基於名稱的虛擬主機沒法匹配上,則採用虛擬主機列表中的第一個虛擬主機做爲響應主機。若是全部虛擬主機都沒法匹配上,則採用從主配置段落中的主機,若是主配置段落中註釋了DocumentRoot,則返回對應的錯誤。apache

主配置段落的指令基本上都能使用在虛擬主機容器中。至於虛擬主機中必須配有什麼指令,這沒有規定,由於虛擬主機只是封裝一組指令而已,即便其中沒有任何指令,它也會從主配置段落中繼承。可是,既然要使用且已經使用了虛擬主機,按照常理來講,至少得提供不一樣的ServerName,DocumentRoot等指令以讓它們各自獨立。vim

最後須要說明的是,httpd的"-S"選項在調試虛擬主機配置選項時很是有用。瀏覽器

1 基於IP的虛擬主機

基於IP的虛擬主機是在不一樣的IP+PORT上提供不一樣的站點服務,最多見的是在不一樣端口上提供不一樣站點。測試

若是僅基於IP,即便用不一樣IP地址,那麼要求操做系統上有兩個或更多IP地址,能夠提供多個網卡,或者經過網卡別名來實現。ui

若是基於端口,即便用不一樣端口,則使用相同IP或不一樣IP都可,但在httpd術語中,基於單個IP但不一樣端口的虛擬主機,也是基於IP的虛擬主機。spa

假設本機爲192.168.100.14。操作系統

# 首先設置個虛擬網卡。
shell> ip a add 192.168.100.144 dev eth0 label eth0:0

# 添加基於IP地址的虛擬主機,DocumentRoot使用的相對路徑,基於ServerRoot
shell> vim /etc/apache/extra/vhosts.conf

<VirtualHost 192.168.100.14:80>
    ServerName www.a.com
    DocumentRoot htdocs/a.com
</VirtualHost>

<VirtualHost 192.168.100.144:80>
    ServerName www.b.com
    DocumentRoot htdocs/b.com
</VirtualHost>

在主配置文件中,將該虛擬主機配置文件vhosts.conf包含進去。調試

include /etc/apache/extra/vhosts.conf

再提供DocumentRoot和各自的index.html。

mkdir /usr/local/apache/htdocs/{a.com,b.com}
echo '<h1>a.com<h1>' >/usr/local/apache/htdocs/a.com/index.html
echo '<h1>b.com<h1>' >/usr/local/apache/htdocs/b.com/index.html

使用httpd -S查看配置文件加載過程。

[root@xuexi httpd-2.4.27]# httpd -S -f /etc/apache/httpd.conf 
VirtualHost configuration:
192.168.100.14:80      www.a.com (/etc/apache/extra/vhosts.conf:23)
192.168.100.144:80     www.b.com (/etc/apache/extra/vhosts.conf:28)
ServerRoot: "/usr/local/apache"
Main DocumentRoot: "/usr/local/apache/htdocs"
Main ErrorLog: "/usr/local/apache/logs/error_log"
Mutex proxy: using_defaults
Mutex default: dir="/usr/local/apache/logs/" mechanism=default 
PidFile: "/usr/local/apache/logs/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="daemon" id=2
Group: name="daemon" id=2

重啓httpd。

service httpd restart

測試。

2 基於端口的虛擬主機

基於端口的虛擬主機須要監聽兩個套接字。

首先在配置文件中使用Listen指令修改監聽套接字,這裏假設只基於端口,因此只需修改端口號便可。

listen 80
listen 8080

修改虛擬主機配置文件vhosts.conf文件以下:

shell> vim /etc/apache/extra/vhosts.conf

<VirtualHost 192.168.100.14:80>
    ServerName www.a.com
    DocumentRoot htdocs/a.com
</VirtualHost>

<VirtualHost 192.168.100.14:8080>
    ServerName www.b.com
    DocumentRoot htdocs/b.com
</VirtualHost>

重啓httpd。測試www.a.com和www.b.com可否顯示。

3 基於名稱的虛擬主機

請求報文中獲取資源時包含了兩部分資源定位的格式:TCP/IP協議和HTTP協議,雖然TCP/IP部分相同,可是HTTP協議的請求報文中指定了HOST,這就是基於域名的虛擬主機能實現的緣由。也所以,基於名稱的虛擬主機必須指定ServerName指令,不然它將會繼承操做系統的FQDN。

shell> vim /etc/apache/extra/vhosts.conf

<VirtualHost 192.168.100.14:80>
    ServerName www.a.com
    DocumentRoot htdocs/a.com
</VirtualHost>

<VirtualHost 192.168.100.14:80>
    ServerName www.b.com
    DocumentRoot htdocs/b.com
</VirtualHost>

注意,對於基於名稱的虛擬主機,當使用IP地址請求(例如瀏覽器中輸入的是IP地址),或者沒法匹配到任何虛擬主機時,將採用第一個虛擬主機做爲默認虛擬主機。

例如,當某個hosts文件中添加了"192.168.100.14 www.c.com"時,即便在配置文件中並無配置www.c.com的虛擬主機,但訪問時仍然會訪問虛擬主機列表的第一個。

相關文章
相關標籤/搜索