1. 程式人生 > >WEB應用之httpd基礎入門(三)

WEB應用之httpd基礎入門(三)

  前文我們聊到了httpd的路徑別名、訪問日誌定義、basic認證配置,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12561236.html;今天我們來聊一聊httpd的虛擬主機和狀態頁的配置,前邊我們也提到了虛擬主機,所謂虛擬主機不外乎就是一個物理主機上存在多個虛擬站點;通常httpd的虛擬主機有三類,分別是基於ip的虛擬主機、基於埠的虛擬主機以及基於FQDN的虛擬主機;不難理解基於ip的虛擬主機就是以不同IP來區分不同的虛擬主機;基於埠的虛擬主機就是以不同埠區分不同的虛擬主機,基於fqdn的虛擬主機就是以不同使用者請求報文中的host首部來區分的虛擬主機;接下來我們來看看httpd裡怎麼配置虛擬主機;

  1、虛擬主機

  httpd裡虛擬主機的配置方法是由<virtualhost IP:PORT>  ……</virtualhost>配置塊來配置;其中httpd2.2在啟用虛擬主機配置前需要將其中心主機禁用,禁用方法很簡單,就是把中心主機裡的documentroot指令註釋即可;在httpd2.4中,我們就不需要去關閉中心主機,在配置了虛擬主機以後,中心主機自然失效,不需要人為手動註釋;對於在中心主機裡可配置的指令大多數都可以用於虛擬主機配置塊中;用法和中心主機裡配置幾乎沒有啥差別;

  示例:基於IP的虛擬主機實現

   提示:以上配置主要就是提供兩個基於IP的虛擬主機,一個是192.168.0.98:80,一個是192.168.0.99:80的主機;我們在對應目錄下建立好主頁檔案,過載配置檔案,這兩個虛擬主機就可以生效了;

[root@test_node1-centos7 conf.d]# echo "this is a_com page ip is 192.168.0.98" > /vhost/www/html/a_com/index.html
[root@test_node1-centos7 conf.d]# echo "this is b_com page ip is 192.168.0.99" > /vhost/www/html/b_com/index.html
[root@test_node1-centos7 conf.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4a:bd:74 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4a:bd74/64 scope link 
       valid_lft forever preferred_lft forever
[root@test_node1-centos7 conf.d]# ip addr add 192.168.0.98/24 dev ens33
[root@test_node1-centos7 conf.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4a:bd:74 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.0.98/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4a:bd74/64 scope link 
       valid_lft forever preferred_lft forever
[root@test_node1-centos7 conf.d]# httpd -t
Syntax OK
[root@test_node1-centos7 conf.d]# systemctl reload httpd
[root@test_node1-centos7 conf.d]# 

  提示:以上配置主要是給兩個虛擬站點提供對應的主頁檔案,然後在原有的網絡卡上面加了一個新的ip192.168.0.98,這樣配置後,我們配置的虛擬主機就可以在瀏覽器上通過不同的ip地址訪問,得到不同的主頁響應;

 

   提示:可以看到我們以不同IP訪問站點,得到的是不同虛擬主機給我們提供的主頁檔案,說明我們配置的基於IP地址的虛擬主機沒有什麼問題;同時我們也可以看這兩個虛擬主機各自的訪問日誌檔案;

   提示:不同的站點,各自以不同的訪問日誌和錯誤日誌分別記錄著各自站點訪問日誌和錯誤日誌資訊;

  示例:基於埠的虛擬主機實現

   提示:以上配置在基於IP的虛擬主機配置上修改了下,兩個虛擬主機都是基於192.168.0.99這個ip地址,分別監聽在80和81兩個埠上,我們訪問192.168.0.99:80就會匹配到a主機,拿到a主機的主頁響應,訪問192.168.0.99:81就會拿到b主機的主頁響應;

   提示:可以看到同一IP地址,訪問不同的埠,就以不同的虛擬站點提供服務;

  示例:基於不同FQDN的虛擬主機實現

   提示:以上配置兩個虛擬主機都監聽在192.168.0.99:80使用者訪問主要通過不同的host請求首部來區分;如下

  在過載配置前,我們先在windows上坐下host解析,模擬DNS解析,分別把www.a.com 和www.b.com 都解析成192.168.0.99

 

   提示:windows hosts解析檔案在C:\Windows\system32\drivers\etc\ 名字為hosts檔案,此檔案語法同Linuxhosts檔案語法相同,前邊是ip地址 後面是主機名稱或別名;如下

   提示:到此我們就可以通過不同的解析名稱來訪問不同的虛擬站點

   提示:可以看到我們以不同解析名稱來訪問,得到不同的虛擬主機響應,其實這中間就是使用者鍵入不同的host首部來區分不同的虛擬站點;如下

 

   提示:使用者的host請求首部是可以是其他字串,它這個host首部是不會被解析的,通常情況下是我們在瀏覽器上鍵入什麼字串,對應的host首部的值就是什麼,只不過瀏覽器要把我們鍵入的字串去解析成IP然後把對應的請求傳送到去對應ip地址的主機上;為了更好的理解這一過程請看下面;

   提示:我們在構造請求報文時,隨便給了一個字串給Host請求首部,也是可以正常請求到主頁的,這就說明host請求首部實質上只是用來區分不同虛擬主機,它不用來解析;之所以在host首部沒有被匹配成功的情況下,它響應a主機的頁面,這是因為a主機的配置在最上面,預設情況下host首部沒有被任何虛擬主機匹配就會以最上面的虛擬主機響應;這裡還需要注意一點的是,httpd2.2在使用FQDN虛擬主機時,需要使用到listen指令和namevirtualhost ip:port 指令來指定虛擬主機監聽的ip和埠資訊;httpd2.4則可以不用使用namevirtualhost這個指令來指定;如下

   提示:以上是httpd2.2基於FQDN的虛擬主機配置示例;

   2、status頁面配置說明

  httpd的狀態頁面上由httpd的status_module模組實現,在配置使用狀態頁面資訊,首先需要確認該模組是否裝載,確認方法如下:

   提示:httpd2.2和2.4的確認方法一樣,如果能夠列出status_module,說明該模組已經裝載,如果沒有被裝載需要使用LoadModule  status_module  modules/mod_status.so 來裝載即可;以上是httpd2.4確認結果,2.2的確認結果如下

 

   確認了模組裝載了,接下來就是配置使用

  示例:httpd2.4配置status頁面

   提示:狀態頁的配置主要是用location 來指定一個URI,然後在其下面配置sethandler 指令來指定匹配到的URI怎麼處理,以上表示用server-status來處理,這裡需要注意一點httpd的狀態頁面上status_module實現的,我們在配置使用必須是server-status來處理,不能上其他名稱;還需要說明的是該location可以配置在任何虛擬主機以及中心主機都可以,他都表示用server-status來處理,說白了就是顯示狀態頁;

   提示:以上就是我們剛才配置的location 對應uri 響應的內容;當然以上資訊是比較私密的資訊,通常情況下我們只允許部分IP地址的主機檢視,在httpd2.4上如果不是允許所有主機檢視,只是部分主機檢視,基於IP地址做訪問控制的話,我們需要將其訪問控制的許可權指令寫到<requireall> ……</requireall>配置段中;

   示例:httpd2.2狀態頁面配置

   提示:httpd2.2和httpd2.4狀態頁的配置沒有本質的不同;

   提示:在httpd2.2的狀態頁上,要比httpd2.4資訊少很多,從上面的提示看,它告訴我們如果要顯示全面的狀態資訊,我們需要使用extendedstatus on指令,如果我們需要更加全面的資訊,可以選擇把該指定配置server配置段