server
虛擬服務器配置。可以基于IP配置,也可基于名稱配置,二者沒有明顯的區分。listen
指令描述server接收請求的所有地址和端口,server_name
配置客戶端可以請求到的所有服務器名稱列表。
listen
為虛擬服務器接收請求設置IP和端口或者UNIX-domain套接字的路徑。
可以同時指定IP地址和端口;
也可以只指定IP地址或只指定端口;
只指定IP地址情況,端口默認是
80
;地址也可以是主機名(hosts);
-
0.7.36版本開始可以通過中括號指定IPV6地址;
listen [::]:8000; listen [::1];
-
0.8.21版本開始可通過
unix:
前綴指定UNIX-domain套接字路徑;listen unix:/var/run/nginx.sock;
沒有顯式配置
listen
指定的情況下,如果nginx是以超級權限用戶運行的,則默認端口是80
,否則默認是端口是8000
。
語法
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
默認值
listen *:80 | *:8000;
parameters列表
default_server
- 指定當前服務器是指定地址和端口的默認服務器;
- 如果所以的
listen
指令都沒有配置default_server
指令,則配置列表中的一個服務器為默認服務器; - 0.8.21版本之前
default_server
是default
。
ssl
指定當前端口下的所有請求都工作在SSL模式下(從0.7.14版本開始起用)。
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
...
}
表示服務器可以同時處理HTTP和HTTPS請求。
http2
配置當前端口是接受HTTP/2 請求連接的,一般情況下應當同時指定ssl
參數(可不指定)。(從1.9.5版本開始起用)
spdy
配置當前端口是接受SPDY請求鏈接的,一般情況下應當同時指定ssl
參數(可不指定)。(在1.3.15-1.9.4版本中使用)
listen
指令還有一些針對套接字調用相關的參數,參考官網指導手冊
server_name
配置虛擬服務器的名稱列表。
通過名稱搜索虛擬服務器時,遵循以下規則:
- 確切名稱匹配
- 以“*”起始的最長通配符名稱匹配
- 以“*”結尾的最長通配符名稱陪陪
- 第一個正則匹配(匹配順序與配置順序有關,匹配到第一個正則停止)
通配符名稱
通配符名稱是指在虛擬服務器名稱前面或者后面配置一個“*”,緊接著“*”的是點(.
)。
“*.example.org”可以匹配到“www.example.org”,也可以匹配到“www.sub.example.org”。
“.example.org”可以當做是“example.org”和“*.example.org”的組合。
類似“www.*.example.org”或者“w*.example.org"的配置是無效的。
正則表達式名稱
正則表達式配置虛擬服務器名稱需滿足以下條件:
- 一定要以波浪線(
~
)作為起始符號 - 表達式放在在(
^
)和($
)之間 - 正則表達式中的點(
.
)需要用反斜杠(\
)轉義 - 如果正則表達式中有花括號(
{}
),正則表達式需要用引號(""
)括起來
server_name ~^www\d+\.example\.net$;
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
混合名稱
如果需要處理請求投中沒有"Host"字段的請求,server_name中可以指定空引號(""
)。(從0.8.48版本開始,server_name
默認是"",之前的版本默認是hostname)
也可以指定為具體的IP地址
server {
listen 80;
server_name example.org
www.example.org
""
192.168.1.1
;
...
}
_
符號表示可以匹配所有的名稱,無論是正規域名,還是形如“!@#
”或者“--
” 等不正規的名稱皆可匹配。(這種方式不推薦使用)
server {
listen 80 default_server;
server_name _;
return 444;
}
可以在server_name
指令中通過使用ASCII (Punycode) 表示國際化域名(IDNs)
server {
listen 80;
server_name xn--e1afmkfd.xn--80akhbyknj4f;
...
}
最佳實踐
確切名稱、以星號起始的通配符名稱、以星號結尾的通配符名稱分別存儲在綁定于端口的三張哈希表中,哈希表搜索順序如前面所述
- 確切名稱
- 以星號起始的通配符名稱
- 以星號結束的通配符名稱
- 正則表達式
搜索速度由快到慢順序
- 確切名稱
- 通配符
- 正則表達式
因此,盡可能的配置確切名稱。比如請求exmaple.org和www.example.org的頻率較高,那么如下第一種配置明顯優于第二種配置
server {
listen 80;
server_name example.org www.example.org *.example.org;
...
}
server {
listen 80;
server_name .example.org;
...
}
如果配置服務器名稱過多或者長度過長,可能需要調整server_names_hash_max_size
和 server_names_hash_bucket_size指令。
location
配置請求URI。
語法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
默認值
-
說明
匹配是針對規范化URI執行的,對形如“%XX”的編碼文本會進行解碼操作,對
.
或者..
的相對路徑引用會進行解析,對相鄰的兩個或多個斜杠會壓縮成一個;location
可以通過前綴串定義,也可以通過正則表達式定義;通過正則表達式定義時,
~*
作為前修飾符表示大小寫不敏感,~
作為前修飾符表示大小寫敏感;-
根據請求匹配
location
的過程- 在配置的
location
列表中搜索URI不帶參數的最完整字符串,逐漸減短匹配串,最長的成功匹配將會被選擇并保存; - 根據配置順序匹配正則表達式,匹配成功則停止;
- 如果正則表達式匹配成功,則使用正則表達式匹配成功的
location
,否則使用第一步匹配到的location
;
- 在配置的
前綴匹配中匹配到的最長
location
如果有^~
作為前修飾符,則不會進行正則匹配;如果使用
=
修飾,會進行確切值的匹配,且匹配成功停止繼續匹配;該location
不可嵌套其他location
;在0.7.1版本到0.8.41版本中,匹配打的前綴
location
即使沒有=
或者^~
作為前修飾符,也會停止匹配;@
作為前綴定義的lcation
,不用來處理常規請求,而是用來重定向請求;這種location
不能被嵌套,也不能其它location
;-
如果一個前綴字符串定義到
location
以斜杠(/
)結尾,請求被proxy_pass,fastcgi_pass,uwsgi_pass,
scgi_pass,memcached_pass,grpc_pass處理,請求會轉向原請求串不帶后斜杠的請求上,301(永久重定向)碼會返回給帶有后斜杠的請求。可以通過下面的方式配置完全匹配來解決:location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }
其他文章列表
spring web service系列1
spring web service系列2
spring web service系列3
maven配置文件settings.xml詳解
Nginx轉發請求過程解析
Nginx中的負載均衡算法
Nginx upstream指令配置說明
Nginx中proxy_pass/proxy_redirect/proxy_set_header配置說明
Nginx中ngx_http_core_module相關指令配置說明
Java自帶JVM監控工具jstat使用詳細說明
Java自帶JVM監控工具jps使用詳細說明
Java自帶故障分析工具jmap工具使用說明
Java自帶故障分析工具jhat工具使用說明