第一個(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 模塊的作用。
默認(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 下配置,設(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 信息相匹配。
設(shè)置主機(jī)名哈希桶大小,其默認(rèn)值取決于處理器的緩存線長(zhǎng)度。
server_names_hash_bucket_size size;
只能在 http 下配置,默認(rèn)值是 32|64|128,為了通過(guò) 哈希表 快速匹配主機(jī)名,這里就是設(shè)置這個(gè)哈希表的大小。
只能在 http 下配置,設(shè)置主機(jī)名哈希表的最大size(容量)。
server_names_hash_max_size size;
默認(rèn)值是 512 和上面一個(gè)類似,設(shè)置的越大,占用的內(nèi)存越高,但哈希沖突越低,檢索速度也越快。
開(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)非常多了,大家照著弄就可以了。
把 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ù))
listen 443 ssl;
,這個(gè)參數(shù)現(xiàn)在比較常用。好多都看不懂吧?沒(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)鋪路打氣的。
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
聯(lián)系客服