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