免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
【Nginx05】Nginx學(xué)習(xí):HTTP核心模塊(二)Server

Nginx學(xué)習(xí):HTTP核心模塊(二)Server

第一個(gè)重要的子模塊就是這個(gè) Server 相關(guān)的模塊。Server 代表服務(wù)的意思,其實(shí)就是這個(gè) Nginx 的 HTTP 服務(wù)端所能提供的服務(wù)?;蛘吒卑c(diǎn)說(shuō),就是虛擬主機(jī)的配置。通過(guò) Server ,我們可以在同一臺(tái)服務(wù)器上,配置監(jiān)聽(tīng)不同端口號(hào)的 HTTP 應(yīng)用,配置不同域名解析的 HTTP 服務(wù),并且還可以靈活組合進(jìn)行各種不同的域名和端口號(hào)的配置。這就是 Server 模塊的作用。

Server

默認(rèn)安裝完成 Nginx 之后,都會(huì)提供一個(gè)默認(rèn)的配置文件,在其中就會(huì)有一個(gè) server 。

server {
  listen       80;
  server_name  localhost;

  location / {
    root   html;
    index  index.html index.htm;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
   root   html;
 }
}

整個(gè) server{} 模塊就是表示設(shè)置一個(gè)虛擬主機(jī)的配置。它只能寫(xiě)在 http 模塊下面,但是可以有多個(gè)。比如我們可以再添加幾個(gè)。

server {
  listen       80;
  server_name  localhost;

  location / {
    root   html;
    index  index.html index.htm;
  }

  location /t1/ {
   return 200 '201';
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
   root   html;
  }
}
server {
  listen       8080;
  server_name  localhost;

  location / {
    root   html;
    index  index.html index.htm;
  }

  location /t1/ {
   return 200 '202';
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
   root   html;
  }
}
server {
  listen       80;
  server_name  core.http;

  location / {
    root   html;
    index  index.html index.htm;
  }

  location /t1/ {
   return 200 '203';
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
   root   html;
  }
}

注意上面三個(gè)配置中 listen 和 server_name 的區(qū)別。現(xiàn)在訪問(wèn) http://192.168.56.88/t1/ 、http://192.168.56.88:8080/t1/ 和改完 hosts 指向的 http://core.http/t1/ 看看返回值是不是對(duì)應(yīng)的 201、202 和 203 。如果你的瀏覽器訪問(wèn)彈出下載的話,可以使用 curl 工具,或者修改一下 http 配置中的 default_type 為 text/html 。

其實(shí)從這里就可以看出,listen 是監(jiān)控端口,server_name 是域名和主機(jī)名配置的,它們倆都可以設(shè)置多個(gè),但形式略有不同。如果有重復(fù)的,比如多個(gè) server 中都有端口 80 ,域名是 localhost 的配置就會(huì)報(bào)錯(cuò),報(bào)錯(cuò)條件是其它 server 中不能同時(shí)滿足這兩個(gè)條件,否則就會(huì)產(chǎn)生監(jiān)聽(tīng)的端口和域名沖突。不過(guò)這個(gè)錯(cuò)誤是一個(gè)警告錯(cuò)誤,也就是 Nginx 還可以正常運(yùn)行,但會(huì)按照順序從前往后匹配,或者說(shuō),第一個(gè)匹配上了就走第一個(gè)了。因此,我們一再?gòu)?qiáng)調(diào),特別是線上生產(chǎn)環(huán)境,在修改 nginx.conf 文件之后一定要 nginx -t 一下,即使是警告,也要看一下原因,避免配置后產(chǎn)生無(wú)效的內(nèi)容。

server_name

只能在 server 下配置,設(shè)置虛擬主機(jī)名,是 Server 模塊中非常重要的一個(gè)配置指令。

server_name name ...;

可以配置多個(gè)主機(jī)名,第一個(gè)為虛擬主機(jī)的首要主機(jī)名。主機(jī)名中可以帶星號(hào),這樣就可以匹配主機(jī)名的開(kāi)始或者結(jié)尾部分。

server_name   core.http *.core.http core.http.*; #core.php*;#*.sss.*;

注意,星號(hào)只能在前后,并且要配合一個(gè)點(diǎn),后面注釋中的兩種形式都無(wú)法配置,直接檢查就會(huì)報(bào)錯(cuò)?,F(xiàn)在我們可以通過(guò)多種形式的域名訪問(wèn)這個(gè)配置。

