HTTP权威指南记录 ---- Web服务器
Web服務(wù)器
Web服務(wù)器的實(shí)現(xiàn)
Web服務(wù)器會(huì)對(duì)HTTP請(qǐng)求進(jìn)行處理并提供響應(yīng)。術(shù)語(yǔ)"Web服務(wù)器"可以用來(lái)表示W(wǎng)eb服務(wù)器的軟件,也可以用來(lái)表示提供Web頁(yè)面的特定設(shè)備或計(jì)算機(jī)。
Web服務(wù)器實(shí)現(xiàn)了HTTP和相關(guān)的TCP連接處理。負(fù)責(zé)管理Web服務(wù)器提供的資源,以及對(duì)Web服務(wù)器的配置、控制及擴(kuò)展方面的管理。Web服務(wù)器邏輯實(shí)現(xiàn)了HTTP協(xié)議、管理著Web 資源,并負(fù)責(zé)提供We 服務(wù)器的管理功能。Web服務(wù)器邏輯和操作系統(tǒng)共同負(fù)責(zé)管理TCP連接。底層操作系統(tǒng)負(fù)責(zé)管理底層計(jì)算機(jī)系統(tǒng)的硬件細(xì)節(jié),并提供了TCP/IP網(wǎng)絡(luò)支持、負(fù)責(zé)裝載Web資源的文件系統(tǒng)以及控制當(dāng)前計(jì)算活動(dòng)的進(jìn)程管理功能。
Web 服務(wù)器有各種不同的形式。
- 可以在標(biāo)準(zhǔn)的計(jì)算機(jī)系統(tǒng)上安裝并運(yùn)行通用軟件Web服務(wù)器:通用的軟件Web服務(wù)器都運(yùn)行在標(biāo)準(zhǔn)的、有網(wǎng)絡(luò)功能的計(jì)算機(jī)系統(tǒng)上。可以選擇開(kāi)源軟件(比如Apache)或者商業(yè)軟件(比如微軟的IIS)。基本上所有的計(jì)算機(jī)和操作系統(tǒng)中都有可用的Web服務(wù)器軟件。
- 如果不想那么麻煩地去安裝軟件,可以買一臺(tái)Web服務(wù)器設(shè)備:通常會(huì)是一臺(tái)安裝在時(shí)髦機(jī)架上的計(jì)算機(jī),里面的軟件會(huì)預(yù)裝并配置好,是預(yù)先打包好的軟硬件解決方案。廠商會(huì)在他們選擇的計(jì)算機(jī)平臺(tái)上預(yù)先安裝好軟件服務(wù)器,并將軟件配置好。應(yīng)用解決方案不再需要安裝及配置軟件,通常可以極大地簡(jiǎn)化管理工作。但是,Web服務(wù)器通常不太靈活,特性不太豐富,而且服務(wù)器硬件也不太容易重用或升級(jí)。
- 隨著微處理器奇跡般地出現(xiàn),有些公司甚至可以在少量計(jì)算機(jī)芯片上實(shí)現(xiàn)嵌入式Web服務(wù)器,使其成為完美的(便攜式)消費(fèi)類設(shè)備管理控制臺(tái):嵌入式服務(wù)器是要嵌入到消費(fèi)類產(chǎn)品(比如打印機(jī)或家用設(shè)備)中去的小型Web服務(wù)器。嵌入式Web服務(wù)器允許用戶通過(guò)便捷的Web瀏覽器接口來(lái)管理其消費(fèi)者設(shè)備。有些嵌入式Web服務(wù)器甚至可以在小于一平方英寸的空間內(nèi)實(shí)現(xiàn),但通常只能提供最小特性功能集。
Web服務(wù)器會(huì)做些什么
- 建立連接:接受一個(gè)客戶端連接,或者如果不希望與這個(gè)客戶端建立連接,就將其關(guān)閉。
- 接收請(qǐng)求:從網(wǎng)絡(luò)中讀取一條HTTP請(qǐng)求報(bào)文。
- 處理請(qǐng)求:對(duì)請(qǐng)求報(bào)文進(jìn)行解釋,并采取行動(dòng)。
- 訪問(wèn)資源:訪問(wèn)報(bào)文中指定的資源。
- 構(gòu)建響應(yīng):創(chuàng)建帶有正確首部的HTTP響應(yīng)報(bào)文。
- 發(fā)送響應(yīng):將響應(yīng)回送給客戶端。
- 記錄日志:將與已完成事務(wù)有關(guān)的內(nèi)容記錄在一個(gè)日志文件中。
接受客戶端鏈接
如果客戶端已經(jīng)打開(kāi)了一條到服務(wù)器的持久連接,可以使用那條連接來(lái)發(fā)送它的請(qǐng)求。否則,客戶端需要打開(kāi)一條新的到服務(wù)器的連接。
處理新連接
客戶端請(qǐng)求一條到Web服務(wù)器的TCP連接時(shí),Web服務(wù)器會(huì)建立連接,判斷連接的另一端是哪個(gè)客戶端,從TCP連接中將IP地址解析出來(lái)。一旦新連接建立起來(lái)并被接受,服務(wù)器就會(huì)將新連接添加到其現(xiàn)存Web服務(wù)器連接列表中,做好監(jiān)視連接上數(shù)據(jù)傳輸?shù)臏?zhǔn)備。Web服務(wù)器可以隨意拒絕或立即關(guān)閉任意一條連接。有些Web服務(wù)器會(huì)因?yàn)榭蛻舳薎P地址或主機(jī)名是未認(rèn)證的,或者因?yàn)樗且阎膼阂饪蛻舳硕P(guān)閉連接。Web服務(wù)器也可以使用其他識(shí)別技術(shù)。
客戶端主機(jī)名識(shí)別
可以用"反向域名解析"對(duì)大部分Web服務(wù)器進(jìn)行配置,以便將客戶端IP地址轉(zhuǎn)換成客戶端主機(jī)名。Web服務(wù)器可以將客戶端主機(jī)名用于詳細(xì)的訪問(wèn)控制和日志記錄。但要注意的是,主機(jī)名查找可能會(huì)花費(fèi)很長(zhǎng)時(shí)間,這樣會(huì)降低Web事務(wù)處理的速度。很多大容量Web服務(wù)器要么會(huì)禁止主機(jī)名解析,要么只允許對(duì)特定內(nèi)容進(jìn)行解析。
確定客戶端用戶
有些Web服務(wù)器還支持IETF的ident協(xié)議。服務(wù)器可以通過(guò)ident協(xié)議找到發(fā)起HTTP連接的用戶名。這些信息對(duì)Web服務(wù)器的日志記錄特別有用——流行的通用日志格式(Common Log Format)的第二個(gè)字段中就包含了每條HTTP請(qǐng)求的ident用戶名。如果客戶端支持ident協(xié)議,就在TCP端口113上監(jiān)聽(tīng)ident請(qǐng)求。
ident在組織內(nèi)部可以很好地工作,但出于多種原因,在公共因特網(wǎng)上并不能很好地工作,原因包括:
- 很多客戶端PC沒(méi)有運(yùn)行ident識(shí)別協(xié)議守護(hù)進(jìn)程軟件;
- ident協(xié)議會(huì)使HTTP事務(wù)處理產(chǎn)生嚴(yán)重的時(shí)延;
- 很多防火墻不允許ident流量進(jìn)入;
- ident協(xié)議不安全,容易被偽造;
- ident協(xié)議也不支持虛擬IP地址;
- 暴露客戶端的用戶名還涉及隱私問(wèn)題。
接收請(qǐng)求報(bào)文
連接上有數(shù)據(jù)到達(dá)時(shí),Web服務(wù)器會(huì)從網(wǎng)絡(luò)連接中讀取數(shù)據(jù),并將請(qǐng)求報(bào)文中的內(nèi)容解析出來(lái)。解析請(qǐng)求報(bào)文時(shí),Web服務(wù)器會(huì)不定期地從網(wǎng)絡(luò)上接收輸入數(shù)據(jù)。網(wǎng)絡(luò)連接可能隨時(shí)都會(huì)出現(xiàn)延遲。Web服務(wù)器需要從網(wǎng)絡(luò)中讀取數(shù)據(jù),將部分報(bào)文數(shù)據(jù)臨時(shí)存儲(chǔ)在內(nèi)存中,直到收到足以進(jìn)行解析的數(shù)據(jù)并理解其意義為止。
解析請(qǐng)求報(bào)文時(shí),Web服務(wù)器會(huì):
- 解析請(qǐng)求行,查找請(qǐng)求方法、指定的URI以及版本號(hào),各項(xiàng)之 間由一個(gè)空格分隔,并以一個(gè)CRLF序列作為行的結(jié)束;
- 檢測(cè)到以CRLF結(jié)尾的、標(biāo)識(shí)首部結(jié)束的空行(如果有的話);
- 如果有的話(長(zhǎng)度由Content-Length首部指定),讀取請(qǐng)求主體。
報(bào)文的內(nèi)部表示法
有些Web服務(wù)器還會(huì)用便于進(jìn)行報(bào)文操作的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)請(qǐng)求報(bào)文。比如,數(shù)據(jù)結(jié)構(gòu)中可能包含有指向請(qǐng)求報(bào)文中各個(gè)片段的指針及其長(zhǎng)度,這樣就可以將這些首部存放在一個(gè)快速查詢表中,以便快速訪問(wèn)特定首部的具體值了
連接的輸入/輸出處理結(jié)構(gòu)
高性能的Web服務(wù)器能夠同時(shí)支持?jǐn)?shù)千條連接。這些連接使得服務(wù)器可以與世界各地的客戶端進(jìn)行通信,每個(gè)客戶端都向服務(wù)器打開(kāi)了一條或多條連接。某些連接可能在快速地向Web服務(wù)器發(fā)送請(qǐng)求,而其他一些連接則可能在慢慢發(fā)送,或者不經(jīng)常發(fā)送請(qǐng)求,還有一些可能是空閑的,安靜地等待著將來(lái)可能出現(xiàn)的動(dòng)作。因?yàn)檎?qǐng)求可能會(huì)在任意時(shí)刻到達(dá),所以Web服務(wù)器會(huì)不停地觀察有無(wú)新的Web請(qǐng)求。不同的Web服務(wù)器結(jié)構(gòu)會(huì)以不同的方式為請(qǐng)求服務(wù)。
- 單線程Web服務(wù)器:單線程的Web服務(wù)器一次只處理一個(gè)請(qǐng)求,直到其完成為止。一個(gè)事務(wù)處理結(jié)束之后,才去處理下一條連接。這種結(jié)構(gòu)易于實(shí)現(xiàn),但在處理過(guò)程中,所有其他連接都會(huì)被忽略。這樣會(huì)造成嚴(yán)重的性能問(wèn)題,只適用于低負(fù)荷的服務(wù)器,以及診斷工具。
- 多進(jìn)程及多線程Web服務(wù)器:多進(jìn)程和多線程Web服務(wù)器用多個(gè)進(jìn)程,或更高效的線程同時(shí)對(duì)請(qǐng)求進(jìn)行處理。可以根據(jù)需要?jiǎng)?chuàng)建,或者預(yù)先創(chuàng)建一些線程/進(jìn)程。有些服務(wù)器會(huì)為每條連接 分配一個(gè)線程/進(jìn)程,但當(dāng)服務(wù)器同時(shí)要處理成百、上千,甚至數(shù)以萬(wàn)計(jì)的連接 時(shí),需要的進(jìn)程或線程數(shù)量可能會(huì)消耗太多的內(nèi)存或系統(tǒng)資源。因此,很多多線 程Web服務(wù)器都會(huì)對(duì)線程/進(jìn)程的最大數(shù)量進(jìn)行限制。
- 復(fù)用I/O的服務(wù)器:為了支持大量的連接,很多Web服務(wù)器都采用了復(fù)用結(jié)構(gòu)。在復(fù)用結(jié)構(gòu)中,要同時(shí)監(jiān)視所有連接上的活動(dòng)。當(dāng)連接的狀態(tài)發(fā)生變化時(shí)(比如,有數(shù)據(jù)可用,或出現(xiàn)錯(cuò)誤時(shí)),就對(duì)那條連接進(jìn)行少量的處理;處理結(jié)束之后,將連接返回到開(kāi)放連接列表中,等待下一次狀態(tài)變化。只有在有事情可做時(shí)才會(huì)對(duì)連接進(jìn)行處理;在空閑連接上等待的時(shí)候并不會(huì)綁定線程和進(jìn)程。
- 復(fù)用的多線程Web服務(wù)器:有些系統(tǒng)會(huì)將多線程和復(fù)用功能結(jié)合在一起,以利用計(jì)算機(jī)平臺(tái)上的多個(gè)CPU。多個(gè)線程(通常是一個(gè)物理處理器)中的每一個(gè)都在觀察打開(kāi)的連接(或打開(kāi)的連接中的一個(gè)子集),并對(duì)每條連接執(zhí)行少量的任務(wù)。
處理請(qǐng)求
一旦Web服務(wù)器收到了請(qǐng)求,就可以根據(jù)方法、資源、首部和可選的主體部分來(lái)對(duì)請(qǐng)求進(jìn)行處理了。有些方法(比如POST)要求請(qǐng)求報(bào)文中必須帶有實(shí)體主體部分的數(shù)據(jù)。其他一些方法(比如OPTIONS)允許有請(qǐng)求的主體部分,也允許沒(méi)有。少數(shù)方法(比如GET)禁止在請(qǐng)求報(bào)文中包含實(shí)體的主體數(shù)據(jù)。
對(duì)資源的映射及訪問(wèn)
Web服務(wù)器是資源服務(wù)器。它們負(fù)責(zé)發(fā)送預(yù)先創(chuàng)建好的內(nèi)容(比如HTML頁(yè)面或JPEG圖片),以及運(yùn)行在服務(wù)器上的資源生成程序所產(chǎn)生的動(dòng)態(tài)內(nèi)容。在Web服務(wù)器將內(nèi)容傳送給客戶端之前,要將請(qǐng)求報(bào)文中的URI映射為Web服務(wù) 器上適當(dāng)?shù)膬?nèi)容或內(nèi)容生成器,以識(shí)別出內(nèi)容的源頭。
文檔的根目錄
Web服務(wù)器支持各種不同類型的資源映射,但最簡(jiǎn)單的資源映射形式就是用請(qǐng)求URI作為名字來(lái)訪問(wèn)Web服務(wù)器文件系統(tǒng)中的文件。通常,Web服務(wù)器的文件系統(tǒng)中會(huì)有一個(gè)特殊的文件夾專門用于存放Web內(nèi)容。這個(gè)文件夾被稱為文檔的根目錄(document root)。Web服務(wù)器從請(qǐng)求報(bào)文中獲取URI,并將其附加在文檔根目錄的后面。
目錄列表
Web服務(wù)器可以接收對(duì)目錄URL的請(qǐng)求,其路徑可以解析為一個(gè)目錄,而不是文件。我們可以對(duì)大多數(shù)Web服務(wù)器進(jìn)行配置,使其在客戶端請(qǐng)求目錄URL時(shí)采取不同的動(dòng)作。大多數(shù)Web服務(wù)器都會(huì)去查找目錄中一個(gè)名為"index.html"或"index.htm"的文件來(lái)代表此目錄。如果用戶請(qǐng)求的是一個(gè)目錄的URL,而且這個(gè)目錄中有一個(gè)名為"index.html"或"index.htm"的文件,服務(wù)器就會(huì)返回那個(gè)文件的內(nèi)容。
- 返回一個(gè)錯(cuò)誤。
- 不返回目錄,返回一個(gè)特殊的默認(rèn)"索引文件"。
- 掃描目錄,返回一個(gè)包含目錄內(nèi)容的HTML頁(yè)面。
動(dòng)態(tài)內(nèi)容資源的映射
Web服務(wù)器還可以將URI映射為動(dòng)態(tài)資源——也就是說(shuō),映射到按需動(dòng)態(tài)生成內(nèi)容的程序上去。實(shí)際上,有一大類名為應(yīng)用程序服務(wù)器的Web服務(wù)器會(huì)將Web服務(wù)器連接到復(fù)雜的后端應(yīng)用程序上去。Web服務(wù)器要能夠分辨出資源什么時(shí)候是動(dòng)態(tài)的,動(dòng)態(tài)內(nèi)容生成程序位于何處,以及如何運(yùn)行那個(gè)程序。大多數(shù)Web服務(wù)器都提供了一些基本的機(jī)制以識(shí)別和映射動(dòng)態(tài)資源。
CGI是早期出現(xiàn)的一種簡(jiǎn)單、流行的服務(wù)端應(yīng)用程序執(zhí)行接口。現(xiàn)代的應(yīng)用程序服務(wù)器都有更強(qiáng)大更有效的服務(wù)端動(dòng)態(tài)內(nèi)容支持機(jī)制,包括ASP(Active Server Page)和Java servlet。
服務(wù)器端包含項(xiàng)
很多Web服務(wù)器還提供了對(duì)服務(wù)器端包含項(xiàng)(SSI)的支持。如果某個(gè)資源被標(biāo)識(shí)為存在服務(wù)器端包含項(xiàng),服務(wù)器就會(huì)在將其發(fā)送給客戶端之前對(duì)資源內(nèi)容進(jìn)行處理。要對(duì)內(nèi)容進(jìn)行掃描,以查找(通常包含在特定HTML注釋中的)特定的模板,這些模板可以是變量名,也可以是嵌入式腳本。可以用變量的值或可執(zhí)行腳本的輸出來(lái)取代特定的模板。這是創(chuàng)建動(dòng)態(tài)內(nèi)容的一種簡(jiǎn)便方式。
訪問(wèn)控制
Web服務(wù)器還可以為特定資源進(jìn)行訪問(wèn)控制。有請(qǐng)求到達(dá),要訪問(wèn)受控資源時(shí),Web服務(wù)器可以根據(jù)客戶端的IP地址進(jìn)行訪問(wèn)控制,也可以要求輸入密碼來(lái)訪問(wèn)資源。
構(gòu)建響應(yīng)
一旦Web服務(wù)器識(shí)別出了資源,就執(zhí)行請(qǐng)求方法中描述的動(dòng)作,并返回響應(yīng)報(bào)文。響應(yīng)報(bào)文中包含有響應(yīng)狀態(tài)碼、響應(yīng)首部,如果生成了響應(yīng)主體的話,還包括響應(yīng)主體。
響應(yīng)實(shí)體
如果事務(wù)處理產(chǎn)生了響應(yīng)主體,就將內(nèi)容放在響應(yīng)報(bào)文中回送過(guò)去。
如果有響應(yīng)主體的話,響應(yīng)報(bào)文中通常包括:
- 描述了響應(yīng)主體MIME類型的Content-Type首部;
- 描述了響應(yīng)主體長(zhǎng)度的Content-Length首部;
- 實(shí)際報(bào)文的主體內(nèi)容。
MIME類型
Web服務(wù)器要負(fù)責(zé)確定響應(yīng)主體的MIME類型。有很多配置服務(wù)器的方法可以將MIME類型與資源關(guān)聯(lián)起來(lái)。Web服務(wù)器可以用文件的擴(kuò)展名來(lái)說(shuō)明MIME類型。Web服務(wù)器會(huì)為每個(gè)資源掃描一個(gè)包含了所有擴(kuò)展名的MIME類型的文件,以確定其MIME類型。還可以通過(guò)配置Web服務(wù)器,將特定的文件與MIME類型相關(guān)聯(lián)。
- 魔法分類:Web服務(wù)器可以掃描每個(gè)資源的內(nèi)容,并將其與一個(gè)已知模式表(被稱為魔法文件)進(jìn)行匹配,以決定每個(gè)文件的MIME類型。這樣做可能比較慢,但很方便,尤其是文件沒(méi)有標(biāo)準(zhǔn)擴(kuò)展名的時(shí)候。
- 顯式分類:可以對(duì)Web服務(wù)器進(jìn)行配置,使其不考慮文件的擴(kuò)展名或內(nèi)容,強(qiáng)制特定文件或目錄內(nèi)容擁有某個(gè)MIME類型。
- 類型協(xié)商:有些Web服務(wù)器經(jīng)過(guò)配置,可以以多種文檔格式來(lái)存儲(chǔ)資源。在這種情況下,可以配置Web服務(wù)器,使其可以通過(guò)與用戶的協(xié)商來(lái)決定使用哪種格式(及相關(guān)的 MIME 類型)"最好"。
重定向
Web服務(wù)器有時(shí)會(huì)返回重定向響應(yīng)而不是成功的報(bào)文。Web服務(wù)器可以將瀏覽器重定向到其他地方來(lái)執(zhí)行請(qǐng)求。重定向響應(yīng)由返回碼3XX說(shuō)明。Location響應(yīng)首部包含了內(nèi)容的新地址或優(yōu)選地址的URI。
重定向可用于下列情況。
- 永久搬離的資源:資源可能已經(jīng)被移動(dòng)到了新的位置,或者被重新命名,有了一個(gè)新的URL。Web服務(wù)器可以告訴客戶端資源已經(jīng)被重命名了,這樣客戶端就可以在從新地址獲取資源之前,更新書簽之類的信息了。狀態(tài)碼"301 Moved Permanently"就用于此類重定向。
- 臨時(shí)搬離的資源:如果資源被臨時(shí)移走或重命名了,服務(wù)器可能希望將客戶端重定向到新的位置上去。但由于重命名是臨時(shí)的,所以服務(wù)器希望客戶端將來(lái)還可以回頭去使用老的URL,不要對(duì)書簽進(jìn)行更新。狀態(tài)碼"303 See Other"以及狀態(tài)碼"307 Temporary Redirect"就用于此類重定向。
- URL 增強(qiáng):服務(wù)器通常用重定向來(lái)重寫URL,往往用于嵌入上下文。當(dāng)請(qǐng)求到達(dá)時(shí),服務(wù)器會(huì)生成一個(gè)新的包含了嵌入式狀態(tài)信息的URL,并將用戶重定向到這個(gè)新的URL上去。客戶端會(huì)跟隨這個(gè)重定向信息,重新發(fā)起請(qǐng)求,但這次的請(qǐng)求會(huì)包含完整的、經(jīng)過(guò)狀態(tài)增強(qiáng)的URL。這是在事務(wù)間維護(hù)狀態(tài)的一種有效方式。狀態(tài)碼"303 See Other"和"307 Temporary Redirect"用于此類重定向。
- 負(fù)載均衡:如果一個(gè)超載的服務(wù)器收到一條請(qǐng)求,服務(wù)器可以將客戶端重定向到一個(gè)負(fù)載不太重的服務(wù)器上去。狀態(tài)碼"303 See Other"和"307 Temporary Redirect"可用于此類重定向。
- 服務(wù)器關(guān)聯(lián):Web服務(wù)器上可能會(huì)有某些用戶的本地信息;服務(wù)器可以將客戶端重定向到包含了那個(gè)客戶端信息的服務(wù)器上去。狀態(tài)碼"303 See Other"和"307 Temporary Redirect"可用于此類重定向。
- 規(guī)范目錄名稱:客戶端請(qǐng)求的URI是一個(gè)不帶尾部斜線的目錄名時(shí),大多數(shù)Web服務(wù)器都會(huì)將客戶端重定向到一個(gè)加了斜線的URI上,這樣相對(duì)鏈接就可以正常工作了。
發(fā)送響應(yīng)
Web服務(wù)器通過(guò)連接發(fā)送數(shù)據(jù)時(shí)也會(huì)面臨與接收數(shù)據(jù)一樣的問(wèn)題。服務(wù)器可能有很多條到各個(gè)客戶端的連接,有些是空閑的,有些在向服務(wù)器發(fā)送數(shù)據(jù),還有一些在向客戶端回送響應(yīng)數(shù)據(jù)。服務(wù)器要記錄連接的狀態(tài),還要特別注意對(duì)持久連接的處理。對(duì)非持久連接而言,服務(wù)器應(yīng)該在發(fā)送了整條報(bào)文之后,關(guān)閉自己這一端的連接。對(duì)持久連接來(lái)說(shuō),連接可能仍保持打開(kāi)狀態(tài),在這種情況下,服務(wù)器要特別小心,要正確地計(jì)算Content-Length首部,不然客戶端就無(wú)法知道響應(yīng)什么時(shí)候結(jié)束了。
記錄事務(wù)處理過(guò)程
最后,當(dāng)事務(wù)結(jié)束時(shí),Web服務(wù)器會(huì)在日志文件中添加一個(gè)條目,來(lái)描述已執(zhí)行的事務(wù)。
轉(zhuǎn)載于:https://juejin.im/post/5bd0361951882577c758d321
總結(jié)
以上是生活随笔為你收集整理的HTTP权威指南记录 ---- Web服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MongoDB指定类型查询数据
- 下一篇: java操作ad域 免证书