httpd 虛擬主機的建立

    Httpd 服務器是:C/S 架構的,一般客戶端與服務端都不會在同一臺主機上,那麼意味客戶端與服務端的數據通信是跨網絡的。那麼服務端與客戶端是如何解決數據通信問題呢。使用:基於socket機制藉助於IPv4IPv6協議實現不一樣主機進程間數據通信的。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協議的首部來交互的。以下圖所述:

wKioL1Pq_B3gorwUAAGwgyK0shM573.jpg


    說明:數據包中封裝了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!!!!

相關文章
相關標籤/搜索