Linux之Web服務(2)Httpd服務配置之四

Linux之Web服務(2)Httpd服務配置之四

前言

接上一篇的虛擬主機,本片主要介紹虛擬主機的一些搭建和部署,本篇通過一個具體的案例來顯示虛擬主機的作用和特性。

 

案例功能介紹:

  (1) 準備DNS解析3個域名或者添加/etc/hostst/3條主機名IP檔案,解決域名解析

     (2) 基於主機名實現三個虛擬主機

    (3) 每虛擬主機使用獨立的訪問日誌和錯誤日誌

     (4) 在第二個虛擬主機上提供/status

    (5) 在第三個虛擬主機提供路徑別名/bbs,訪問其它文件系統路徑;

    (6) 第三個虛擬主機的/admin要進行用戶訪問認證

    (7) 嘗試使用混合類型的虛擬主機:基於IPPORTServerName

 

具體實踐實現

 

基於主機名實現三個虛擬主機

準備工作:

1、搭建DNS域名解析。

#添加一個NDS配置文件路徑並在/etc/named.confDNS主配置文件中引用

[root@root ~]# grep '^include.*vhost' /etc/named.conf
include "/etc/named.vhost.zones";

#named.vhost.zones創建對應的zone定義3zone(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

wKioL1f7ZZCj7K7dAAB63L0NU2o477.png 

解析:這裏爲了區分,每個區域數據庫,個別都使用了不同的IP及主機名用於區分。分別定義了3zone配置,而其中的web地址及www域每個都有設置,分別爲:

www.badiu.com

www.meng.com

www.google.com


#修改對應的區域數據文件的權限位也屬組

