摘要:如何阻止處理未定義的。如果沒有被發(fā)現(xiàn),將被處理。第一個匹配的表達式終止搜索,將使用這個。此外,任何人可能請求任何是在查詢字符串現(xiàn)在我們來看將如何被處理。這個將被前綴位置首次匹配然后被正則表達式匹配,因此,被后處理。
官文:How nginx processes a request
???????Nginx首先判斷哪一個Server應(yīng)該被用來處理這個Request。舉個簡單的配置例子,三個虛擬Server都在80端口上listen。
server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name example.net www.example.net; ... } server { listen 80; server_name example.com www.example.com; ... }
???????應(yīng)用此配置后,nginx僅找到request的header的Host field,看一下request應(yīng)該被rout到哪一個server。如果請求頭的Host域找不到一個匹配的server的名稱,或者request壓根就不包含這個header的field,那么nginx將把request route到這個端口的默認server上。上面的配置中,默認的server就是第一個,nginx的標準默認行為就是認第一個。當然 ,也可以使用default_server參數(shù)在listen的指令中顯示設(shè)置哪一個server應(yīng)該是默認的。
server { listen 80 default_server; server_name example.net www.example.net; ... }
???????default_server參數(shù)從0.8.21版本開始有效。早期版本使用的是default參數(shù)。
???????注意,默認服務(wù)器是listen端口的一個屬性,其他的下面說。
如何阻止處理未定義server name的request。
???????如果不帶有Host header field的request要被禁止,丟棄request的server可以被這樣定義。
server { listen 80; server_name ""; return 444; }
???????這里,server name設(shè)置為空字符串,將匹配無Host header field的request,指定的nginx的非標準代碼444被返回來關(guān)閉連接。
從0.8.48開始,這是server name的默認設(shè)定,所以server_name “” 可以被忽略。早期版本,機器的hostname被用作默認的server name。
混合基于name和基于IP的虛擬server
???????看一下一些虛擬server監(jiān)聽在不同地址的更復(fù)雜的配置
server { listen 192.168.1.1:80; server_name example.org www.example.org; ... } server { listen 192.168.1.1:80; server_name example.net www.example.net; ... } server { listen 192.168.1.2:80; server_name example.com www.example.com; ... }
???????這里,nginx首先測對應(yīng)server塊的listen指令的request。然后測匹配Ip地址和端口的針對server塊的server_name 實體 request Host header field。如果server name沒有被發(fā)現(xiàn),request將被default server處理。例如,www.example.com的request接受在192.168.1.1:80 端口將被 192.168.1.1:80 port的default server處理,例如被第一個,因為沒有www.example.com被定義在這個端口。
???????nginx如已述,default server是監(jiān)聽端口的屬性,不同的default servers可以被不同的端口定義。
server { listen 192.168.1.1:80; server_name example.org www.example.org; ... } server { listen 192.168.1.1:80 default_server; server_name example.net www.example.net; ... } server { listen 192.168.1.2:80 default_server; server_name example.com www.example.com; ... }簡單PHP配置
???????我們來看如nginx如何選擇位置來處理request,
server { listen 80; server_name example.org www.example.org; root /data/www; location / { index index.html index.php; } location ~* .(gif|jpg|png)$ { expires 30d; } location ~ .php$ { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
???????nginx首先找最指定的前綴location,通過字面的字符串而不管順序。配置中僅有前綴location是/ 因為它匹配任何請求他將被用作保底。然后nginx檢查被正則表達式給出的location按照配置文件中的順序。第一個匹配的表達式終止搜索,nginx將使用這個location。如果沒有正則表達式匹配,那么nginx使用最匹配前綴location。
???????注意所有類型的location僅僅試探無參數(shù)的request行的URI部分。因為請求字符串中的參數(shù)可能會有多種方式。
/index.php?user=john&page=1 /index.php?page=1&user=john
???????此外,任何人可能請求任何是在查詢字符串
/index.php?page=1&something+else&user=john
???????現(xiàn)在我們來看request將如何被處理。
/logo.gif
???????這個request將被前綴位置 /首次匹配然后被正則表達式.(gif|jpg|png)$匹配,因此,request被后location處理。使用指令root /data/www request被映射到文件/data/www/logo.gif,文件被送到客戶端。
/index.php
???????request也被/匹配然后被正則表達式.(php)$匹配。所以請求被后面的location處理同時請求被傳遞到FastCGI server 監(jiān)聽在localhost:9000。fastcgi_param 指令設(shè)置FastCGI參數(shù)SCRIPT_FILENAME 為 /data/www/index.php,root + uri,F(xiàn)astCGI server執(zhí)行這個文件。
/about.html
???????被/匹配,被處理。使用指令root /data/www; request 被映射到root + uri /data/www/about.html。
/
???????匹配的復(fù)雜。被前綴location / 匹配。因此被這個location處理。然后 index 指令填補參數(shù)和 root /data/www 指令一起,并測試文件是否存在。如果文件/data/www/index.html 不存在,/data/www/index.php 存在,那么指令要進行內(nèi)部重定向(凡是請求中的沒有uri指定文件的,使用index自動匹配上的,都會觸發(fā)重定向),nginx重新匹配location,如果這個新生成的request是從客戶端發(fā)來的一樣,而不是直接返回相應(yīng)資源。如我們所見,重定向請求最終被最后一個FastCGI server處理了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/39235.html
摘要:一個就像一個樂高玩具。問題是不是你小時候玩兒的那個有趣,它們不是充滿想象力的打氣筒,也不是一種樂高玩具。這是對的并不是給開發(fā)者使用的,它們是給庫作者使用的。不會超過這兩種情況。第二個是根據(jù)第一個處理函數(shù)如何運行來自動變成狀態(tài)成功或者失敗。 原文地址:http://blog.getify.com/promis... 在 Part4:擴展問題 中,我討論了如何擴展和抽象Promise是多么...
摘要:如果我們使用注入,如上所述,便通過調(diào)用方法注入依賴項,這一點尤其重要,因為在調(diào)用對象的構(gòu)造函數(shù)時這些依賴項并不可用。 如果你看到了注解,那么一定有什么代碼在什么地方處理了它. Alan Hohn 我教Java課程時強調(diào)的一點是注解是惰性的。換句話說,它們只是標記,可能具有某些屬性,但沒有自己的行為。因此,每當你在一段Java代碼上看到一個注解時,就意味著必須有一些其他的Java代碼來尋...
摘要:前言基于做微服務(wù)架構(gòu)分布式系統(tǒng)時,作為認證的業(yè)內(nèi)標準,也提供了全套的解決方案來支持在環(huán)境下使用,提供了開箱即用的組件。 前言 基于SpringCloud做微服務(wù)架構(gòu)分布式系統(tǒng)時,OAuth2.0作為認證的業(yè)內(nèi)標準,Spring Security OAuth2也提供了全套的解決方案來支持在Spring Cloud/Spring Boot環(huán)境下使用OAuth2.0,提供了開箱即用的組件。但...
摘要:講到這里,超時原理基本上其實差不多了,這個類還有個地方需要注意,在初始化對象時,會去創(chuàng)建一個超時的延遲任務(wù),延遲時間就是值,在這個延遲任務(wù)中也會調(diào)用方法喚醒阻塞 背景 在使用dubbo時,通常會遇到timeout這個屬性,timeout屬性的作用是:給某個服務(wù)調(diào)用設(shè)置超時時間,如果服務(wù)在設(shè)置的時間內(nèi)未返回結(jié)果,則會拋出調(diào)用超時異常:TimeoutException,在使用的過程中,我們...
摘要:若該特性未指定,則數(shù)據(jù)會發(fā)送到包含該表單的頁面所在的。其中使用了來處理表單數(shù)據(jù)。特殊案例發(fā)送文件文件是表單中一個特殊的例子,其他數(shù)據(jù)都是文本數(shù)據(jù),而文件則一般是或者被認為是二進制數(shù)據(jù)。 系列文章說明 原文 多數(shù)時候,HTML表單的目的只是為了把數(shù)據(jù)發(fā)給服務(wù)器,之后服務(wù)器再處理這些數(shù)據(jù)并發(fā)送響應(yīng)給用戶。雖然看起來挺簡單的,但我們還是得注意一些事情以確保傳送的數(shù)據(jù)不會破壞服務(wù)器、或者給...
閱讀 1182·2021-11-24 09:39
閱讀 3652·2021-09-02 15:21
閱讀 2191·2021-08-24 10:01
閱讀 749·2021-08-19 10:55
閱讀 2474·2019-08-30 15:55
閱讀 1239·2019-08-30 14:16
閱讀 3019·2019-08-29 15:17
閱讀 3267·2019-08-29 13:53