Nginx中虛擬服務器server指令配置說明

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_serverdefault

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

配置虛擬服務器的名稱列表。

通過名稱搜索虛擬服務器時,遵循以下規則:

  1. 確切名稱匹配
  2. 以“*”起始的最長通配符名稱匹配
  3. 以“*”結尾的最長通配符名稱陪陪
  4. 第一個正則匹配(匹配順序與配置順序有關,匹配到第一個正則停止)
通配符名稱

通配符名稱是指在虛擬服務器名稱前面或者后面配置一個“*”,緊接著“*”的是點(.)。

“*.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;  
    ...
}
最佳實踐

確切名稱、以星號起始的通配符名稱、以星號結尾的通配符名稱分別存儲在綁定于端口的三張哈希表中,哈希表搜索順序如前面所述

  1. 確切名稱
  2. 以星號起始的通配符名稱
  3. 以星號結束的通配符名稱
  4. 正則表達式

搜索速度由快到慢順序

  1. 確切名稱
  2. 通配符
  3. 正則表達式

因此,盡可能的配置確切名稱。比如請求exmaple.orgwww.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的過程

    1. 在配置的location列表中搜索URI不帶參數的最完整字符串,逐漸減短匹配串,最長的成功匹配將會被選擇并保存;
    2. 根據配置順序匹配正則表達式,匹配成功則停止;
    3. 如果正則表達式匹配成功,則使用正則表達式匹配成功的location,否則使用第一步匹配到的location
  • 前綴匹配中匹配到的最長location如果有^~作為前修飾符,則不會進行正則匹配;

  • 如果使用=修飾,會進行確切值的匹配,且匹配成功停止繼續匹配;該location不可嵌套其他location

  • 在0.7.1版本到0.8.41版本中,匹配打的前綴location即使沒有=或者^~作為前修飾符,也會停止匹配;

  • @作為前綴定義的lcation,不用來處理常規請求,而是用來重定向請求;這種location不能被嵌套,也不能其它location

  • 如果一個前綴字符串定義到location以斜杠(/)結尾,請求被proxy_passfastcgi_passuwsgi_pass,
    scgi_passmemcached_passgrpc_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工具使用說明

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。