非常教程

Nginx参考手册

指南 | Guides

Server names

  • 通配符名称
  • 正则表达式名称
  • 杂项名称
  • 国际名称
  • 优化
  • 兼容性

服务器名称是使用server_name指令定义的,并确定哪个服务器块用于给定的请求。另请参见“nginx如何处理请求”。可以使用确切名称,通配符名称或正则表达式来定义它们:

server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

当按名称搜索虚拟服务器时,如果名称与多个指定变体相匹配,例如通配符名称和正则表达式匹配,则将按照以下优先顺序选择第一个匹配变体:

  • 确切名称
  • 以星号开头的最长通配符名称,例如“ *.example.org
  • 最长的通配符名称以星号结尾,例如“ mail.*
  • 首先匹配正则表达式(按照出现在配置文件中的顺序)

通配符名称

通配符名称可能仅在名称的开始或结束处包含星号,并且仅在点边界上。 名称“www。*。example.org”和“w * .example.org”是无效的。 但是,可以使用正则表达式来指定这些名称,例如“〜^ www \ .. + \。example \ .org $”和“〜^ w。* \。example \ .org $”。 星号可以匹配多个名称部分。 名称“* .example.org”不仅与www.example.org相匹配,还与www.sub.example.org相匹配。

可以使用“.example.org”形式的特殊通配符名称来匹配确切名称“example.org”和通配符名称“* .example.org”。

正则表达式名称

nginx使用的正则表达式与Perl编程语言(PCRE)使用的正则表达式兼容。要使用正则表达式,服务器名称必须以波浪号字符开头:

server_name  ~^www\d+\.example\.net$;

否则它将被视为确切的名称,或者如果表达式包含星号,则将其视为通配符名称(并且很可能是无效的名称)。 不要忘记设置“^”和“$”锚点。 它们在语法上不是必需的,但在逻辑上是必需的。 另外请注意,域名点应该使用反斜线进行转义。 应引用包含字符“{”和“}”的正则表达式:

server_name  "~^(?<name>\w\d{1,3}+)\.example\.net$";

否则nginx将无法启动并显示错误消息:

directive "server_name" is not terminated by ";" in ...

命名的正则表达式捕获可以稍后用作变量:

server {
    server_name   ~^(www\.)?(?<domain>.+)$;

    location / {
        root   /sites/$domain;
    }
}

PCRE库使用以下语法支持命名捕获:

?<名称>

Perl 5.10兼容语法,自PCRE-7.0开始支持

?'name'

Perl 5.10兼容语法,自PCRE-7.0开始支持

?P <名称>

Python兼容语法,自PCRE-4.0以来受支持

如果nginx无法启动并显示错误消息:

pcre_compile() failed: unrecognized character after (?< in ...

这意味着PCRE库是旧的,应该尝试使用“?P <name>”语法。 捕获也可以以数字形式使用:

server {
    server_name   ~^(www\.)?(.+)$;

    location / {
        root   /sites/$2;
    }
}

但是,这种用法应限于简单的情况(如上所述),因为数字参考很容易被覆盖。

杂项名称

有一些专门处理的服务器名称。

如果需要在非默认服务器块中处理没有“主机”头字段的请求,则应指定一个空的名称:

server {
    listen       80;
    server_name  example.org  www.example.org  "";
    ...
}

如果服务器块中没有定义server_name,则nginx使用空名称作为服务器名称。

在这种情况下,最高为0.8.48的nginx版本使用机器的主机名作为服务器名称。

如果服务器名称定义为“ $hostname”(0.9.4),则使用机器的主机名。

如果有人使用IP地址而不是服务器名称发出请求,则“主机”请求标头字段将包含IP地址,并且可以使用IP地址作为服务器名称来处理请求:

server {
    listen       80;
    server_name  example.org
                 www.example.org
                 ""
                 192.168.1.1
                 ;
    ...
}

在通用服务器示例中,可以看到奇怪的名字“_ ”:

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

这个名字没有什么特别之处,它只是无数无效域名中的一个,它们与任何真实名称都不会相交。其他无效的名称,如“ --”和“ !@#”等也可以使用。

高达0.6.25的nginx版本支持*被错误地解释为全名的特殊名称“ ”。它从来没有作为一个通用的或通配符的服务器名称。相反,它提供了现在由server_name_in_redirect指令提供的功能。*现在不推荐使用特殊名称“ ”,应使用server_name_in_redirect指令。请注意,无法使用server_name指令指定全部捕获名称或缺省服务器。这是listen指令的属性,而不是server_name指令的属性。另请参见“nginx如何处理请求”。可以定义侦听端口*:80和*:8080的服务器,并指定一个端口为默认服务器端口*:8080,另一个端口为缺省端口*:80:

server {
    listen       80;
    listen       8080  default_server;
    server_name  example.net;
    ...
}

server {
    listen       80  default_server;
    listen       8080;
    server_name  example.org;
    ...
}

国际名称

应在server_name指令中使用ASCII(Punycode)表示来指定国际化域名(IDN):

server {
    listen       80;
    server_name  xn--e1afmkfd.xn--80akhbyknj4f;  # пример.испытание
    ...
}

优化

确切的名称,以星号开头的通配符名称和以星号结尾的通配符名称存储在绑定到侦听端口的三个哈希表中。散列表的大小在配置阶段进行了优化,以便在CPU缓存未命中数量最少的情况下找到名称。设置散列表的细节在单独的文档中提供。

首先搜索确切名称散列表。如果找不到名称,则搜索带有以星号开头的通配符名称的哈希表。如果在该处找不到名称,则搜索带有以星号结尾的通配符名称的散列表。

搜索通配符名称散列表比搜索确切名称散列表要慢,因为名称是按域部分搜索的。请注意,特殊通配符表单“ .example.org”存储在通配符名称散列表中,而不是存储在精确名称散列表中。

正则表达式是按顺序测试的,因此是最慢的方法并且不可伸缩。

出于这些原因,最好在可能的情况下使用确切的名称。 例如,如果最常请求的服务器名称是example.org和www.example.org,则明确定义它们会更有效:

server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}

