通配符名称

正則表達式名称

混合名称

优化

兼容性

server名称定义使用的server_name指令和决定哪个server块用于一个给定的请求。

參见“怎样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$;
...
}

当通过名称搜索虚拟server时,假设名称与指定的变体(比如通配符名称和正則表達式匹配)中的一个匹配。则将依照下列顺序选择第一匹配变体:

1.确切的名字

2.最长通配符名称以星号開始,比如“*.abc.com

3.最长通配符名称以星号结尾,比如“mail.*”

4.第一匹配的正則表達式(以配置文件的外观顺序)

通配符的名字通配符名称可能仅仅包括在名称的開始或结束。仅仅有在点边界。名称为“。比如。

org”和“W *演示样例。org”无效。然而,这些名称能够使用正則表達式来指定。比如,“\\ WWW \ + \实例$ \ $”和“。星号能够匹配几个名称部分。“*。样例。org”比赛不仅www.example.org但www.sub.example.org以及。表单中的一个特殊通配符名称能够用来匹配准确的名称“演示样例”和通配符名称。

通配符

一个通配符可能仅仅在名称的開始或者结束包涵一个*。仅仅在一个边界。

名称 “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 必须以 “~” 字符为起始字符。

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

假设不以 “~” 字符为起始字符,该 server name 将被视为 “准确的主机名” 或者当 server name 包括 “*
时被视为 “通配主机名” (多数情况是非法通配主机名。由于仅仅有当 “*” 在 server name
的起始或结尾时才合法)。

不要忘记设置 “^” 和 “$
锚定符对主机名进行界定。这不是 nginx 的配置语法要求。而是为了使正則表達式能正确匹配。

同一时候也要注意,域名的分隔符 “.” 在正則表達式中应该以 “\” 引用。假设在正則表達式中使用了 “{
和 “}” 字符。应该将整个正則表達式引用起来。由于花括弧在 nginx 配置中也有特殊意义,引用起来以避免被
nginx 错误解析。比如:

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

假设不引用起来,nginx 会启动失败,并显演示样例如以下错误信息:

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

正則表達式的 named capture (使用一个名字对匹配的字符串进行引用)可被视为一个变量,在后面的配置中使用:

server {
server_name ~^(www\.)? (?<domain>.+)$; location / {
root /sites/$domain;
}
}

PCRE 库支持 named capture。有例如以下几种语法:

?<name>        Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
? P<name> Python compatible syntax, supported since PCRE-4.0

可參考:pcre2pattern

 \d     any decimal digit
\D any character that is not a decimal digit
\h any horizontal white space character
\H any character that is not a horizontal white space character
\s any white space character
\S any character that is not a white space character
\v any vertical white space character
\V any character that is not a vertical white space character
\w any "word" character
\W any "non-word" character

假设 nginx 启动失败,并显演示样例如以下信息:

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

这表示 PCRE 库太老旧。可尝试使用 “?P<name>” 替代 “?<name>”。

named capture 也能以数字形式使用:

server {
server_name ~^(www\.)? (.+)$; location / {
root /sites/$2;
}
}

不管怎样。数字形式的使用应尽量简单,由于数字是仅仅是顺序标识,而不是被匹配的字符串的标识。这导致数字引用非常easy被覆盖。

混杂主机名


有一些主机名是被特殊对待的。

对于没有定义 “Host” 请求首部的请求。假设希望在某个 server 区块中处理这种请求,应在 server_name 指令的參数中加入 "" 空字符串參数:

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

在《nginx 是怎样处理訪问请求的》一文中以前介绍过,假设 server 区块中未定义 server_name 指令,便如同定义了 server_name ""。

Note:
在 0.8.48 版曾经,遇到 server 区块中未定义 server_name 指令的情况,
会将系统的主机名设置为 server 区块的 server name,而不是自己主动设置 "" 为
server name。

在 0.9.4 版本号,假设设置:server_name $hostname,会将系统的主机名设置为 server
name。

