Nginx基础入门之nginx基础配置项介绍(2)
? 前面我們講到關(guān)于nginx配置文件(nginx.conf)運行,工作模式,及相關(guān)調(diào)試的等等配置語法,本小節(jié)我們將會講到怎么去配置一個基本的web,以及相關(guān)配置項的定義,虛移主機以及請求的分發(fā)的語法配置,即怎么樣構(gòu)建一個完整的web server 區(qū)域。
一.怎么使用HTTP核心模塊配置一個靜態(tài)Web服務(wù)器?
靜態(tài)Web服務(wù)器的主要功能由ngx_http_core_module模塊(HTTP框架的主要成員)實現(xiàn),當(dāng)然,一個完整的靜態(tài)Web服務(wù)器還有許多功能是由其他的HTTP模塊實現(xiàn)的。本節(jié)主要討論如何配置一個包含基本功能的靜態(tài)Web服務(wù)器
如下所示,為一個基本http的配置
http?{??gzip?on;?? upstream?{??…?? }?? server???{???listen?localhost:80;?…??location?/webstatic?{??if?…?{??…????}?????root?/opt/webresource;???????…?}location?~*?.(jpg|jpeg|png|jpe|gif)$?{??…??} } server???{??????…}?? }
以上即為一個簡單的靜態(tài)web配置說明參考
所有的HTTP配置項都必須直屬于http塊、server塊、location塊、upstream塊或if塊等(HTTP配置項自然必須全部在http{}塊之內(nèi),這里的“直屬于”是指配置項直接所屬的大括號對應(yīng)的配置塊),同時,在描述每個配置項的功能時,會說明它可以在上述的哪個塊中存在,因為有些配置項可以任意地出現(xiàn)在某一個塊中,而有些配置項只能出現(xiàn)在特定的塊中。
Nginx為配置一個完整的靜態(tài)Web服務(wù)器提供了非常多的功能,下面會把這些配置項分為以下8類進(jìn)行詳述:虛擬主機與請求的分發(fā)、文件路徑的定義、內(nèi)存及磁盤資源的分配、網(wǎng)絡(luò)連接的設(shè)置、MIME類型的設(shè)置、對客戶端請求的限制、文件操作的優(yōu)化、對客戶端請求的特殊處理。這種劃分只是為了幫助大家從功能上理解這些配置項。下面我們?yōu)榇蠹乙灰唤榻B相應(yīng)的配置說明:
1.1虛擬主機與請求的分發(fā)配置項說明
? 由于IP地址的數(shù)量有限,因此經(jīng)常存在多個主機域名對應(yīng)著同一個IP地址的情況,這時在nginx.conf中就可以按照server_name(對應(yīng)用戶請求中的主機域名)并通過server塊來定義虛擬主機,每個server塊就是一個虛擬主機,它只處理與之相對應(yīng)的主機域名請求。這樣,一臺服務(wù)器上的Nginx就能以不同的方式處理訪問不同主機域名的HTTP請求了。
[1] 監(jiān)聽端口
語法:listen address:port [ default(deprecated in 0.8.21) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ] ];
默認(rèn):listen 80;
配置塊:server
listen參數(shù)決定Nginx服務(wù)如何監(jiān)聽端口。在listen后可以只加IP地址、端口或主機名,非常靈活,例如:
listen?127.0.0.1:8000;?? listen?127.0.0.1;???#注意:不加端口時,默認(rèn)監(jiān)聽80端口? listen?8000;?? listen?*:8000;?? listen?localhost:8000;
如果服務(wù)器使用IPv6地址,那么可以這樣使用:
listen?[::]:8000;? listen?[fe80::1];?? listen?[:::a8c9:1234]:80;在地址和端口后,還可以加上其他參數(shù),例如:
listen??443?default_server?ssl;?? listen??127.0.0.1?default_server?accept_filter=dataready?backlog=1024;下面說明listen可用參數(shù)的意義。
? default:將所在的server塊作為整個Web服務(wù)的默認(rèn)server塊。如果沒有設(shè)置這個參數(shù),那么將會以在nginx.conf中找到的第一個server塊作為默認(rèn)server塊。為什么需要默認(rèn)虛擬主機呢?當(dāng)一個請求無法匹配配置文件中的所有主機域名時,就會選用默認(rèn)的虛擬主機。
default_server:同上。
backlog=num:表示TCP中backlog隊列的大小。默認(rèn)為–1,表示不予設(shè)置。在TCP建立三次握手過程中,進(jìn)程還沒有開始處理監(jiān)聽句柄,這時backlog隊列將會放置這些新連接。可如果backlog隊列已滿,還有新的客戶端試圖通過三次握手建立TCP連接,這時客戶端將會建立連接失敗。
rcvbuf=size:設(shè)置監(jiān)聽句柄的SO_RCVBUF參數(shù)。
sndbuf=size:設(shè)置監(jiān)聽句柄的SO_SNDBUF 參數(shù)。
accept_filter:設(shè)置accept過濾器,只對FreeBSD操作系統(tǒng)有用。
deferred:在設(shè)置該參數(shù)后,若用戶發(fā)起建立連接請求,并且完成了TCP的三次握手,內(nèi)核也不會為了這次的連接調(diào)度worker進(jìn)程來處理,只有用戶真的發(fā)送請求數(shù)據(jù)時(內(nèi)核已經(jīng)在網(wǎng)卡中收到請求數(shù)據(jù)包),內(nèi)核才會喚醒worker進(jìn)程處理這個連接。這個參數(shù)適用于大并發(fā)的情況下,它減輕了worker進(jìn)程的負(fù)擔(dān)。當(dāng)請求數(shù)據(jù)來臨時,worker進(jìn)程才會開始處理這個連接。只有確認(rèn)上面所說的應(yīng)用場景符合自己的業(yè)務(wù)需求時,才可以使用deferred配置。
bind:綁定當(dāng)前端口/地址對,如127.0.0.1:8000。只有同時對一個端口監(jiān)聽多個地址時才會生效。
ssl:在當(dāng)前監(jiān)聽的端口上建立的連接必須基于SSL協(xié)議。
[2]?主機名稱
語法:server_name name [...];
默認(rèn):server_name "";
配置塊:server
說明:
server_name后可以跟多個主機名稱,如server_name?www.testweb.com、download.testweb.com;。
在開始處理一個HTTP請求時,Nginx會取出header頭中的Host,與每個server中的server_name進(jìn)行匹配,以此決定到底由哪一個server塊來處理這個請求。有可能一個Host與多個server塊中的server_name都匹配,這時就會根據(jù)匹配優(yōu)先級來選擇實際處理的server塊。server_name與Host的匹配優(yōu)先級如下:
1)首先選擇所有字符串完全匹配的server_name,如www.testweb.com。
2)其次選擇通配符在前面的server_name,如*.testweb.com。
3)再次選擇通配符在后面的server_name,如www.testweb.*。
4)最后選擇使用正則表達(dá)式才匹配的server_name,如~^\.testweb\.com$。
實際上,這個規(guī)則正是7.7節(jié)中介紹的帶通配符散列表的實現(xiàn)依據(jù),同時如果Host與所有的server_name都不匹配,這時將會按下列順序選擇處理的server塊。
5)優(yōu)先選擇在listen配置項后加入[default | default_server]的server塊。
6)找到匹配listen端口的第一個server塊。
[3]?重定向主機名稱的處理
語法:server_name_in_redirect on | off;
默認(rèn):server_name_in_redirect on;
配置塊:http、server或者location
該配置需要配合server_name使用。在使用on打開時,表示在重定向請求時會使用server_name里配置的第一個主機名代替原先請求中的Host頭部,而使用off關(guān)閉時,表示在重定向請求時使用請求本身的Host頭部。
[4] location用法
語法:location ?【 =|^~|~*|~|@]|/uri/ { ... 】
配置塊:server
location會嘗試根據(jù)用戶請求中的URI來匹配上面的/uri表達(dá)式,如果可以匹配,就選擇location {}塊中的配置來處理用戶請求。當(dāng)然,匹配方式是多樣的,下面介紹location的匹配規(guī)則。如下為一個location參考案例
location??=?/?{ #?精確匹配?/?,主機名后面不能帶任何字符串 [?configuration?A?] }location?/documents/?{ #?匹配任何以?/documents/?開頭的地址,匹配符合以后,還要繼續(xù)往下搜索 #?只有后面的正則表達(dá)式?jīng)]有匹配到時,這一條才會采用這一條 [?configuration?C?] }
location?~?/documents/Abc?{ #?匹配任何以?/documents/?開頭的地址,匹配符合以后,還要繼續(xù)往下搜索 #?只有后面的正則表達(dá)式?jīng)]有匹配到時,這一條才會采用這一條 [?configuration?CC?] }
location?^~?/p_w_picpaths/?{ #?匹配任何以?/p_w_picpaths/?開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。 [?configuration?D?] }
location?~*?\.(gif|jpg|jpeg)$?{ #?匹配所有以?gif,jpg或jpeg?結(jié)尾的請求 #?然而,所有請求?/p_w_picpaths/?下的圖片會被?config?D?處理,因為?^~?到達(dá)不了這一條正則 [?configuration?E?] }
location?/p_w_picpaths/?{ #?字符匹配到?/p_w_picpaths/,繼續(xù)往下,會發(fā)現(xiàn)?^~?存在 [?configuration?F?] }
location?/p_w_picpaths/abc?{ #?最長字符匹配到?/p_w_picpaths/abc,繼續(xù)往下,會發(fā)現(xiàn)?^~?存在 #?F與G的放置順序是沒有關(guān)系的 [?configuration?G?] }
location?~?/p_w_picpaths/abc/?{ #?只有去掉?config?D?才有效:先最長匹配?config?G?開頭的地址,繼續(xù)往下搜索,匹配到這一條正則,采用 [?configuration?H?] }
location ~* /js/.*/\.js
location參數(shù)說明
| 參數(shù)值 | 表示的含義 |
| = | 表示把URI作為字符串,以便與參數(shù)中的uri做完全匹配,即精確匹配 |
| ^~ | 表示匹配URI時只需要其前半部分與uri參數(shù)匹配即可 |
| ~ | 表示匹配URI時注意字母大小寫問題。 |
| ~* | 表示匹配URI時忽略字母大小寫問題。 |
| !~ | 表示區(qū)分大小寫不匹配 |
| !~* | 表示不區(qū)分大小寫不匹配 |
| @ | 表示僅用于Nginx服務(wù)內(nèi)部請求之間的重定向,帶有@的location不直接處理用戶請求。 |
location的匹配優(yōu)先級
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
轉(zhuǎn)載于:https://blog.51cto.com/blief/1728377
總結(jié)
以上是生活随笔為你收集整理的Nginx基础入门之nginx基础配置项介绍(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea代码调试debug篇
- 下一篇: Nginx与Serssion一致性问题