比使用简化形式要好:

server {
    listen       80;
    server_name  .example.org;
    ...
}

如果定义了大量服务器名称,或定义了非常长的服务器名称,则可能需要在http 级别调整server_names_hash_max_size和server_names_hash_bucket_size指令。server_names_hash_bucket_size指令的缺省值可能等于32或64,或取决于CPU高速缓存行大小的其他值。如果默认值是32并且服务器名称被定义为“ too.long.server.name.example.org”,那么nginx将无法启动并显示错误消息:

could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32

在这种情况下,指令值应该增加到下一个二的幂数:

http {
    server_names_hash_bucket_size  64;
    ...

如果定义了大量服务器名称,则会显示另一个错误消息:

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32

在这种情况下,首先尝试将server_names_hash_max_size设置为接近服务器名称数的数字。只有这样做没有帮助,或者如果nginx的启动时间不可接受,请尝试增加server_names_hash_bucket_size。

如果服务器是侦听端口的唯一服务器,那么nginx根本不会测试服务器名称(并且不会为侦听端口构建哈希表)。但是,有一个例外。如果服务器名称是带有捕获的正则表达式,那么nginx必须执行表达式来获取捕获。

兼容性

  • 自0.9.4以来,特殊服务器名称“$ hostname”一直受到支持。
  • 自0.8.48以来,默认的服务器名称值是一个空的名称“”。
  • 自0.8.25以来,命名的正则表达式服务器名称捕获已被支持。
  • 自0.7.40开始,正则表达式服务器名称捕获已得到支持。
  • 自0.7.12以来,支持一个空的服务器名称“”。
  • 自0.6.25以来,支持通配符服务器名称或正则表达式作为第一个服务器名称。
  • 自0.6.7以来,正则表达式服务器名称一直支持。
  • 自0.6.0版以来,通配符表单example.*一直得到支持。
  • 自0.3.18以来特殊形式.example.org一直得到支持。
  • 自0.1.13以来,*.example.org通配符表单一直支持。

| 由Brian Mercer编辑的Igor |

|:----|

Nginx

Nginx是一款轻量级的 Web 服务器/反向代理服务器及电子邮件代理服务器,可在 BSD-like 协议下发行。其特点是占有内存少,并发能力强。

主页 https://nginx.org/
源码 http://hg.nginx.org/nginx
发布版本 1.13.6

Nginx目录

1.指南 | Guides
2.核心 | Core
3.ngx_google_perftools_module
4.ngx_http_access_module
5.ngx_http_addition_module
6.ngx_http_api_module
7.ngx_http_auth_basic_module
8.ngx_http_auth_jwt_module
9.ngx_http_auth_request_module
10.ngx_http_autoindex_module
11.ngx_http_browser_module
12.ngx_http_charset_module
13.ngx_http_core_module
14.ngx_http_dav_module
15.ngx_http_empty_gif_module
16.ngx_http_f4f_module
17.ngx_http_fastcgi_module
18.ngx_http_flv_module
19.ngx_http_geoip_module
20.ngx_http_geo_module
21.ngx_http_gunzip_module
22.ngx_http_gzip_module
23.ngx_http_gzip_static_module
24.ngx_http_headers_module
25.ngx_http_hls_module
26.ngx_http_image_filter_module
27.ngx_http_index_module
28.ngx_http_js_module
29.ngx_http_keyval_module
30.ngx_http_limit_conn_module
31.ngx_http_limit_req_module
32.ngx_http_log_module
33.ngx_http_map_module
34.ngx_http_memcached_module
35.ngx_http_mirror_module
36.ngx_http_mp4_module
37.ngx_http_perl_module
38.ngx_http_proxy_module
39.ngx_http_random_index_module
40.ngx_http_realip_module
41.ngx_http_referer_module
42.ngx_http_rewrite_module
43.ngx_http_scgi_module
44.ngx_http_secure_link_module
45.ngx_http_session_log_module
46.ngx_http_slice_module
47.ngx_http_spdy_module
48.ngx_http_split_clients_module
49.ngx_http_ssi_module
50.ngx_http_ssl_module
51.ngx_http_status_module
52.ngx_http_stub_status_module
53.ngx_http_sub_module
54.ngx_http_upstream_conf_module
55.ngx_http_upstream_hc_module
56.ngx_http_upstream_module
57.ngx_http_userid_module
58.ngx_http_uwsgi_module
59.ngx_http_v2_module
60.ngx_http_xslt_module
61.ngx_mail_auth_http_module
62.ngx_mail_core_module
63.ngx_mail_imap_module
64.ngx_mail_pop3_module
65.ngx_mail_proxy_module
66.ngx_mail_smtp_module
67.ngx_mail_ssl_module
68.ngx_stream_access_module
69.ngx_stream_core_module
70.ngx_stream_geoip_module
71.ngx_stream_geo_module
72.ngx_stream_js_module
73.ngx_stream_limit_conn_module
74.ngx_stream_log_module
75.ngx_stream_map_module
76.ngx_stream_proxy_module
77.ngx_stream_realip_module
78.ngx_stream_return_module
79.ngx_stream_split_clients_module
80.ngx_stream_ssl_module
81.ngx_stream_ssl_preread_module
82.ngx_stream_upstream_hc_module
83.ngx_stream_upstream_module