192.168.56.88 core.http www.core.http w.y.core.http core.http.com core.http.com.cn

當(dāng)然,它也支持正則表達(dá)式進(jìn)行匹配,并且正則還可以匹配組,然后將匹配到的內(nèi)容將給后面其它的配置指令使用。

server_name   core.http *.core.http core.http.*; #core.php*;#*.sss.*;
server_name ~^www(\d?)\.core(?<domain>.+)$;
……………………
location /t2/ {
 return 200 $1$domain;
}

本地我們 Hosts 指向一個(gè) www4.core.opll.ppsd 域名,然后訪問(wèn) /t2 路徑,就會(huì)看到輸出的內(nèi)容是 4.opll.ppsd 是不是很神奇,之前我還真不知道這里可以這么用。$1 表示的是正則的第一個(gè)匹配項(xiàng),也就是括號(hào) \d 的內(nèi)容,而后面的內(nèi)容則是 <domain> 輸出的,它是通過(guò)正則直接定義了一個(gè) Nginx 內(nèi)部變量。因此,我們可以在下面直接使用 $domain 來(lái)輸出變量的內(nèi)容。

這個(gè)時(shí)候,如果訪問(wèn)上面不帶正則和變量的域名會(huì)返回什么內(nèi)容呢?大家可以試試,直接就是空內(nèi)容,沒(méi)有別的東西。

另外,上面的配置大家也可以看出,server_name 這個(gè)指令是可以寫(xiě)多個(gè)的。但需要注意的是像上面說(shuō)過(guò)的,域名+端口的沖突問(wèn)題,既然可以配置相同的域名,那么它們的匹配順序是什么呢?以第一個(gè)配置的為準(zhǔn)(和 listen 有關(guān),我們下個(gè)小節(jié)再說(shuō)),也就是按照文件順序。另外還有同一個(gè) Server 下同時(shí)有普通、星號(hào)、正則域名,它們的順序又是什么呢?完全匹配最高,通配符在前面的次之,通配符在后面的第三,正則匹配的最后。Nginx 中大部分和匹配有關(guān)的,基本都是這個(gè)順序。

如果指定一個(gè)空字符串,那么就表示請(qǐng)求頭中,沒(méi)有 Host 的和這個(gè) Server 信息相匹配。

server_names_hash_bucket_size

設(shè)置主機(jī)名哈希桶大小,其默認(rèn)值取決于處理器的緩存線長(zhǎng)度。

server_names_hash_bucket_size size;

只能在 http 下配置,默認(rèn)值是 32|64|128,為了通過(guò) 哈希表 快速匹配主機(jī)名,這里就是設(shè)置這個(gè)哈希表的大小。

server_names_hash_max_size

只能在 http 下配置,設(shè)置主機(jī)名哈希表的最大size(容量)。

server_names_hash_max_size size;

默認(rèn)值是 512 和上面一個(gè)類似,設(shè)置的越大,占用的內(nèi)存越高,但哈希沖突越低,檢索速度也越快。

server_tokens

開(kāi)啟或關(guān)閉在錯(cuò)誤信息的 “Server” 響應(yīng)頭中輸出 Nginx 版本號(hào)。

server_tokens on | off | build | string;

默認(rèn)值是 on ,其實(shí)它配置的就是我們平常在請(qǐng)求 Nginx 服務(wù)時(shí),響應(yīng)頭中 Server 字段返回的內(nèi)容。默認(rèn)情況下,它會(huì)返回 nginx/1.23.0 。同樣的,在 Nginx 的默認(rèn)報(bào)錯(cuò)頁(yè)面,比如 404 頁(yè)面,也會(huì)返回這樣的版本號(hào)。

如果不想返回具體的版本號(hào),那么我們就可以修改這個(gè)配置指令,設(shè)置為 off 。在 1.11.10 版本之后,還可以使用 build 參數(shù),返回的是構(gòu)建版本號(hào)。最后就是 1.9.13 之后的商業(yè)版版本可以直接設(shè)置一個(gè)字符串,這個(gè)在大家日常使用的開(kāi)源版本中是沒(méi)辦法用的。

