Web服务之四:httpd虚拟主机
Apache虛擬主機(jī)相關(guān)概念
若不考慮虛擬的話,安裝好Apache后可以提供一個(gè)網(wǎng)站或站點(diǎn)的運(yùn)行平臺(tái)給我們。需要注意的是,Apache本身不是一個(gè)站點(diǎn),只是一個(gè)運(yùn)行的服務(wù)器。這個(gè)服務(wù)器有時(shí)候又被稱為Host也被稱為物理主機(jī),它指的是服務(wù)器本身能夠運(yùn)行的站點(diǎn)。
那么為什么要用到虛擬主機(jī)呢?我們要想實(shí)現(xiàn)Web站點(diǎn)而且能夠在互聯(lián)網(wǎng)上被訪問(wèn),首先它得能夠運(yùn)行在一個(gè)操作系統(tǒng)上而且這個(gè)操作系統(tǒng)得運(yùn)行在一個(gè)物理主機(jī)上,這是第一個(gè)前提。所以它是一個(gè)主機(jī)如果想要在互聯(lián)網(wǎng)上能夠被訪問(wèn)那我們需要一個(gè)主機(jī)、一個(gè)IP地址、一個(gè)實(shí)時(shí)在線的服務(wù)器,那這需要多少資源呢?對(duì)于眾多小型站點(diǎn)來(lái)講,壓根用不上服務(wù)器,因?yàn)樗赡苊刻熘挥?、5個(gè)訪問(wèn)量,只需要能夠在線而已。如果我們?yōu)榱诉@一點(diǎn)需求投入這么大的資源去運(yùn)行這個(gè)站點(diǎn)的話,非常浪費(fèi)。因此我們期望能夠運(yùn)行虛擬機(jī)或虛擬PC一樣,能夠在一臺(tái)物理主機(jī)上虛擬出多個(gè)可以同時(shí)運(yùn)行的站點(diǎn)或主機(jī)。
假設(shè)我們運(yùn)行了一個(gè)Apache進(jìn)程或服務(wù),但這個(gè)服務(wù)運(yùn)行起來(lái)之后,能夠服務(wù)于多個(gè)不同的站點(diǎn),這就意味著我們通過(guò)同一個(gè)主機(jī)訪問(wèn)多個(gè)不同的站點(diǎn),它們打開(kāi)展示的資源是不同的,而且對(duì)于終端用戶來(lái)講,它們意識(shí)不到這是個(gè)虛擬主機(jī),甚至于它能夠完全認(rèn)為這是一臺(tái)運(yùn)行的獨(dú)立的物理服務(wù)器,所以我們稱之為虛擬主機(jī)。
對(duì)于Apache而言,虛擬主機(jī)有兩類,若不使用虛擬主機(jī)的這臺(tái)主機(jī)稱為中心主機(jī)或核心主機(jī),如果一旦啟用了虛擬主機(jī),就稱為虛擬主機(jī),一般來(lái)講,中心主機(jī)與虛擬主機(jī)不能同時(shí)啟用。而且,如果此前有中心主機(jī)的話,如果想保留站點(diǎn)的話,那么我們只能把中心主機(jī)也定義成一個(gè)虛擬主機(jī)來(lái)使用了。但我們又知道,對(duì)于一臺(tái)服務(wù)器而言,它的某些資源是有限的,如IP地址、80端口等,對(duì)于TCP來(lái)講80端口只有一個(gè),而如何定義每一個(gè)不同的主機(jī)呢?對(duì)于一個(gè)Web服務(wù)器而言,怎么去定義Web服務(wù)器呢?用戶訪問(wèn)的是"IP:PORT/RESOURCE",于是IP:PORT就定義了一臺(tái)主機(jī),而如果說(shuō)想使用多個(gè)不同的主機(jī),就有幾種類型:
- 基于IP:每一個(gè)主機(jī)使用不同的地址,但它們的端口一致;
- 基于端口:對(duì)于同一個(gè)IP地址,使用不同的端口;但很多時(shí)候訪問(wèn)站點(diǎn)時(shí),都是使用默認(rèn)的80端口,一旦換了端口對(duì)方就不知道使用的是哪個(gè)端口了,因此較常用的就是基于IP的了,但是IP地址是一種稀缺資源,況且一個(gè)IP地址一年的使用費(fèi)用也是不菲的,對(duì)于小站點(diǎn)來(lái)講也沒(méi)有必要占用IP地址,因此我們可以通過(guò)基于域名實(shí)現(xiàn)虛擬主機(jī);
- 基于域名:IP、端口都相同,當(dāng)每一個(gè)不同站點(diǎn)其主機(jī)名不一樣,如www.test.com、www.a.org、www.b.net,這三個(gè)主機(jī)都解析到同一個(gè)IP地址上,但它們的主機(jī)名各不相同;
?
我們?cè)賮?lái)考慮一個(gè)問(wèn)題,若三個(gè)站點(diǎn)放在同一個(gè)主機(jī)上,而且都解析到同一個(gè)IP上,那么兩個(gè)不同的客戶端訪問(wèn)時(shí),它們?cè)L問(wèn)的為什么不是同一個(gè)站點(diǎn)呢?要知道,Web會(huì)話的建立除了TCP/IP協(xié)議之外,還有http協(xié)議,而http協(xié)議有一個(gè)首部叫HOST,在HOST中表明了我們請(qǐng)求的主機(jī)或主機(jī)名,通過(guò)http協(xié)議附帶的內(nèi)容判斷用戶請(qǐng)求的到底是哪一個(gè)主機(jī)或站點(diǎn),所以哪怕IP地址和端口號(hào)都一樣也照樣能夠使用不同的虛擬主機(jī)。
需要注意的是在Apache2.2的時(shí)候,需要一個(gè)特殊的指令啟用基于主機(jī)名的虛擬主機(jī),這個(gè)指令叫NameVirtualHost,而Apache2.4時(shí)不需要。
?
一個(gè)站點(diǎn)最核心的應(yīng)具備的東西:
(如在一個(gè)物理機(jī)上提供了兩個(gè)不同的站點(diǎn),而每一個(gè)站點(diǎn)獨(dú)立具有的資源或者配置甚至是信息應(yīng)該有哪些呢?)
- DocumentRoot:首先這個(gè)網(wǎng)站提供的網(wǎng)頁(yè)可能不一樣那么很有可能位于不同的目錄下即DocumentRoot不同;
- ServerName:此外,如果是基于IP的主機(jī)那么IP應(yīng)該不同,如果是基于端口的主機(jī)端口應(yīng)該不同,如果是基于主機(jī)名的主機(jī)主機(jī)名應(yīng)該不同。因此一個(gè)主機(jī)應(yīng)該有其主機(jī)名;
- <Directory>容器:每一個(gè)用戶的DocumentRoot允許哪些人訪問(wèn)是否需要進(jìn)行認(rèn)證等,沒(méi)一個(gè)站點(diǎn)都可能不同,因此對(duì)于不同站點(diǎn)若需要認(rèn)證應(yīng)該封裝不同的<Directory "">容器;
- 別名:此外,虛擬主機(jī)還能使用別名(路徑別名,Alias)與ServerAlias(服務(wù)器別名,指的是主機(jī)名的別名)等;
- ...
虛擬主機(jī)可定義的屬性:
<Location "/images"></Location>:<Location>與<Directory>一樣,Directory是用來(lái)封裝定義用戶訪問(wèn)本地文件系統(tǒng)目錄下的文件的時(shí)候應(yīng)該具有什么樣的屬性,但最后可能有一些映射關(guān)系。而Location則是用來(lái)定義URL的,就是IP:PORT后的路徑如果是images/,訪問(wèn)其中所有的資源時(shí),它應(yīng)該具有什么樣權(quán)限,或者可以使用什么樣的方法的。而Location對(duì)于虛擬主機(jī)來(lái)講也是可以用的,明確說(shuō)明對(duì)于當(dāng)前的虛擬主機(jī),它的某一個(gè)Location應(yīng)該怎樣被使用。如:/images目錄下的所有文件只允許GET方法其它任何方法都不支持。
除此之外ScriptAlias是允許執(zhí)行CGI腳本的目錄的。而一個(gè)虛擬主機(jī)也可以使用ScriptAlias,明確說(shuō)明當(dāng)前主機(jī)所允許執(zhí)行的腳本目錄在哪。
?
CGI與動(dòng)態(tài)網(wǎng)站:
我們?cè)賮?lái)回顧一下CGI,CGI(Common Gateway Interface)是一種協(xié)議,有了CGI技術(shù),那么我們的服務(wù)器上的Apache進(jìn)程就能通過(guò)CGI協(xié)議啟動(dòng)另外一個(gè)進(jìn)程,這個(gè)進(jìn)程能夠執(zhí)行一段腳本或程序,并且執(zhí)行的程序還能夠通過(guò)CGI協(xié)議將結(jié)果返回給Apache進(jìn)程。
而動(dòng)態(tài)網(wǎng)站可分為兩類:
- 客戶端動(dòng)態(tài):
把程序放在網(wǎng)站上,用戶訪問(wèn)的時(shí)候這個(gè)程序或程序的源文件時(shí)這個(gè)程序先被下載到本地,在用戶本地執(zhí)行。所以對(duì)于不同的用戶來(lái)講訪問(wèn)的結(jié)果可能是不同的。這樣做有一個(gè)弊端,若在網(wǎng)站上放了一個(gè)惡意指令就是讓客戶端格式化磁盤(pán),用戶下載到本地執(zhí)行,會(huì)對(duì)客戶端產(chǎn)生危害,所以客戶端動(dòng)態(tài)有著極大的不安全性。還有客戶端動(dòng)態(tài)的適用性不強(qiáng),如:開(kāi)發(fā)了一個(gè)Java腳本,客戶端沒(méi)有安裝Java運(yùn)行環(huán)境,就不能運(yùn)行起來(lái)。
- 服務(wù)器端動(dòng)態(tài):
基于CGI技術(shù)實(shí)現(xiàn),動(dòng)態(tài)則表示是需要執(zhí)行程序的,而Apache本身只能解析HTML或簡(jiǎn)單的文本文件,腳本需要各自各自的解釋器執(zhí)行。
?
虛擬主機(jī)的定義:
虛擬主機(jī)與中心主機(jī)不能同時(shí)使用,因此使用虛擬主機(jī)前需要先取消中心主機(jī),注釋中心主機(jī)的DocumentRoot即可。
<VirtualHost HOST></VirtualHost>
HOST的寫(xiě)法:
- 基于IP
IP:PORT,如:IP1:80、IP2:80
- 基于端口:
IP:80
IP:8080
- 基于主機(jī)名:
IP:80(表示當(dāng)前主機(jī)上所有的IP都監(jiān)聽(tīng),使用*:80)
ServerName一定要不同
?
基于IP地址的虛擬主機(jī)的實(shí)現(xiàn)
取消中心主機(jī),注釋DocumentRoot即可:
可在此文件中定義VirtualHost,也可以單獨(dú)建立一個(gè)文件來(lái)定義,單獨(dú)建立一個(gè)文件管理起來(lái)更方便。
此處單獨(dú)建立一個(gè)文件用于定義VirtualHost:
?
?
為IP地址添加別名當(dāng)做第二個(gè)IP地址使用:
第二個(gè)是輔助性的地址
測(cè)試:
基于端口的虛擬主機(jī)的實(shí)現(xiàn):
?
監(jiān)聽(tīng)端口:
基于主機(jī)名的虛擬主機(jī)的實(shí)現(xiàn)
啟用NameVirtualHost,并指定監(jiān)聽(tīng)在哪個(gè)地址上的主機(jī)將會(huì)使用VirtualHost,*:80表示所有地址
?
編輯Windows物理機(jī)的host文件或搭建DNS服務(wù)器以解析主機(jī)名,此處為方便使用編輯主機(jī)名的方式:
若使用IP地址訪問(wèn),將返回符合基于名稱的虛擬主機(jī)的第一個(gè):
?
以上三種方式的虛擬主機(jī)訪問(wèn)的錯(cuò)誤虛擬主機(jī)訪問(wèn)的錯(cuò)誤日志都放在/var/log/httpd/error_log中,訪問(wèn)日志都放在/var/log/httpd/access_log中。
?
自定義日志
若想不同的站點(diǎn)使用不同的日志,需要各自定義:
?
報(bào)錯(cuò)是因?yàn)槿罩疚募磩?chuàng)建:
確保SELinux為啟用:
刷新瀏覽器,查看對(duì)應(yīng)的日志文件:
?
實(shí)現(xiàn)虛擬主機(jī)的訪問(wèn)控制 :
- 對(duì)于d.gov這個(gè)站點(diǎn)拒絕192.168.241.1訪問(wèn),只拒絕這一主機(jī)的訪問(wèn):
此時(shí)使用物理機(jī)(192.168.241.1)無(wú)法訪問(wèn);
其它主機(jī)正常訪問(wèn):
- 期望訪問(wèn)a.org時(shí)需要用戶提供賬號(hào)密碼:
通過(guò)www.apache.org或在本機(jī)安裝manual學(xué)習(xí)指令:
定義默認(rèn)虛擬主機(jī)
當(dāng)用戶指定不存在的虛擬主機(jī)或使用IP地址時(shí)不想訪問(wèn)第一個(gè)或名稱解析的結(jié)果是沒(méi)有這個(gè)主機(jī)名,可通過(guò)配置默認(rèn)主機(jī)實(shí)現(xiàn):
需要注意的是:此項(xiàng)需要定義在前面,即基于名稱虛擬主機(jī)的第一個(gè);
修改系統(tǒng)上默認(rèn)URL的修改,實(shí)現(xiàn)系統(tǒng)上開(kāi)放Server Status
ServerHandler:實(shí)現(xiàn)讓所有匹配到的文件都能有一個(gè)處理器處理,Handler是調(diào)用某個(gè)文件是應(yīng)該執(zhí)行的動(dòng)作,具體的動(dòng)作對(duì)于不同場(chǎng)景來(lái)講是不同的,比如server-status是Apache內(nèi)置的一個(gè)動(dòng)作,具體參見(jiàn)文檔;
?
轉(zhuǎn)載于:https://www.cnblogs.com/long-cnblogs/p/10573533.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Web服务之四:httpd虚拟主机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 运动神经元病属于哪一类的疾病?
- 下一篇: oracle里的查询转换