[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類型定義的名稱,而第二個則是配置中指定的路徑,兩種必須同時指定並匹配,否則會檢查出錯誤。

 

#測試一下腳步進行檢查剛纔建立的3zone區域數據庫文件格式

[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

wKioL1f7ZobhOKvwAAAGtcQxO1o529.png 

#查看當前使用的網卡設備

[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一些最基本的正向解析搭建好了,那麼模擬的域名也就纔可以在本機上使用了,於是下面就可以來使用這些域名來當站點網址了。

 

2、配置httpd虛擬主機

 

配置3web服務虛擬文件配置文件

說明:這裏每個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

wKiom1f7Z5STcanOAAACqzTDglc828.png 

 

部署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

 

3、各自配置獨立功能

說明:給每個主機有獨立的日誌存放路徑

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

 wKioL1f7adKBij4VAAAs6F7F8Mo566.png

說明: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

 wKiom1f7agLxAlOEAAAY7K7ljM8803.png

說明:這裏有三種Apache官方已經預留設置好的格式,發現第2列的格式信息相對少一點,爲了方便理解,選擇第二種及common,當然可以加入到腳步文件中,但是要把配置中的訪問日誌CumostLog給刪除掉才行,不然不會寫入。

 

#可以使用sed刪除多行CustomLog配置

[root@root conf.d]# sed -i '/^[[:space:]]*CustomLog.*/d' virtualtest.conf

#然後修腳本中判斷是否有訪問控制的if語句塊中的sed插入命令中添加一個common字符

wKioL1f7ajPyj8VzAAALsL3Khdo266.png 

注意:這裏主要是判斷對應的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

wKioL1f7aofTFZWfAAAOutlXLU0424.png 

說明:這裏顯示已經成功修改了對應的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字節表示請求頭報文吧。

 

4、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/

wKiom1f7au7Sr8CdAABXGtLEjmk361.png 

說明:如果以後有自定義或新的模塊,可以放入此目錄方便管理,然後再對應的路徑添加配置文件或在已有配置文件添加對應的LoadModule指令即可。

#www.meng.com虛擬主機配置Location指令

[root@root conf.d]# vim /etc/httpd/conf.d/virtualtest.conf

wKiom1f7a0qwGneKAAAvNE77zwI641.png 

說明:這裏的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

wKioL1f7a36BYJCAAABcKRcay3I740.png

說明:顯示對應的服務各類狀態信息說明已經以及成功通過訪問控制來訪問。下面再另一臺主機上同樣使用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

wKiom1f7a6-js-jeAAAMuE27vWE435.png 

說明:這裏有多個nameserver建議放在第一個及最前面,會優先使用此DNS服務器來解析域名,否則可能會針對解析到www.meng.com網站了。

#添加上面的地址之後,測試是否可以解析此域名

[root@mzf ~]# ping -c 1 -W 1 www.meng.com

wKioL1f7a8jSXm-hAAAYdMNt48Q556.png 

說明:這有可以通過完整主機名來正向解析到對應的IP,纔算可以建立通信。

 

#下面同樣使用瀏覽器來訪問www.meng.com下的/status服務狀態

[root@mzf ~]# links http://www.meng.com/status

wKiom1f7bBHA4mdKAAASUSsatno813.png

說明:這裏系顯示了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

說明:這裏明確記錄了剛纔IP10.1.249.50的主機通客戶端瀏覽器進行訪問此虛擬主機站點,而且被拒絕訪問別攔截。而且訪問的資源路徑爲/vhosts/meng/status。因此可以通過查看錯誤日誌信息來不斷完善站點的安全和穩定。

 

 

5、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

wKioL1f7bFzSPbwdAABH4NOpv1s572.png 

解析:默認一般設置的別名會在/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指令時有個問題,如果指定的路徑後面結尾沒有加 / ,則別名的名稱後面也不要添加 /;如果指定路徑後面結尾添加了 / ,則別名名稱的結尾一定要加 /

2、同樣默認如果不對指定的目錄設置Directory標籤做訪問控制,默認此路徑是被拒絕所有人訪問的,因此需要添加指定的訪問控制,訪問上面有結束,這裏設定的爲允許所有。

 

#測試訪問http://www.google.com:8080/bbs/,因爲google設置了IP+8080端口,所有要指定端口進行訪問。

[root@root conf.d]# links http://www.google.com:8080/bbs

 wKioL1f7bNLDef80AAAJ27WtUPA572.png

說明:這裏訪問的資源路徑表面看是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  

wKiom1f7bPPiqD5vAABWJdi0P8k534.png 

#配合完成後檢查配置信息

[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

wKioL1f7bXHx5pNwAAAMcG5YdXA956.png 

 

 

6、第三個虛擬主機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>

wKioL1f7bd-hpgxSAAAvNE77zwI915.png

#htpasswd命令創建口令指定AuthUserFile指定的口令文件路徑,添加tom用戶

[root@root google]# htpasswd -cm /vhosts/google/.htpasswd tom
New password:                         #這裏輸入兩此密碼
Re-type new password: 
Adding password for user tom

注意:這裏了-ccreate及創建新口令文件,而-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

wKioL1f7bg_DYe4LAABnGCJqpNM038.png 

 

#進行/vhosts/google/admin/訪問,測試其認證,先打開瀏覽器輸入對應的地址:

http://www.google.com:8080/admin

wKiom1f7biajlfw7AAA88R1cau8688.png 

 

#輸入配置的用戶密碼後點擊確定,如果正確纔會顯示默認主頁index.html

wKioL1f7bj7RjVytAAAoc3QbDfs700.png

#使用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等類似命令來直接抓取資源文件源代碼。保證了相應的安全性。

 


7、嘗試使用混合類型的虛擬主機:基於IPPORTServerName

#其實在開始已經設置成了混合主機:

[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配置以及ServerNnameDNS解析的主機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服務解析爲對應的IP10.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.comwww.google.comdns服務配置中設置的正向解析數據庫中對應的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站點下的文檔資源了。

總結:這裏配置有一個優先級,如果配置標籤寫在文件的最開頭,且請求訪問的地址信息如果匹配會以及生效,相同的也只會優先匹配最前面的配置,因爲服務重載會從頭開始讀取每個配置文件的信息。當然配置文件有多個,會安裝目錄下的配置文件名排序來讀取信息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章