相信有的小伙伴要問(wèn)了,能不能直接去掉 Server 響應(yīng)頭,完全不讓別人知道我們是使用的 Nginx 呢?可以,但是要修改源碼重新編譯,這個(gè)就超出我的能力范圍了,雖說(shuō)也實(shí)驗(yàn)過(guò),但是這里就不貼出來(lái)了,畢竟網(wǎng)上的教程已經(jīng)非常多了,大家照著弄就可以了。

端口監(jiān)聽(tīng) listen

把 listen 單獨(dú)拿出來(lái) ,是因?yàn)樗呐渲枚x非常長(zhǎng),而且非常復(fù)雜,但是我們?nèi)粘S貌坏侥敲炊喾浅?fù)雜的配置。所以還是以常用的配置為基礎(chǔ),其它的內(nèi)容了解一下就好。

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ssl] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

是不是有點(diǎn)嚇人,這應(yīng)該是整個(gè) Nginx 中配置選項(xiàng)最多的一個(gè)了吧。

它就是設(shè)置 Nginx 的監(jiān)聽(tīng)地址,Nginx 從這里接受請(qǐng)求,只能寫(xiě)在 server 模塊中。對(duì)于IP協(xié)議,這個(gè)地址就是 address 和 port 。對(duì)于 UNIX 域套接字協(xié)議,這個(gè)地址就是 path 。 一條 listen 指令只能指定一個(gè) address 或者 port ,不能像 server_name 那樣在一行寫(xiě)多個(gè),如果要監(jiān)聽(tīng)不同的端口,就需要寫(xiě)多個(gè) listen 。

大部分情況下我們都只是簡(jiǎn)單地這樣寫(xiě)一個(gè)監(jiān)聽(tīng) 80 的就行了。

listen       80;

其實(shí)這個(gè)不寫(xiě)也行,因?yàn)樵跊](méi)有定義 listen 指令的情況下,如果以超級(jí)用戶權(quán)限運(yùn)行 Nginx ,它將監(jiān)聽(tīng) *:80 ,否則他將監(jiān)聽(tīng)*:8000。不過(guò)為了保險(xiǎn)起見(jiàn),一般我們都會(huì)寫(xiě)上這個(gè)配置。只寫(xiě)一個(gè)端口號(hào)就表示前面的 address 就是 * ,表示所有地址都監(jiān)聽(tīng)。

偶爾在特殊情況下,我們可能監(jiān)聽(tīng)多個(gè)端口。

server {
  listen 8081;
  listen 8082;
  listen 8083;
  server_name localhost;

  location / {
   return 200 listen1;
  }
}

這樣,當(dāng)前的 server 就會(huì)同時(shí)監(jiān)聽(tīng) 8081、8082、8083 這三個(gè)端口。通過(guò)這三個(gè)端口訪問(wèn)的內(nèi)容都會(huì)進(jìn)入到這個(gè) server 中。在同一個(gè) server 中,不能定義相同端口號(hào)的。而如果是另外一個(gè) server 中,就和上面說(shuō)過(guò)的域名問(wèn)題一樣,如果域名不同就沒(méi)事,如果域名也相同的話,會(huì)報(bào)警告錯(cuò)誤。

監(jiān)聽(tīng)的 address ,是可以指定域名的。

listen 127.0.0.1:8000;
listen localhost:8000;

或者你的主機(jī)上 hosts 指向的任何主機(jī),甚至外網(wǎng)域名都可以,不過(guò)一般很少人會(huì)這樣做。另外不指定端口號(hào)也可以。

listen 127.0.0.1;

這樣默認(rèn)就會(huì)走 80 端口,和上面的默認(rèn)規(guī)則一樣。如果是 ipv6 地址,則要使用 [] 的形式。

listen [::]:8000;
listen [fe80::1];

另外,還可以使用 unix socket ,就是前面說(shuō)過(guò)的 Unix域套接字形式。

listen unix:/var/run/nginx.sock;

另外還有一個(gè)重要的配置就是 default_server ??梢詾?listen 指定這個(gè)參數(shù),然后當(dāng)前的虛擬主機(jī)將成為指定 address:port 的默認(rèn)虛擬主機(jī)。 如果任何 listen 指令都沒(méi)有攜帶 default_server 參數(shù),那么第一個(gè)監(jiān)聽(tīng) address:port 的虛擬主機(jī)將被作為這個(gè)地址的默認(rèn)虛擬主機(jī)。