假设某个訪问使用了 IP 地址 而不是 server name,“Host” 请求首部会包括 IP 地址。对于这种请求,可使用例如以下的配置:

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

以下是一个 catch-all server 区块的配置。使用了 “_” 作为 server name:

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

这个 server name 并没有什么特殊之处。它仅是一个无效的域名而已。也能够使用其它类似的名字。如 “--” and “!@#” 。

0.6.25 版以前的 nginx 以前支持一个特殊的 server name: “*”。这个特殊主机名被错误的解释成一个
catch-all 主机名。但它从未以一个 catch-all 或者 通配主机名工作。它的功能实际上与如今的 server_name_in_redirect 指令的功能同样:server_name_in_redirect

特殊的 server name “*” 如今已经被弃用,应使用 server_name_in_redirect
指令。

要注意的是。使用 server_name 指令无法指定 defalt server 或是 catch-all name,这是 listen 指令的属性,不是 server_name 指令的属性。

可參考《nginx 是怎样处理訪问请求的》。

我们能够定义两个 server,它们都同一时候监听于 *:80 port 和 *:8080 port。将当中一个设置为 *:80 port的默认 server,将还有一个设置为 *:8080 port的默认 server:

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

对主机名的优化


准确的主机名、以 “*” 起始的通配主机名、以 “*
结尾的通配主机名,这三种主机名被存放在三个 hash table 中。这三个 hash table 是与监听port绑定的。

hash table 的大小在配置阶段被优化。优化的目的是努力减少这些名字在 CPU 缓存中命中失败的几率。关于设置 hash table 的具体讨论请參考:hash

在匹配主机名时,首先查找“准确主机名”的 hash table,假设没有找到。会查找以 “*” 起始的“通配主机名”的
hash table,假设没有仍未找到。会查找以 “*” 结尾的“通配主机名”的 hash table。

对于“通配主机名”的 hash table 的检索会更慢,由于是以主机名的域名部分去检索的。

注意,对于特殊的通配主机名,形如 “.example.org”,这种主机名是存放在“通配主机名”的 hash table 中,而不是存放在“准确主机名”的 hash table 中。

假设前面都未找到。正則表達式会按写在配置文件里的顺序被測试,因此正則表達式是最慢的方法。而且没有可扩展性。

由于以上这些原因。在可能的情况下最好使用 “准确的主机名”。比如。假设对于 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 context 中调整这个两个參数:

server_names_hash_bucket_size 指令的默认值可能为 32 或 64 或 其它数字。这是依据
CPU 缓存线大小而定的。

假设默认值为 32。并且定义了一个 server name 为:“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 的值。设置为大于 server
name 总数的值。

假设这样设置仍不能让 nginx 正常启动。或者 nginx 启动的时间变得过长,再尝试添加 server_names_hash_bucket_size 的值。

假设一个 server 是某个监听port唯一的 server,这时 nginx 根本不会去測试 server name。同一时候也不会为该监听port构建 hash table。

但当中又有一个例外,假设 server name 是正則表達式,并且正則表達式中包括了 captures,这时 nginx 不得不运行该正則表達式以获取 captures。

(正則表達式的 capture 是指被圆括号引用的表达式部分。它们所匹配的字符串,可通过名字或数字引用)

兼容性


从 0.9.4 開始支持特殊主机名 “$hostname”

从 0.8.48 開始,假设 server 区块中没有定义 server_name 指令,nginx 默认设定空字符串为主机名,如同定义了 server_name ""

从 0.8.25 開始支持在“正則表達式主机名”中使用 named capture 特性

从 0.7.40 開始支持在“正則表達式主机名”中使用 capture 特性

从 0.7.12 開始支持 "" 空字符串主机名

从 0.6.25 開始,支持使用“正則表達式主机名”或者“通配主机名”作为第一个主机名。

从 0.6.7 開始支持“正則表達式主机名”

从 0.6.0 開始支持形如 example.* 的“通配主机名”

从 0.3.18 開始支持形如 .example.org 的特殊“通配主机名”

从 0.1.13 開始支持形如 *.example.org 的“通配主机名”

