Linux之Web服務(2)Httpd服務配置之四html
前言linux
接上一篇的虛擬主機,本片主要介紹虛擬主機的一些搭建和部署,本篇經過一個具體的案例來顯示虛擬主機的做用和特性。web
案例功能介紹:算法
(1) 準備DNS解析3個域名或者添加/etc/hostst/3條主機名IP檔案,解決域名解析數據庫
(2) 基於主機名實現三個虛擬主機編程
(3) 每虛擬主機使用獨立的訪問日誌和錯誤日誌vim
(4) 在第二個虛擬主機上提供/status;windows
(5) 在第三個虛擬主機提供路徑別名/bbs,訪問其它文件系統路徑;數組
(6) 第三個虛擬主機的/admin要進行用戶訪問認證 瀏覽器
(7) 嘗試使用混合類型的虛擬主機:基於IP,PORT和ServerName
具體實踐實現
基於主機名實現三個虛擬主機
準備工做:
一、搭建DNS域名解析。
#添加一個NDS配置文件路徑並在/etc/named.conf及DNS主配置文件中引用
[root@root ~]# grep '^include.*vhost' /etc/named.conf include "/etc/named.vhost.zones";
#在named.vhost.zones建立對應的zone定義3個zone(badu.com meng.com goole.com)
[root@root ~]# cat /etc/named.vhost.zones zone "baidu.com" IN { type master; file "baidu.com.zone"; }; zone "meng.com" IN { type master; file "meng.com.zone"; }; zone "google.com" IN { type master; file "google.com.zone"; };
#調整配置文件的權限及屬組
[root@root ~]# chown :named /etc/named.vhost.zones [root@root ~]# chmod 640 /etc/named.vhost.zones
#根據配置區域的路徑建立對應的區域數據庫文件,這裏使用循環查看3個區域數據庫文件
[root@root ~]# ls /var/named/{baidu,meng,google}.com.zone | while read line;do echo "---->$line<----";cat $line; done
解析:這裏爲了區分,每一個區域數據庫,個別都使用了不一樣的IP及主機名用於區分。分別定義了3個zone配置,而其中的web地址及www域每一個都有設置,分別爲:
#修改對應的區域數據文件的權限位也屬組
[root@root ~]# chmod 640 /var/named/{baidu,meng,google}.com.zone [root@root ~]# chgrp named /var/named/{baidu,meng,google}.com.zone
#檢查數據庫配置語法
[root@root ~]#named-checkzone ‘baidu.com’ /var/named/named.baidu.zone
注意:固然目前只有三個域,之後構建虛擬主機可能要更多,那麼每一條近似重複的命令如:
named-checkzone ‘zone1’ /var/named/zone1.zone
named-checkzone ‘zone2’ /var/named/zone2.zone
....................
提示:從上面能夠退出結論,那麼之後每一個域都要前一次named-checkzone命令,只是2個參數不同,那麼即便編程不好也要先一些解決的方法,好像named-checkzone有一個-w仍是什麼的選項,能夠指定目錄進行檢查,可是一直不知道怎用,因而只好寫個小腳本嘍。
#因而編寫一個小腳本,用於批量檢查一個指定配置文件中的zone對應的數據庫文件配置格式:
[root@root ~]# vim named-checkzone.sh #!/bin/bash #若是腳步參數小於1則提示錯誤並退出 [ $# -lt 1 ] && echo "Usage `basename $0` /path/to/zone_namedfile" && exit 1 #若是傳來的參數不是一個文件文件或者不存在則提示錯誤並退出 [ ! -e $1 -o ! -f $1 ] && echo "$1 no such zone_name_file!" && exit 2 prog=$1 #介紹傳來的zone類型定義配置文件,如/etc/named.rfc1912.zone #下面兩種方法均可以經過過濾主配置文件找出數據庫文件相對路徑目錄 zonedir=`grep '^[[:space:]]*directory' /etc/named.conf | sed -n 's/^.*\"\(.*\)\";.*$/\1/p'` zonedir=`grep '^[[:space:]]*directory' /etc/named.conf | awk -F'"' '{print $2}'` #若是目錄後面沒有/結尾,則追加,方便之後調用 if [[ ! $zonedir =~ /$ ]]; then zonedir+='/' fi #這裏同時取出每一個zone 定義的名稱、對應zone數據庫路徑,通常爲相對路徑,且顯示爲 #第一行爲名稱,第二行爲名稱對應的數據庫路徑。所以能夠而判斷奇數行位名稱,而偶數 #行對上一行名稱對應的路徑。取出多行傳入while循環逐行讀取 grep '^[[:space:]]*\(zone\|file\)' /etc/named.vhost.zones | sed -n 's/^.*\"\(.*\)\".*$/\1/p' | while read line; do let i++; #第一次i++後i=1表示行數的累計,第一行爲奇數行 if [ $[i%2] -eq 1 ]; then #判斷若是爲奇數行則將名稱存入 zone=$line else #偶數行其進行檢查zone數據庫 if [[ $line =~ ^/ ]]; then #這裏檢查若是數據庫路徑爲絕對路徑,則 named-checkzone "$zone" "$line" else #若是爲相對路徑,則相對於 zonedir取出的目錄 named-checkzone "$zone" "${zonedir}${line}" fi fi done
補充:named-checkzone有兩個參數,第一個則爲zone類型定義的名稱,而第二個則是配置中指定的路徑,兩種必須同時指定並匹配,不然會檢查出錯誤。
#測試一下腳步進行檢查剛纔創建的3個zone區域數據庫文件格式
[root@root ~]# bash named-checkzone.sh /etc/named.vhost.zones zone baidu.com/IN: loaded serial 2016100601 OK zone meng.com/IN: loaded serial 2016100601 OK zone google.com/IN: loaded serial 2016100601 OK
說明:從上面能夠看出配置應該沒有什麼問題,因而能夠從新加載named服務來檢測解析。
#讓named守護進程重載配置文件
[root@root ~]# systemctl reload named.service
#調整hosts主機名解析的優先級爲DNS服務器解析優先,在/etc/nsswitch.conf中的hosts條目中將dns設置在前面及優先DNS解析主機。
[root@root ~]# vim /etc/nsswitch.conf
#查看當前使用的網卡設備
[root@root ~]# ip -o link show up | awk -F'[ :]' '{print $3}' | grep -v '^lo' eno16777736
#查看當前eno16677736網卡的IP地址
[root@root ~]# ip addr show dev eno16777736 | grep '^[ ]\+inet' inet 10.1.249.223/16 brd 10.1.255.255 scope global eno16777736 inet 10.1.249.10/16 scope global secondary eno16777736
說明:從上面能夠看出以及有剛纔知道的兩個IP了,若是沒有可使用ip或者ifconfig命令對指定網卡進行添加一個IP,這裏不細說,下面來測試正向解析完整域名。
#使用ping命令來測試主機名,但有多個,所以就使用循環+判斷
[root@root ~]# for i in `echo www.{baidu,meng,google}.com`;do if ping -c 1 -W 1 $i &> /dev/null;then echo "$i nds ok"; fi; done www.baidu.com nds ok www.meng.com nds ok www.google.com nds ok
解析:這裏由於有多個主機,並且都是www開始.com結尾,因而使用echo將其打印出空格隔開的一個數組來供for循環進行屢次ping,若是ping通就輸出ok。
說明:當DNS一些最基本的正向解析搭建好了,那麼模擬的域名也就才能夠在本機上使用了,因而下面就能夠來使用這些域名來當站點網址了。
二、配置httpd虛擬主機
配置3個web服務虛擬文件配置文件
說明:這裏每一個VirtualHost標籤開始到結尾爲一個虛擬主機配置的定義,當同時匹配時,配置在最前面的虛擬被優先使用,配置以下:
[root@root ~]# vim /etc/httpd/conf.d/virtualtest.conf <VirtualHost 10.1.249.223:80>#指定IP地址 10.1.249.223 端口80 ServerName www.baidu.com #指定完整域名 www.baidu.com DocumentRoot "/vhosts/baidu" #指定站點根目錄 /vhostst/baidu.com <Directory "/vhosts/baidu.com"> #設置權限 Options None AllowOverride None Require all granted #容許全部人訪問,默認爲顯式搜權,及默認拒絕全部 </Directory> </VirtualHost> <VirtualHost *:80> #全部地址端口80 ServerName www.meng.com #指定完整域名爲 www.meng.com DocumentRoot "/vhosts/meng" #指定站點根目錄爲 /vhosts/baidu <Directory "/vhosts/baidu"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.1.249.10:8080> #IP地址爲10.1.249.10端口8080 ServerName www.google.com #站點名稱爲www.google.com DocumentRoot "/vhosts/google" #站點根目錄爲/vhosts/google <Directory "/vhosts/google"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
#上面有主機地址設置爲8080端口,所以要在/etc/httpd.conf添加一個Listen 8080
[root@root ~]# vim /etc/httpd/conf/httpd.conf
部署VirtualHost定義的DocumentRoot目錄
#建立站點的根目錄
[root@root ~]# mkdir -pv /vhosts/{baidu,meng,google} mkdir: created directory ‘/vhosts/baidu’ mkdir: created directory ‘/vhosts/meng’ mkdir: created directory ‘/vhosts/google’
#檢查配置信息並重載服務配置
[root@root ~]# httpd -t Syntax OK [root@root ~]# systemctl reload httpd.service
#修改根目錄的selinux安全上下文,讓httpd進程可以進行訪問此目錄
[root@root ~]# chcon -R -reference=/var/www/html /vhosts/
#通常默認主頁在/etc/httpd/conf/httpd.conf配置的DirectoryIndex 節點配置
[root@root ~]# grep '^[[:space:]]*DirectoryIndex' /etc/httpd/conf/httpd.conf DirectoryIndex index.html
解析:站點目錄的默認頁面爲index.html命名的文檔文件,因而能夠創建幾個文件。
#使用for循環快速同時創建3個站點的默認web首頁
[root@root ~]# for i in baidu meng google;do echo $i > /vhosts/${i}/index.html; done
下面使用curl或者links進行訪問測試
#訪問www.baidu.com
[root@root ~]# curl http://www.baidu.com baidu
#訪問www.meng.com
[root@root ~]# curl http://www.meng.com meng
#訪問www.google.com時要注意,上面設置了8080端口,所以要指定端口
[root@root ~]# curl http://www.google.com:8080 google
三、各自配置獨立功能
說明:給每一個主機有獨立的日誌存放路徑
www.baidu.com主機日誌配置
<VirtualHost 10.1.249.223:80> ServerName www.baidu.com DocumentRoot "/vhosts/baidu" <Directory "/vhosts/baidu"> Options None AllowOverride None Require all granted </Directory> ErrorLog "logs/baidu_error_log"#錯誤日誌 CustomLog "logs/baidu_access_log" #訪問日誌 </VirtualHost>
注意:這裏相對路徑通常相對於/etc/httpd/下的logs目錄,默認ServerRoot 設置爲 /etc/httpd。
奇怪的猜測
說明並探測
在配置了一個虛擬主機以後,發現,只是設置了不一樣的路徑,並且接下來的都是添加了兩條日誌配置,只是路徑不一樣,若是規格好相同的目錄,如都是/etc/httpd/logs目錄下,只是文件名不一樣,那麼能夠藉助也許文本處理工具來快速實現。
進一步的推測
在上篇處理輸出行間截取是寫了個subline.sh腳本,那麼這裏此次,換一種工具,可是發現while循環對於讀取於大量的標準輸出文本好像速度有些慢,並且只是把固定不變的內容給過濾格式並打印出來,而此次須要修改文件,而且每一個文件都在變,因而能夠經過遞歸算法來完成。爲何呢?由於每次全部變量都在變,這時候什麼if判斷都不行了呀。
屢次失敗的結論
#使用遞歸循環判斷每一個VitualHost標籤中是否已經定義了日誌信息,而後不斷進行重讀配置並再次判斷而後進行修改。由於此方法好像awk能夠實現,可是本人嘗試並未成功,因而只好使用這種笨辦法啦:
[root@root conf.d]# vim ~/awk.sh #!/bin/bash # path=/etc/httpd/conf.d/virtualtest.conf; #定義死對指定虛擬主機配置作更新處理 declare -a linenums; #定義一個索引數組,用來存放行號 #last函數用來支持當前配置文件狀態的virtualhost標籤的起始和開頭,並用:組合,及每一個索引存放的值爲」標籤開始行號:標籤結尾行號」 last() { linenums=(`grep -n '^[[:space:]]*</\?Vir' /etc/httpd/conf.d/virtualtest.conf | cut -d':' -f 1 | sed 'N;s/\n/:/'`) } #聲明一個變量 i=0 用來與對應的linenums行號索引的作比較統計判斷 let i=0; #主要的更新函數,會採用遞歸來重複調用,動態的修改指定虛擬主機文件,解決了日常使用的循環沒法進行動態變量值的判斷。如一個文件不段修改,任能準配找到對應匹配的行號。 update() { last #取得當前文件"<狀態>"的taget start、end行號 if [ $i -eq ${#linenums[@]} ]; then #若是i等於行號記錄的屬組長度,則退出此函數 return fi if [ $i -lt ${#linenums[@]} ]; then #若是i小於行號,則 s=${linenums[$i]%:*} #取得第i+1 次的vh標籤star\end行號,及第i+1對vh標籤 e=${linenums[$i]#*:} echo $s #測試打印第i+1對vh標籤起始行號 echo $e #測試打印第i+1對vh標籤結束行號 #記錄第i+1此vh標記裏的定義的 servername及站點主機名 servername=`sed -n "$s,$[e-1]"p $path | grep '^[[:space:]]*Server' | awk -F'.' '{print $2}'` #判斷第i+1 對標記中是否已經定義了錯誤日誌,若是有則記錄其返回值 sed -n "$s","$[e-1]"p $path | grep -Eq '^[[:space:]]*ErrorLog' err_result=$? #判斷第i+1 對標記中是否已經定義了訪問日誌,若是有則記錄其返回值 sed -n "$s","$[e-1]"p $path | grep -Eq '^[[:space:]]*CustomLog' acc_result=$? echo "--------修改中---------" #由於相對路徑文件名過程,這裏經過循環來不斷讀取 for j in logs/${servername}_{errorlog,accesslog}; do let k++; #奇數則進行錯誤日誌處理,偶數則進行訪問日誌處理 if [ $[k%2] -ne 0 ]; then if [ $err_result -ne 0 ]; then #若是未定義則添加一個對應的日誌指令 sed -i "${e}i \ \tErrorLog $j" $path fi else if [ $acc_result -ne 0 ]; then sed -i "${e}i \ \tCustomLog $j " $path fi fi done let i++; #處理一輪後i累計,準備解析來的判斷 update #遞歸本身調用本身,從新生成最新的標籤起始行和結束行 fi } update #調用此函數
#執行此腳本,來測試其修改效果
[root@root conf.d]# ~/awk.sh 1#第一個Vitrual標記起始行號 11#第一個Vitrual標記結尾行號 --------修改中--------- 12#第二個Vitrual標記起始行號 22 #第二個Vitrual標記結尾行號 --------修改中--------- 23#第三個Vitrual標記起始行號 34#第三個Vitrual標記起始行號 --------修改中---------
說明:以此類推有多少個VitrualHost虛擬主機標籤就會進行對應次數的處理。固然本章主要介紹虛擬主機的做用以及其部署爲主,而後進行下一步配置的檢查。
#查看剛纔通過修改過的虛擬主機配置文件/etc/httpd/conf.d/virtualtest.conf
[root@root conf.d]# grep -E -e '[[:space:]]*ServerName' -e '^[[:space:]]*(Error|Custom)Log' /etc/httpd/conf.d/virtualtest.conf
說明:grep過濾是自上而下的,這裏配置時由於每個虛擬主機VitrualHost都設置了一個站點域名,全部3個主機對應各類的2個配置文件個數是不會錯的。這裏再次強調一下,這裏的相對路徑是指ServerRoot指定路徑,那麼日誌路徑就爲/etc/httpd/logs/下。
#檢查配置文件的語法格式及信息
[root@root conf.d]# httpd -t AH00526: Syntax error on line 9 of /etc/httpd/conf.d/virtualtest.conf: CustomLog takes two or three arguments, a file name, a custom log format string or format name, and an optional "env=" or "expr=" clause (see docs)
解析:當看到這裏感受白忙活了,忘記了若是爲訪問日誌須要指定日誌的一個格式的,及須要記錄訪問來源的哪些響應、請求信息。固然訪問的格式有點多,並且難以記憶,大部分在官方文檔上,在編寫腳本的時候也就覺得會有默認值。固然也能夠完善一下腳本,不過這裏仍是看看主配置文件/etc/httpd/conf/httpd.conf有沒有預設一些全局配置的訪問日誌格式來供參考。
#查看產看主配置文件下是否有已經有日誌格式配置
[root@root conf.d]# grep '^[[:space:]]*LogFormat' /etc/httpd/conf/httpd.conf
說明:這裏有三種Apache官方已經預留設置好的格式,發現第2列的格式信息相對少一點,爲了方便理解,選擇第二種及common,固然能夠加入到腳步文件中,可是要把配置中的訪問日誌CumostLog給刪除掉才行,否則不會寫入。
#可使用sed刪除多行CustomLog配置
[root@root conf.d]# sed -i '/^[[:space:]]*CustomLog.*/d' virtualtest.conf
#而後修腳本中判斷是否有訪問控制的if語句塊中的sed插入命令中添加一個common字符
注意:這裏主要是判斷對應的VitrualHost虛擬主機是否已經有了CustomLog標籤及訪問日誌的配置,若是沒有將插入新的配置。
#修改完成後,能夠從新執行此腳本
[root@root conf.d]# ~/awk.sh 1 10 --------修改中--------- 12 21 --------修改中--------- 23 33 --------修改中---------
#再次查看配置信息文件中的CustomLog訪問日誌參數配置
[root@root conf.d]# grep '^[[:space:]]*CustomLog' /etc/httpd/conf.d/virtualtest.conf
說明:這裏顯示已經成功修改了對應的CustomLog配置,那麼下面再次進行檢查。
#再次檢查配置語法及信息的規則性
[root@root conf.d]# httpd -t Syntax OK
說明:輸出了OK,表示配置以及符合規則,語法也沒有什麼錯誤了。
#重載Httpd服務配置文件
[root@root conf.d]# systemctl reload httpd.service
#沒有顯示其它的信息,表示已經從新載入,查看日誌文件是否已經自動生成
[root@root conf.d]# ls -l /etc/httpd/logs/{baidu,meng,google}*log -rw-r--r--. 1 root root 0 Oct 1 17:56 /etc/httpd/logs/baidu_accesslog -rw-r--r--. 1 root root 0 Oct 1 17:56 /etc/httpd/logs/baidu_errorlog -rw-r--r--. 1 root root 0 Oct 1 17:56 /etc/httpd/logs/google_accesslog -rw-r--r--. 1 root root 0 Oct 1 17:56 /etc/httpd/logs/google_errorlog -rw-r--r--. 1 root root 0 Oct 1 17:56 /etc/httpd/logs/meng_accesslog -rw-r--r--. 1 root root 0 Oct 1 17:56 /etc/httpd/logs/meng_errorlog
說明:這裏生成的時間都是剛剛而且一致,說明日誌已經生效。
#下面測試訪問日誌是否真的能夠記錄訪問信息,使用curl進行直接訪問www.baidu.com站點的文檔資源源碼
[root@root conf.d]# curl http://www.baidu.com baidu
#訪問成功,下面查看www.baidu.com對應的訪問日誌文件
[root@root conf.d]# cat /etc/httpd/logs/baidu_accesslog 10.1.249.223 - - [01/Oct/2016:17:58:39 -0400] "GET / HTTP/1.1" 200 6
說明:這裏已經記錄了日誌的信息,請求用戶的IP地址、請求的時間、以及請求的第幾回次數,還有curl默認不指定選項實用的GET方法獲取其資源。HTTP1.1表示了Httpd使用的http1.1協議。200則表示OK及放回的請求成功的響應狀態碼,6表示發送的字節數量,由於沒有任何提交信息,只有6字節表示請求頭報文吧。
四、給www.meng.com虛擬主機配置一個狀態(server-status)查看頁面
提示:要使用server-status配置須要加載一個功能模塊及status_module,不然沒法使用。
#查看當前是否以及加載status_module模塊
[root@root conf.d]# httpd -M | grep '\<status' status_module (shared)
說明:httpd -M專門用來查看當前服務開啓時加載的全部相關模塊。
#若是發現沒有加載,能夠在配置文件中添加,通常在/etc/httpd/conf.modules.d/*.conf下配置一條加載信息,如:
LoadModule status_module modules/mod_status.so
提示:固然通常不會隨便添加,這裏先查看一下默認的conf.modules.d目錄下的文件:
[root@root conf.d]# ls /etc/httpd/conf.modules.d/ 00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf
#從上面看出有多個文件,所以能夠用for循環來對此目錄下全部文件進行內容過濾來判斷
[root@root conf.d]# for i in /etc/httpd/conf.modules.d/*.conf;do grep '^LoadModule.*status' $i; done LoadModule status_module modules/mod_status.so
解析:這裏顯示了有一個文件以及配置了加載mod_status模塊,所以能夠進行下面的具體配置,在配置以前,注意一點,LoadModule指令有兩個參數,一個爲名稱,一個則爲路徑,這裏爲相對路徑,則是相對於ServerRoot指令指定的路徑,默認爲/etc/httpd/modules/下。
#查看/etc/httpd/modules目錄文件列表
[root@root conf.d]# ls /etc/httpd/modules/
說明:若是之後有自定義或新的模塊,能夠放入此目錄方便管理,而後再對應的路徑添加配置文件或在已有配置文件添加對應的LoadModule指令便可。
#給www.meng.com虛擬主機配置Location指令
[root@root conf.d]# vim /etc/httpd/conf.d/virtualtest.conf
說明:這裏的Location指令的路徑爲相對於對應主機的DocumentRoot指令指定的站點文檔主目錄路徑下,固然這個文件無須要創建,經過模塊功能會自動識別。而SetHandler指令是專門用戶指定對應的模塊信息,及使用了server-status模塊功能。下面的RequireAll進行了對顯示只有10.1.249.223IP地址主機能查看此狀態,而本機其中一個IP就是這個地址,也就是本機能訪問,而all granted表示啓用容許全部。使用 RequireAll 封裝表示只容許指定的用戶,這裏指明的IP 10.1.249.223 才能訪問,也就是本機。
注意:使用RequrireAll標籤包裝,要容許指定用戶訪問,必須同時加上Require all granted。
#下面任然須要檢查語法
[root@root conf.d]# httpd -t Syntax OK
#而後重載服務配置
[root@root conf.d]# systemctl reload httpd.service
#訪問此http://www.meng.com/status及查看meng站點的主機站點狀態
[root@root conf.d]# links http://www.meng.com/status
說明:顯示對應的服務各種狀態信息說明已經以及成功經過訪問控制來訪問。下面再另外一臺主機上一樣使用links瀏覽器去嘗試訪問此站點。
#使用另外一臺主機去訪問,其IP地址爲10.1.249.50而非對應的10.1.249.223
[root@mzf ~]# hostname -I 10.1.249.50
#爲了指定DNS服務器來解析www.meng.com域名,訪問前要添加nameserver對應的ip
[root@mzf ~]# cat /etc/resolv.conf
說明:這裏有多個nameserver建議放在第一個及最前面,會優先使用此DNS服務器來解析域名,不然可能會針對解析到www.meng.com網站了。
#添加上面的地址以後,測試是否能夠解析此域名
[root@mzf ~]# ping -c 1 -W 1 www.meng.com
說明:這有能夠經過完整主機名來正向解析到對應的IP,纔算能夠創建通訊。
#下面一樣使用瀏覽器來訪問www.meng.com下的/status服務狀態
[root@mzf ~]# links http://www.meng.com/status
說明:這裏系顯示了403狀態碼,爲forbidden,表示無權限訪問此資源或站點路徑。表示訪問控制以及生效,那麼除了www.meng.com虛擬主機本機指定的IP才能訪問,除此其它任何想訪問都不行了,這樣就保證了站點服務的安裝,防止有用戶經過查看服務狀態信息來進行請求工具等。
#固然這時出現了請求的拒絕,在對應的web站點是有日誌記錄的
[root@root conf.d]# cat /etc/httpd/logs/meng_errorlog | tail -n 1 [Sat Oct 01 19:20:38.184219 2016] [authz_core:error] [pid 9528] [client 10.1.249.50:52109] AH01630: client denied by server configuration: /vhosts/meng/status
說明:這裏明確記錄了剛纔IP爲10.1.249.50的主機通客戶端瀏覽器進行訪問此虛擬主機站點,並且被拒絕訪問別攔截。並且訪問的資源路徑爲/vhosts/meng/status。所以能夠經過查看錯誤日誌信息來不斷完善站點的安全和穩定。
五、給www.google.com虛擬主機站點提供Alias別名/bbs路徑
提示:要使用別名路徑訪問方式,能夠說有兩種:
方法1:就是使用專門的Alias指令來定義指定別名名稱和命令指定的本地系統路徑。
方法2:一樣能夠在Options指令添加一個FollowSymLisks指令表示能夠運行在指定的Directory標籤指定的目錄下創建符合鏈接文件並指向的具體文件系統的路徑。
先來使用方法一:Alias指令
#準備好一個測試的本地文件系統路徑/test/bss目錄
[root@root conf.d]# mkdir /test/bbs
#添加一個默認首頁
[root@root conf.d]# echo "hello bbs" /test/bbs/index.html hello bbs /test/bbs/index.html
#給/test/bbs/目錄添加httpd指定的安全上下文
[root@root conf.d]# chcon -R -t httpd_sys_content_s /test/bbs/
#要經過訪問別名路徑http://www.google.com/bbs/,則須要配置www.google.com虛擬主機的具體配置,添加Alias訪問控制
[root@root conf.d]# vim virtualtest.conf
解析:默認通常設置的別名會在/etc/httpd/conf/httpd.conf下指定的IfModule標籤,可是這通常定義在全局配置,若是全局有,能夠直接去掉<IfModule alias_module>標籤,及:
Alias /bbs/ "/test/bbs/"
<Directory "/test/bbs">
Options None
AllowOverride None
Require all granted
</Directory>
注意:須要添加別名指定路徑下的目錄對應的訪問控制Directory,否則默認爲拒絕訪問。
Alias指令定義的格式:
Alias 別名路徑 「別名指定調用的路徑」
那麼這裏設置別名爲Alias /bbs/ 「/test/bbs/」,則表示:
別名名稱爲/bbs/ ,而經過/bbs/別名訪問的則是指定的路徑文件系統下的/test/bbs/目錄。
注意:
1、在定義Alias指令時有個問題,若是指定的路徑後面結尾沒有加 / ,則別名的名稱後面也不要添加 /;若是指定路徑後面結尾添加了 / ,則別名名稱的結尾必定要加 /。
二、一樣默認若是不對指定的目錄設置Directory標籤作訪問控制,默認此路徑是被拒絕全部人訪問的,所以須要添加指定的訪問控制,訪問上面有結束,這裏設定的爲容許全部。
#測試訪問http://www.google.com:8080/bbs/,由於google設置了IP+8080端口,全部要指定端口進行訪問。
[root@root conf.d]# links http://www.google.com:8080/bbs
說明:這裏訪問的資源路徑表面看是google的站點文檔根路徑下的/vhosts/google/bbs目錄,實則訪問的爲文件系統下的/test/bbs,只是隱藏了決定資源文件的路徑而已。
注意:假如在 google站點文檔路徑下再建立一個/vhosts/google/bbs/目錄,那麼當經過上面的網址訪問的資源會發送衝突,當同時設置了Alias指令後,Alias 優先生效。
下面使用方法二:
說明:在Options指定添加 FollowSymLinks 參數,及容許符號連接。而後對於的google 站點的文檔根目錄(/vhosts/google/)下建立一個bbs符號連接文件。
#在www.google.com 的文檔主目錄 <Directory >標準設置Options指令配置爲;
Options FollowSymLinks
#配合完成後檢查配置信息
[root@root conf.d]# httpd -t Syntax OK
#重載Httpd配置文件
[root@root conf.d]# systemctl reload httpd.service
#建立一個準備此測試的目錄
[root@root conf.d]# mkdir /mybbs/
#給此目錄一個Httpd定義的默認頁
[root@root conf.d]# echo "This is Mybbs \!" > /mybbs/index.html
#給這些路徑添加httpd須要的selinux安全上下文
[root@root conf.d]# chcon -R -t httpd_sys_concent_t /mybbs/
#查看/mybbs/目錄及目錄下的index.html安全上下文是否生效
[root@root conf.d]# ls -aZ --ignore='..' /mybbs/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_concent_t:s0 . -rw-r--r--. root root unconfined_u:object_r:httpd_sys_concent_t:s0 index.html
#在DIrecotry指定的/vhosts/google/目錄下建立符號連接文件執行/mybbs/
[root@root google]# ln -sv /mybbs /vhosts/google/mybbs
#設置selinux上下文
[root@root google]# chcon -t httpd_sys_content_t /vhosts/google/mybbs
#訪問www.google.com:8080/mybbs
[root@root google]# links http://www.google.com:8080/mybbs
六、第三個虛擬主機www.google.com文檔根路徑下/admin要進行用戶訪問認證
#在www.google.com站點的DocumentRoot 指令指定的路徑 /vhosts/google/下添加/admin
[root@root google]# mkdir /vhosts/google/admin
#添加一個默認頁面用於測試顯示效果
[root@root google]# echo "<html><head><>title>Admin</title></head>><body><h1>Admin Page</h1></body></html>" > /vhosts/google/admin/index.html
#給/vhosts/google/admin/目錄及下全部文件添加httpd對應安全上下文
[root@root google]# chcon -R -t httpd_sys_content_t /vhosts/google/admin/
#配置www.google.com的<VirtualHost>標籤下添加訪問認證控制:
<Directory "/vhosts/meng/admin"> Options None AllowOverride None AuthType Basic #基本口令驗證 AuthName "please you inut uname and passwd login server:" #驗證登陸界面的提示語 AuthUserFile /vhost/meng/.htpasswd #使用的單項加密口令文件 Require user tom hadoop #基於tom、hadoop用戶進行驗證,其它拒絕訪問 </Directory>
#htpasswd命令建立口令指定AuthUserFile指定的口令文件路徑,添加tom用戶
[root@root google]# htpasswd -cm /vhosts/google/.htpasswd tom New password: #這裏輸入兩此密碼 Re-type new password: Adding password for user tom
注意:這裏了-c爲create及建立新口令文件,而-m表示使用md5加密算法進行加密,一次須要建立,則使用-c選項。若再次使用-c建立則覆蓋以前的配置。
#再次添加hadoop 用戶及生成口令,這裏不要使用-c選項,不然會從新覆蓋
[root@root google]# htpasswd -m /vhosts/google/.htpasswd hadoop New password: Re-type new password: Adding password for user hadoop
#添加成功以後測試配置
[root@root google]# httpd -t Syntax OK
#重載httpd服務配置文件
[root@root google]# systemctl reload httpd.service
#在本地windows主機添加一個dns地址執行linux DNS服務器IP
#進行/vhosts/google/admin/訪問,測試其認證,先打開瀏覽器輸入對應的地址:
http://www.google.com:8080/admin
#輸入配置的用戶密碼後點擊肯定,若是正確纔會顯示默認主頁index.html
#使用curl命令測試,先查看默認主頁
[root@root google]# curl http://www.google.com:8080 google
#成功則訪問admin目錄下的index.html
[root@root google]# curl http://www.google.com:8080/admin/index.html <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>401 Unauthorized</title> #401表示拒絕訪問,及權限不夠 </head><body> <h1>Unauthorized</h1> <p>This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p> </body></html>
說明:使用此驗證一樣不只能夠保證指定用戶驗證來訪問對應的資源路徑,還能夠防止其它用戶使用curl等相似命令來直接抓取資源文件源代碼。保證了相應的安全性。
七、嘗試使用混合類型的虛擬主機:基於IP,PORT和ServerName
#其實在開始已經設置成了混合主機:
[root@root google]# grep -E '^[[:space:]]*(<VirtualHost|ServerName)' /etc/httpd/conf.d/virtualtest.conf <VirtualHost 10.1.249.223:80> #第一個虛擬主機爲Ip: 10.1.249.223 port:默認80 ServerName www.baidu.com #第一個虛擬主機FQDN:www.baidu.com <VirtualHost *:80> #第二個虛擬主機任意ip 端口爲80 ServerName www.meng.com #第二個虛擬主機FQDN:www.meng.com <VirtualHost 10.1.249.10:8080> #第三個虛擬主機IP:10.1.249.10 port 端口80 ServerName www.google.com #第三個虛擬主機DQDN:www.google.com
#而dns服務配置中又定義了各自主機名對應的IP地址,及:
#baidu主機www.badiu.com對應IP 10.1.249.223
[root@root google]# host -t A wwww.baidu.com wwww.baidu.com has address 10.1.249.223
#meng主機www.meng.com對應IP 10.1.249.10
[root@root google]# host -t A wwww.meng.com wwww.meng.com has address 10.1.249.10
#google主機www.google.com對應也是IP 10.1.249.10
[root@root google]# host -t A wwww.google.com wwww.google.com has address 10.1.249.10
說明:上面的VirtualHost配置以及ServerNname被DNS解析的主機IP地址來看,能夠進行一些混合模式的訪問。
具體訪問測試
#當訪問http://10.1.249.223時
[root@root google]# curl http://10.1.249.223 baidu
說明:由於www.baidu.com對應的VirtualHost在最前面,並且默認端口爲80,且指定了IP地址爲10.1.249.223。全部優先會使用www.baidu.com虛擬主機站點配置。
#當訪問http://www.badiu.com,一樣根據DNS解析的IP地址10.1.249.223去尋找配置
[root@root google]# curl http://www.baidu.com baidu
#當訪問http://10.1.249.10時
[root@root google]# curl http://10.1.249.10 meng
說明:由於www.meng.com對應的爲任意地址,可是端口爲80,讀取第一個主機配置及baidu時由於指定了IP與其不匹配,讀取下一個,而下一個爲任意IP且端口爲80則符合,所以能夠匹配爲www.meng.com.
#固然訪問直接的主機名會被DNS服務解析爲對應的IP及10.1.249.10,所以同上訪問
[root@root google]# curl http://www.meng.com meng
#可是當指定端口號,如http://www.meng.com:8080,則
[root@root google]# curl http://www.meng.com:8080 google
說明:這時由於www.meng.com和 www.google.com在dns服務配置中設置的正向解析數據庫中對應的IP地址都爲10.1.249.10,全部,當端口爲8080時,第二個主機名會根據正向DNS服務器解析IP地址爲10.1.249.10後接:8080端口,此時讀取下一個虛擬主機標籤及<VirtaulHost>IP指定了10.1.249.10的且端口爲8080,所以與其匹配則創建鏈接。讀取的資源則爲www.google.com根站點默認網頁。
#一樣訪問http://10.1.249.10:8080,則也應仍是www.google.com,由於只有此虛擬主機同時匹配IP和對應的端口。並且其VitrualHost標籤前面已經沒有優先符合的配置了,則:
[root@root google]# curl http://10.1.249.10:8080 google
#固然指定www.google.com 網站後跟8080端口,則也只有www.google.com優先匹配
[root@root google]# curl http://www.google.com:8080 google
#那麼不指定端口訪問www.google.com呢
[root@root google]# curl http://www.google.com meng
說明:當找不到對應的主機名的端口匹配,將經過DNS解析爲對應IP-->10.1.249.10,讓後找到一樣NDS記錄對應IP地址爲此地址的www.meng.com,所以就會訪問www.meng.com站點下的文檔資源了。
總結:這裏配置有一個優先級,若是配置標籤寫在文件的最開頭,且請求訪問的地址信息若是匹配會以及生效,相同的也只會優先匹配最前面的配置,由於服務重載會從頭開始讀取每一個配置文件的信息。固然配置文件有多個,會安裝目錄下的配置文件名排序來讀取信息。