其實(shí)這里就是解釋了之前我們說(shuō)的同域名,同端口的主機(jī)問(wèn)題。默認(rèn)會(huì)報(bào)一個(gè)警告錯(cuò)誤,同時(shí)會(huì)以第一個(gè)配置為準(zhǔn),但如果我們給第二個(gè)配置添加上 default_server 的話,那么現(xiàn)在就會(huì)走第二個(gè)配置。

server {
  listen 8081;
  listen 8082;
  listen 8083;
  server_name localhost;

  location / {
   return 200 listen1;
  }
}

server {
  listen 8082 default_server;
  listen 8084;
  server_name localhost;

  location / {
   return 200 listen2;
  }
}

我們給 8082 的第二個(gè) server 配置的 listen 上添加了 default_server ,現(xiàn)在訪問(wèn) 8082 端口,會(huì)返回的內(nèi)容是 listen2 。那么可以定義多個(gè) default_server 嗎?答案是不行的,Nginx 檢查會(huì)報(bào)出 emerg 錯(cuò)誤,這個(gè)就不是警告那么簡(jiǎn)單了,無(wú)法啟用或者重新加載配置文件的。default_server 只能有一個(gè)。在 0.8.21 版本以前這個(gè)選項(xiàng)叫做 default 。

其它還有一些參數(shù),我們就不一一配置了,在這里列出來(lái)大家一起了解一下,有需要用到的直接配上使用就好了。(在 0.8.21 版以前,只有為 listen 指令定義了 default 參數(shù),才能定義這些額外的參數(shù))

  • setfib=number 這個(gè)參數(shù)(0.8.44)為監(jiān)聽(tīng)套接字設(shè)置關(guān)聯(lián)路由表FIB(SO_SETFIB選項(xiàng))。 當(dāng)前這個(gè)參數(shù)僅工作在FreeBSD上。
  • backlog=number 為系統(tǒng)調(diào)用 listen() 設(shè)置 backlog 參數(shù),用以限制未接受(Accept)連接的隊(duì)列的最大長(zhǎng)度。 FreeBSD 和 Mac OS X 下,backlog 的默認(rèn)值是 -1 ,在其他系統(tǒng)中,默認(rèn)值是 511 。
  • rcvbuf=size 為監(jiān)聽(tīng)套接字設(shè)置接收緩沖區(qū)大小(SO_RCVBUF參數(shù))。
  • sndbuf=size 為監(jiān)聽(tīng)套接字設(shè)置發(fā)送緩沖區(qū)大小(SO_SNDBUF參數(shù))。
  • accept_filter=filter 為監(jiān)聽(tīng)套接字設(shè)置接受過(guò)濾器的名稱(SO_ACCEPTFILTER選項(xiàng))。 對(duì)每個(gè)到來(lái)的連接,接受過(guò)濾器先進(jìn)行過(guò)濾,然后才將它們呈現(xiàn)給accept()。 本特性僅工作在 FreeBSD 系統(tǒng)和 NetBSD 5.0+ 系統(tǒng)下。 可接受的值是 dataready 和 httpready 。
  • deferred 指示在Linux系統(tǒng)使用延遲的accept()(TCP_DEFER_ACCEPT選項(xiàng))。在設(shè)置該參數(shù)后,若用戶發(fā)起建立連接請(qǐng)求,并且完成了TCP的三次握手,內(nèi)核也不會(huì)為了這次的連接調(diào)度worker進(jìn)程來(lái)處理,只有用戶真的發(fā)送請(qǐng)求數(shù)據(jù)時(shí)(內(nèi)核已經(jīng)在網(wǎng)卡中收到請(qǐng)求數(shù)據(jù)包),內(nèi)核才會(huì)喚醒worker進(jìn)程處理這個(gè)連接。這個(gè)參數(shù)適用于大并發(fā)的情況下。
  • bind 指示nginx為設(shè)置的address:port單獨(dú)調(diào)用一次 bind() 。 這是因?yàn)楫?dāng)有多條 listen 指令監(jiān)聽(tīng)不同地址下的相同端口, 而其中一條 listen 指令監(jiān)聽(tīng)了這個(gè)端口的所有地址(*:port)時(shí), Nginx只會(huì)為 *:port 調(diào)用一次 bind() 綁定套接字。 需要留意的是,這種情況下,Nginx 會(huì)調(diào)用 getsockname() 系統(tǒng)調(diào)用來(lái)確定接受請(qǐng)求的套接字地址。 如果為某個(gè)address:port 定義了參數(shù) backlog、rcvbuf、 sndbuf、accept_filter、deferred 或者 so_keepalive , Nginx 總會(huì)為這個(gè)地址單獨(dú)調(diào)用一次 bind() 綁定套接字。
  • ipv6only=on|off 這個(gè)參數(shù)(0.7.42)(通過(guò)IPV6_V6ONLY選項(xiàng))決定監(jiān)聽(tīng)在通配地址[::]上的 IPv6 套接字是只支持 IPv6 連接,還是同時(shí)支持 IPv6 和 IPv4 連接。 這個(gè)參數(shù)默認(rèn)打開(kāi),并且只能在 Nginx 啟動(dòng)時(shí)設(shè)置。在1.3.4版以前,如果省略此參數(shù),那么操作系統(tǒng)的套接字設(shè)置將生效。
  • ssl 本參數(shù)(0.7.14)與套接字相關(guān)的系統(tǒng)調(diào)用無(wú)關(guān),但是它可以指定從這個(gè)端口接受的連接應(yīng)該以SSL模式工作。 本參數(shù)在某服務(wù)器同時(shí)處理HTTP和HTTPS請(qǐng)求時(shí),可以使配置更為緊湊。例如 listen 443 ssl;,這個(gè)參數(shù)現(xiàn)在比較常用。
  • so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] 這個(gè)參數(shù)(1.1.11)為監(jiān)聽(tīng)套接字配置 “TCP keepalive” 行為。 如果省略此參數(shù),操作系統(tǒng)默認(rèn)的設(shè)置將對(duì)此端口生效。 如果參數(shù)值設(shè)置為“on”,監(jiān)聽(tīng)套接字的 SO_KEEPALIVE 屬性將被開(kāi)啟。 如果參數(shù)值設(shè)置為 “off” ,監(jiān)聽(tīng)套接字的 SO_KEEPALIVE 屬性將被關(guān)閉。 有些操作系統(tǒng)支持為每個(gè)連接調(diào)整 TCP 長(zhǎng)連接的參數(shù)。調(diào)整參數(shù)可以使用套接字選項(xiàng) TCP_KEEPIDLE,TCP_KEEPINTVL和TCP_KEEPCNT 。 在這些操作系統(tǒng)上(當(dāng)前就是Linux 2.4+,嬀NetBSD 5+FreeBSD 9.0-STABLE),可以使用 keepidle,keepintvl 和 keepcnt 參數(shù)來(lái)配置。 省略一到兩個(gè)參數(shù)的話,對(duì)應(yīng)套接字屬性的系統(tǒng)默認(rèn)設(shè)置將生效。