翻译:http://nginx.org/en/docs/http/server_names.html

nginx Server names的更多相关文章

  1. 多进程端口监听 How nginx processes a request Server names

    网络编程( 六):端口那些事儿 - 知乎专栏  https://zhuanlan.zhihu.com/p/20365900 不停服务reload.restart 多进程端口监听 我们都有一个计算机网络 ...

  2. 配置 nginx server 出现nginx: [emerg] "root" directive is duplicate in /etc/nginx/server/blogs.conf:7

    在配置nginx 虚拟机时,执行 sudo /usr/sbin/nginx -t 报下面的错误: nginx: [emerg] nginx: configuration file /etc/nginx ...

  3. TinyCore Nginx server with php-cgi and vsftpd

    http://blog.matchgenius.com/tinycore-nginx-server-with-php-cgi-and-vsftpd/ Create fast testing serve ...

  4. 用Keepalived搭建双Nginx server集群,防止单点故障

    综述: 浏览器访问虚拟IP: 192.168.1.57, 该虚拟IP被Keepalived接管,两个Keepalived进程分别运行在物理IP为192.168.1.56和192.168.1.59服务器 ...

  5. nginx server中的server_name配置的域名在客户机上无法访问

    nginx配置如下: nginx.conf: #user nobody; worker_processes 2; #error_log logs/error.log; #error_log logs/ ...

  6. How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu

    sudo apt-get update sudo apt-get install nginxsudo mkdir -p /var/www/example.com/html sudo chown -R ...

  7. NGINX server配置中if的用法

    server的配置以php为例,如下: 1 server{ 2 root /var/webproject/www/mytools-php; 3 index index.html index.php; ...

  8. nginx server

    配置nginx 首先apt install nginx 然后安装php apt-get install php7.0-fpm php7.0-mysql php7.0-common php7.0-mbs ...

  9. Nginx server之Nginx添加ssl支持

    //环境介绍 1.nginx服务器:10.10.54.157 2.配置nginx服务器,当监听到来自客户端www.zijian.com:80请求时,转到10.10.54.150:1500这个web服务 ...

随机推荐

  1. Asp.Net 之 禁用TextBox的记忆功能

    IE提供了一个自动完成功能可以记忆我们的输入内容(如登录帐号等),方便下一次快速地录入类似资料.这确实是一个非常友好的功能,在操作时只需用鼠标双击文本框或输入前几个字符,系统会自动列出以前的录入历史供 ...

  2. Web Worker是什么

    .Web Worker是什么 Web Worker 是HTML5标准的一部分,这一规范定义了一套 API,它允许一段JavaScript程序运行在主线程之外的另外一个线程中.Web Worker 规范 ...

  3. 方法(method)和函数(function)有什么区别?

    方法(method)和函数(function)有什么区别? 定义和参数区别 函数是独立的功能,与对象无关,需要显示的传递数据 方法与对象和类相关,依赖对象而调用,可以直接处理对象上的数据,也就是隐式传 ...

  4. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  5. BIEE11G配置Oracle 12c数据源

    方法一:直接在连接池中输入连接信息 将tnsname.ora里配置的连接信息等号后面的字符串去掉空格和换行符即可) (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)( ...

  6. Mingw编译DLib

    Mingw编译DLib 因为机器上安装了qt-opensource-windows-x86-mingw530-5.8.0,所以准备使用其自带的mingw530来编译DLib使用. 因为DLib使用CM ...

  7. Arduino的光敏传感器和超声波测距传感器测试代码

    光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...

  8. selectAll, unSelectAll两个操作的实现

    private void updateBatchSelectionStatus() {     ContactListAdapter.ViewHolder viewHolder = null;     ...

  9. android 用代码画虚线边框背景

                   1.虚线画效果,可以使用Android中的xml来做. 2.直接上代码: <RelativeLayout android:id="@+id/coupon_ ...

  10. tomcat启动dubbo报IO异常

    严重: Servlet [springDispatcher] in web application [/dubbo-service] threw load() exception java.io.IO ...