Httpd 服務器是:C/S 架構的,一般客戶端與服務端都不會在同一臺主機上,那麼意味客戶端與服務端的數據通信是跨網絡的。那麼服務端與客戶端是如何解決數據通信問題呢。使用:基於socket機制藉助於IPv4或IPv6協議實現不一樣主機進程間數據通信的。Socket地址格式以下:html
IPv4 Domain IPv4地址:0~65535端口 IPv6 Domain IPv6地址:0~65535
例:172.16.13.1:41957 《==========》192.168.60.99:80web
IP地址是用來標識跟網絡上的主機的,端口號是標識該主機的用戶空間的應用程序的地址;這樣使用 IP +端口號,就能夠找到指定主機的指定應用程序了。Httpd服務器的虛擬主機是調整 IP + 端口號的不一樣組合實現基於端口的虛擬主機和基於IP地址的虛擬主機的。如:瀏覽器
1、設置虛擬主機前的配置;bash
(1)、 註釋掉主配置文件中的【DocumentRoot】定義的網頁文檔目錄服務器
# DocumentRoot /var/www/html
(2)、在主配置中設置監聽的端口與所使用的IP地址;網絡
Listen 80 Listen 192.168.60.99:8080
查看監聽的端口:架構
[root@stu13 ~]# netstat -anpt| grep httpd tcp 0 0 192.168.60.99:8080 0.0.0.0:* LISTEN 4026/httpd.worker tcp 0 0 :::80 :::* LISTEN 4026/httpd.worker
2、 配置基於IP的虛擬主機;curl
<VirtualHost 192.168.60.99:80> DocumentRoot /web/vhosts/www1 ServerName bbs.9527du.com ErrorLog / var/log/httpd/www1.err CustomLog /var/log/httpd/www1.access common </VirtualHost>
測試:socket
[root@stu13 ~]# curl -I http://192.168.60.99/index.html HTTP/1.1 200 OK Date: Wed, 13 Aug 2014 00:51:25 GMT Server: Apache Last-Modified: Mon, 11 Aug 2014 08:49:40GMT ETag: "1e-17-50056a2b04222" Accept-Ranges: bytes Content-Length: 23 Content-Type: text/html; charset=UTF-8
3、 匹配基於端口的虛擬主機;tcp
<VirtualHost 192.168.60.99:8080> DocumentRoot /web/vhosts/www2 ServerName www.9527du.com ErrorLog /var/log/httpd/www2.err CustomLog /var/log/httpd/www2.access common </VirtualHost>
測試:
[root@stu13 ~]# curl -Ihttp://192.168.60.99:8080/index.html HTTP/1.1 200 OK Date: Wed, 13 Aug 2014 01:20:24 GMT Server: Apache Last-Modified: Wed, 13 Aug 2014 01:05:05GMT ETag: "16-23-5007860eece9f" Accept-Ranges: bytes Content-Length: 35 Content-Type: text/html; charset=UTF-8
說明:httpd2.4還要作網頁文件目錄的訪問控制,不然建立虛擬機失敗。
4、在httpd 2.4 版本創建虛擬主機
(1)、註釋掉主配置文件中【DocumentRoot】定義的網頁文檔存在目錄
#DocumentRoot /usr/local/httpd2.4/htdocs
(2)、虛擬主機配置以下
<VirtualHost 192.168.60.99> DocumentRoot /web/vhosts/www2 ServerName bbs.9527du.com ErrorLog /var/log/httpd/www2.err CustomLog /var/log/httpd/www2.access common </VirtualHost>
測試
[root@stu13bin]# curl -I http://192.168.60.99/index.html HTTP/1.1 403 Forbidden Date: Wed, 13 Aug 2014 01:52:21 GMT Server: Apache/2.4.1 (Unix) PHP/5.4.26 Content-Type: text/html; charset=iso-8859-1
說明:http的狀態碼爲:403 Forbidden。無權訪問資源
(3)、給虛擬主機的網頁存放目錄增長訪問控制
<VirtualHost 192.168.60.99> DocumentRoot /web/vhosts/www2 ServerName bbs.9527du.com ErrorLog /var/log/httpd/www2.err CustomLog /var/log/httpd/www2.access common <Directory "web/vhosts/www2"> AllowOverride none Require all granted </Directory> </VirtualHost>
(4)、測試
[root@stu13 bin]# curl -Ihttp://192.168.60.99/index.html HTTP/1.1 200 OK Date: Wed, 13 Aug 2014 02:10:11 GMT Server: Apache/2.4.1 (Unix) PHP/5.4.26 Last-Modified: Wed, 13 Aug 2014 01:05:05GMT ETag: "23-5007860eece9f" Accept-Ranges: bytes Content-Length: 35 Content-Type: text/html
5、建立基於主機名的虛擬主機。IP地址和端口也不變化。主機名稱發生變化。
在瀏覽器中訪問 http://web.9527du.com/index.htm,首先會去聯繫DNS域名解析服務器解析 web.9527du.com 域名解析服務器會把解析結果返回給客戶端。瀏覽器就使用IP地址訪問該域名對應的主機的資源。可是,web服務器有三臺虛擬主機:
基於IP地址虛擬主機 192.168.60.99:80 基於端口虛擬主機 192.168.60.99:8080 基於域名的虛擬主機 web.9527du.com(它的IP地址是:192.168.60.99:80)
問題:基於主機名的虛擬主機的IP地址端口號與基於IP地址的虛擬主機是相同的。瀏覽器是使用DNS解析後的IP地址去聯繫對應的web服務器的,在瀏覽器中輸入:http://web.9527du.com/index.html就訪問到基於域名的虛擬主機了,而沒有訪問到基於IP地址的虛擬主機中的資源呢?其實,客戶端從服務器獲取資源是經過 HTTP協議的首部來交互的。以下圖所述:
說明:數據包中封裝了HTTP協議的頭部信息,客戶端與服務端的數據交互是經過HTTP協議定義的不少首部來交互數據的。以下面http的首部。
GET /p_w_picpath/mm.gif 服務器根據該首部就知道客戶端請求的資源(uri)是什麼 HOST:www.9527du.com 與httpd服務器中【ServerName】指令定義的主機名稱作匹配若是匹配到 ,客戶端請求的就是該主機下的資源。
這也就是爲何,基於IP地址的虛擬主機的socket地址與基於域名的虛擬主機的socket相同,訪問到的虛擬主機是基於域名的虛擬主機上的資源而不是訪問基於IP地址的虛擬主機上的資源。
(1)、開啓基於域名的虛擬主機
NameVirtualHost192.168.60.99:80
注意:httpd 2.4 版本沒有該指令。直接是打開基於域名的虛擬主機的功能的。
(2)、爲了測試,在/etc/hosts文件中添加一行
[root@stu13~]# echo "192.168.60.99 web.9527du.com" >> /etc/hosts
(3)、配置虛擬主機
<VirtualHost192.168.60.99:80> DocumentRoot /web/vhosts/www3 ServerName web.9527du.com ErrorLog /var/log/httpd/www3.err CustomLog /var/log/httpd/www3.access common </VirtualHost>
(4)、測試
添加測試網頁
[root@stu13~]# echo "host is www3" > /web/vhosts/www3/index.html
訪問測試
[root@stu13~]# curl -eI http://web.9527du.com/index.html hostis www3
說明:
若是使用的httpd版本是2.4的話,必定要添加網頁文件目錄的訪問控制。
OK!!!!