好多都看不懂吧?沒(méi)事,我也看不懂,全是各種網(wǎng)絡(luò)編程以及TCP相關(guān)的基礎(chǔ)知識(shí),所以說(shuō),基礎(chǔ)知識(shí)真的很重要。學(xué)習(xí) Nginx 的最大收獲其實(shí)就是讓自己發(fā)現(xiàn)自己的基礎(chǔ)知識(shí)有多么的薄弱,為了讓我們能夠更加堅(jiān)定地去學(xué)習(xí)基礎(chǔ)知識(shí)來(lái)鋪路打氣的。

總結(jié)

Server 模塊是整個(gè) HTTP 模塊中非常重要的部分,也是下篇我們要講的 Location 模塊的上層,是非常重要的內(nèi)容。但其實(shí),更核心的是它的 server_name 和 listen 兩個(gè)配置指令的作用及配置方法。

好了,話不多說(shuō),接下來(lái)我們就趕緊進(jìn)入到 Location 相關(guān)的學(xué)習(xí)吧。

參考文檔:

http://nginx.org/en/docs/http/ngx_http_core_module.html#server

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
使用 Nginx 為 Linux 實(shí)例綁定多個(gè)域名
Nginx如何處理一個(gè)請(qǐng)求,基于名字的虛擬主機(jī)
使用 Nginx 作為你的開(kāi)發(fā)代理工具
Linux服務(wù)器部署.Net Core筆記:五、安裝Nginx
用Nginx實(shí)現(xiàn)https轉(zhuǎn)http
nginx配置, 亂得可以
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服