Apache服務的配置分爲三個階段:
1、 全局配置(theglobal environment):對主服務器或虛擬機都有效,且有些功能是服務器自身屬性;
2、 主服務器(mainserver):主站屬性;
3、 虛擬主機(VirtualHosts):虛擬主機及屬性定義;
本次實驗討論第三階段:虛擬主機;
httpd的虛擬主機;
httpd的statues
curl命令的使用
httpd的壓縮功能
=======================================================
一、httpd的虛擬主機:
1、 什麼是虛擬主機:
虛擬主機是在同一臺主機中搭建基於不同主機名、端口號及基於不同IP的多個網站服務的技術,可以爲運行在同一物理機器上的各個網站指配不同的IP和端口,也可讓多個網站擁有不同的主機名;
虛擬主機的類型:
一共有三種類型的虛擬主機:
基於端口虛擬主機:一個IP、一個主機名對應多個端口;
基於IP虛擬主機:一個主機名、同一個端口對應多個IP地址;
基於主機名(FQDN)的虛擬主機:一個IP地址、一個端口對應多個主機名;
【實驗環境】
一臺CentOS6.6虛擬機作爲web服務器兼DNS服務器,一臺windows 8.1的物理機做客戶端,規劃如下:
域名:webtest.com 172.16.21.9 CentOS6.6
DNS: ns1.webtest.com 172.16.21.9 CentOS6.6
Web: httpd.webtest.com(別名:apache.webtest.com) 172.16.21.9 CentOS6.6
Win8.1客戶端:172.16.21.1 DNS指向 172.16.21.9
2、 DNS和Apache2.2的基本配置:
1) 在172.16.21.9的CentOS虛擬機上安裝並配置好DNS服務,配置文件的內容如下圖所示:
[root@centos ~]# yum install -y bindbind-chroot bind-utils [root@centos ~]# vim /etc/named.conf
區域解析文件webtest.com.zone的配置內容如下圖所示:
關於DNS的配置,請參考前面有關DNS的配置文章;
2) 在172.16.21.9的CentOS虛擬機上通過yum安裝好httpd2.2,做好基本配置並在DocumentRoot目錄下創建好默認的index.html文件。
[root@centos ~]# yum install httpd –y DocumentRoot "/var/www/html" [root@centos ~]# cat/var/www/html/index.html
<html> <head> <metacharset="UTF-8"> <title>kalaguiyin測試</title> </head> <body> <h2>歡迎訪問,這是測試主頁</h2> <marquee>http://kalaguiyin.51cto.com<marquee> </body> </html>
3) 在Win8.1主機上配置好網絡,特別注意將DNS指向我們配置好的DNS服務器(172.16.21.9);
4) 在Win8.1客戶端的瀏覽器中輸入相應網址測試兩臺web服務器及DNS配置結果;直接輸入Apache服務器的IP地址的訪問結果;
輸入域名的訪問結果:
上面的網址即爲我們DNS裏設置的web服務器的主機A記錄,因此可以看到DNS和Web都已經工作正常了哈。
3、 配置虛擬主機:
配置虛擬主機的前提條件:
虛擬主機與主服務器不能並存,因此需要先關閉主服務器,即找到主服務器端的DocumentRoot,將其註釋掉:
然後用一個容器類指令來定義虛擬主機: <VirtualHost IP:PORT> ServerName DocumentRoot "" </VirutalHost> #說明:ServerName和DocumentRoot就是一個虛擬主機最基本的兩個配置,但可以爲每個虛擬主機定義更多的屬性:日誌、用戶訪問控制等等
配置基於虛擬端口的虛擬主機:
(1) 在Apache2.2上面配置如下所示:
#(1)找到httpd.conf文件中虛擬主機段,做如下配置: <VirtualHost *:80> ServerName www.80.com #不是根據主機名來定義,因此此處可任意寫 DocumentRoot "/website/host1" #80端口的虛擬主機網站根目錄設置爲此處 </VirtualHost> <VirtualHost *:8080> ServerName www.8080.com DocumentRoot "/website/host2" #8080端口的虛擬主機網站根目錄設置爲此處 </VirtualHost>
#(2)配置監聽端口(同時監聽80、8080端口): Listen 80 Listen 8080
#(3)保存退出並檢查語法: [root@Centos ~]# httpd -t Warning: DocumentRoot [/website/host1] does not exist #網站根目錄不存在啊,創建即可 Warning: DocumentRoot [/website/host2] does not exist Syntax OK
#(4)創建網站根目錄: [root@centos named]# mkdir -pv/website/host{1,2} mkdir: created directory `/website' mkdir: created directory `/website/host1' mkdir: created directory `/website/host2' [root@centos named]# httpd -t Syntax OK
#(5)在上面創建的host1、host2目錄下創建默認主頁面:[root@Centos ~]# vim /website/host1/index.html <h1>www.80.com</h1> [root@Centos ~]# vim /website/host2/index.html <h3>www.8080.com</h3>
#(6)重新啓動httpd服務(因爲改動了端口號) [root@Centos ~]# service httpd restart
在客戶端瀏覽器中驗證配置:
說明:基於端口號的虛擬主機配置在生產環境中用的不多,因爲客戶端訪問web服務器默認用的都是80端口,客戶端並不知道服務器所配置的端口是什麼。
C、配置基於IP的虛擬主機:
1、 在Apache2.2上的配置如下:
(1) 爲當前虛擬機添加一個地址,IP的配置結果如下:
[root@centos named]# ifconfig eth1:1172.16.21.15 netmask 255.255.255.0 up [root@centos named]# ifconfig eth1 Link encap:Ethernet HWaddr00:0C:29:6B:87:DD inet addr:172.16.21.9 Bcast:172.16.21.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe6b:87dd/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:20878 errors:0 dropped:0 overruns:0 frame:0 TX packets:11524 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1798478 (1.7 MiB) TXbytes:1346141 (1.2 MiB) eth1:1 Link encap:Ethernet HWaddr00:0C:29:6B:87:DD inet addr:172.16.21.15 Bcast:172.16.21.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
(2) 在/var/named/webtest.com.zone區域解析文件中添加一條主機A記錄:
保存退出,並重新加載DNS的配置文件和區域解析文件;
(3) 編輯httpd.conf,找到虛擬主機配置段做如下配置:
<VirtualHost172.16.21.9:80> ServerName www.a.com DocumentRoot "/website/host1" </VirtualHost> <VirtualHost172.16.21.15:80> ServerName www.b.org DocumentRoot "/website/host2" </VirtualHost>
(4) 修改/website/host1/index.html和/website/host2/index.html,內容如下:
[root@centos named]# cat/website/host1/index.html <h1>www.a.com</h1> [root@centos named]# cat/website/host2/index.html <h3>www.b.org</h3>
(5) 重啓httpd服務並在windows客戶端的瀏覽器中進行訪問測試:
可以看到,因爲DNS輪巡的結果,我們事先了基於IP的虛擬主機;
說明:
基於IP的虛擬主機配置在生產環境中用的也不多,因爲公網IP日益短缺並且每分配一個公網IP接意味着多支付一筆昂貴的費用哈。
基於IP的虛擬主機是通過DNS的輪巡機制來實現的。
D. 配置基於主機名(FQDN)的虛擬主機:
正是因爲上面2中虛擬主機不常用,因此有了第三種虛擬主機;基於主機名的虛擬主機;
1、原理:
思考一個問題:我們在瀏覽器中輸入域名訪問網站,最終結果是域名被DNS解析成了IP地址,主機和主機之間只能通過IP來通信。如此不同的主機名對應同一個IP如何實現?
【答】:基於主機名(多個主機名對應一個IP)的虛擬主機,是通過HTTP協議中請求報文首部的Host屬性來實現的哈,因此也被稱作基於主機頭的虛擬主機。如圖所示:
2、 配置步驟:
(1) 編輯httpd.conf,找到虛擬主機配置段做如下配置:
說明:NameVirtualHost指令只用在Apache2.2及其以前的版本中,Apache2.4以後的版本就不需要該指令了。
(2) 創建網站目錄並提供默認主頁面文件:
(3) 在DNS的區域解析庫文件/var/named/webtest.com.zone中修改主機記錄文件,如下圖所示:
(4) 重啓DNS服務和httpd服務:
(5) 在windows客戶端的瀏覽器中測試結果:
查看訪問httpd.webtest.com的結果(用開發者工具(F12)查看消息頭信息):
說明:
1、基於主機名(FQDN)的虛擬主機是用的最多的一種虛擬主機。
2、對於Apache2.2及其以前的版本,基於主機名的虛擬主機的定義需要通過NameVirtualHost指令來定義,Apache2.4以後的版本則不需要。
3、基於主機名的虛擬主機是通過HTTP協議請求報文首部的Host屬性來實現的,故而也稱爲基於主機頭的虛擬主機
E. 配置混合類型的虛擬主機:
以上三種虛擬主機可以混合使用,具體過程如下:
(1) 定義監聽端口:
(2) 定義虛擬主機:
(3) 創建不同虛擬主機的完整根目錄及默認頁面:
(4) 修改DNS的區域解析文件/var/named/webtest.com.zone:
(5) 重啓DNS服務和httpd服務:
(6) 在windows客戶端的瀏覽器中測試結果:
基於主機名的虛擬機:
基於IP的虛擬主機:
基於端口號的虛擬主機:
F.爲基於端口號的虛擬主機配置基於組的訪問控制:
每個虛擬準基的配置互不影響,可以單獨爲指定的虛擬主機配置諸如日誌、用戶訪問控制等屬性。下面就以基於端口號的虛擬主機爲例,爲其配置基於組的訪問控制:
(1) 修改httpd.conf配置文件:
(2) 創建用戶認證文件:
[root@localhost /]# htpasswd -cm/etc/httpd/conf/.htpass Tom New password: Re-type new password: Adding password for user Tom [root@localhost /]# htpasswd -m/etc/httpd/conf/.htpass Johnson New password: Re-type new password: Adding password for user Johnson
(3) 創建組文件/website/vhost_PORT/.htgroup:
[root@localhost /]# vim/website/vhost_PORT/.htgroup [root@localhost /]# cat/website/vhost_PORT/.htgroup Employees:Tom Johnson
(4) 重讀httpd配置文件:service httpd reload
(5) 在windows客戶端主機上通過瀏覽器測試結果:
WinXP:
提供用戶名和密碼後就可以訪問了:
二、httpd的status(服務器狀態信息):
開啓原則:status在需要時纔開啓,就算需要開啓,也儘量以最少的信息輸出爲原則(因爲開啓status會影響服務器性能;)
開啓方法:通過status_module模塊允許Apache服務器生成狀態報告;
1、 查看當前Apache服務器是否啓用了mod_status模塊;
2、 status是通過容器類指令<Location /server-status></Location>來定義的,具體如下所示:
<Location /server-status> #Locaton容器類指令表示:我們要通過哪個URL路徑訪問下面定義的status(URL可以自定義) SetHandler server-status #server-status是處理器名稱,SetHandler指令用於設置處理器 AuthName "Status" #定義用戶訪問控制(服務器狀態信息不能讓所有人查看) AuthType Basic AuthUserFile /etc/httpd/conf/.statuspass Require valid-user </Location>
通過ExtendedStatus指令可以查看更爲詳細的status信息:
ExtendedStatus On|Off #開啓或關閉擴展的status信息(默認是關閉的)
3、 舉例說明:
(1) 編輯httpd.conf文件,啓用status_module模塊(默認就是啓用的,但最好確認一下):
(2) 找到<Loacation /server-status>,取消註釋:
(3) 保存退出後重讀配置文件:service httpd reload
(4) 在windows客戶端的瀏覽器中訪問/server-status:
(5) 開啓ExtendedStatus以查看更爲詳細的status信息:
(6) 保存退出並重讀httpd配置文件,然後在windows客戶端瀏覽器再次訪問server-status頁面:
說明:
1、服務器的status會影響服務器的性能,如果沒有必要建議關閉。就算需要開啓,也儘量讓其輸出最基本的信息;
2、服務器的status信息一般不允許所有用戶查看,因此建議設置用戶訪問控制;
三、Curl命令的使用:
curl是基於URL語法在命令行模式下工作的文件傳輸工具,它支持FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE及LDAP等協議。curl支持HTTPS認證,並且支持HTTP的POST、PUT等方法,FTP上傳,kerberos認證,HTTP上傳,代理服務器,cookies,用戶名/密碼認證,下載文件斷點續傳,上載文件斷點續傳,http代理服務器管道(proxy tunneling),甚至還支持IPv6,socks5代理服務器,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大(類似於迅雷,但curl還是一個基於命令行的瀏覽器)。
curl的常用選項: -A/--user-agent <string> 設置用戶代理髮送給服務器 -basic 使用HTTP基本驗證 --tcp-nodelay 使用TCP_NODELAY選項 -e/--referer <URL> 來源網址 --cacert <file> CA證書 (SSL) --compressed 要求返回是壓縮的形勢 -H/--header <line>自定義頭信息傳遞給服務器 -I/--head 只顯示響應報文首部信息 --limit-rate <rate> 設置傳輸速度 -u/--user <user[:password]>設置服務器的用戶和密碼 -0/--http1.0 使用HTTP 1.0
Example:
1、只顯示響應報文首部信息:
2、模擬Referer(從某個頁面跳轉過來):
四、httpd支持壓縮功能:
使用deflate_module模塊可以壓縮頁面以優化網絡傳輸速度:
<IfModule mod_deflate.c> # Restrict compression to these MIME types # 指定對某些MIME的格式文件進行壓縮 AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css # Level of compression (Highest 9 - Lowest 1) # 配置壓縮等級(1-9),9爲最高等級,壓縮比例最大,但消耗CPU資源也越多 DeflateCompressionLevel 9 # 對某些不支持壓縮的瀏覽器進行部分壓縮或不壓縮 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html </IfModule>
小結:
【httpd配置的注意點】;
1、 指令的分類:指令與容器類指令:
首字母大寫,形如ServerRoot “ ”被稱爲指令;
用一對尖括號括起來,形如:<Directory “FS_PATH”></Directory>被稱爲容器類指令
2、 指令的繼承性:
httpd的指令是由繼承性的,例如我們先定義了一個<Directory>容器類指令,如下所示:
<Directory "/website/htdocs"> Options Indexes FollowSymLinks #隨後,我們又定義了一個<Directory>容器類指令: <Directory "/website/htdocs/dowloads"> Options Indexes #這裏沒有顯式定義FollowSymLinks,會繼承上面的定義! # [+-] 指令: +FollowSymLinks明確添加該屬性 -FollowSymLinks明確說不使用該屬性
==========================================================
今天就學習到這裏吧,上面所寫只是我學習過程當中的一些,一些,筆記吧,難免出現錯誤,或者表述不正確的地方,請見諒!
============================================================