nginx Server names
通配符名称
正則表達式名称
混合名称
优化
兼容性
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的更多相关文章
- 多进程端口监听  How nginx processes a request Server names
		
网络编程( 六):端口那些事儿 - 知乎专栏 https://zhuanlan.zhihu.com/p/20365900 不停服务reload.restart 多进程端口监听 我们都有一个计算机网络 ...
 - 配置 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 ...
 - TinyCore Nginx server with php-cgi and vsftpd
		
http://blog.matchgenius.com/tinycore-nginx-server-with-php-cgi-and-vsftpd/ Create fast testing serve ...
 - 用Keepalived搭建双Nginx server集群,防止单点故障
		
综述: 浏览器访问虚拟IP: 192.168.1.57, 该虚拟IP被Keepalived接管,两个Keepalived进程分别运行在物理IP为192.168.1.56和192.168.1.59服务器 ...
 - nginx server中的server_name配置的域名在客户机上无法访问
		
nginx配置如下: nginx.conf: #user nobody; worker_processes 2; #error_log logs/error.log; #error_log logs/ ...
 - 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 ...
 - NGINX server配置中if的用法
		
server的配置以php为例,如下: 1 server{ 2 root /var/webproject/www/mytools-php; 3 index index.html index.php; ...
 - nginx server
		
配置nginx 首先apt install nginx 然后安装php apt-get install php7.0-fpm php7.0-mysql php7.0-common php7.0-mbs ...
 - Nginx server之Nginx添加ssl支持
		
//环境介绍 1.nginx服务器:10.10.54.157 2.配置nginx服务器,当监听到来自客户端www.zijian.com:80请求时,转到10.10.54.150:1500这个web服务 ...
 
随机推荐
- 007-Go package 说明
			
1:在项目src下面存在两个目录,每个目录里面各有一个go文件 2:add.go package test02 func Add(a int, b int) int{ return a + b } 注 ...
 - JAVA的PreparedStatement和addBatch()方法
			
本文介绍两个内容,为什么使用PreparedStatement的addBatch()方法?以及使用PreparedStatement的好处. 一.addBatch使用方法 昨天用JAVA做了一个导表的 ...
 - flume监控
			
Flume本身提供了http, ganglia的监控服务,而我们目前主要使用zabbix做监控.因此,我们为Flume添加了zabbix监控模块,和sa的监控服务无缝融合. 另一方面,净化Flume的 ...
 - pip安装psutil模块时候报错:yum install python-devel mysql-devel zlib-devel openssl-devel
			
yum install python-devel mysql-devel zlib-devel openssl-devel [root@localhost software]# pip install ...
 - sell 项目  商品表 设计 及 创建
			
1.数据库表之间的关系说明 2.数据库设计 3.创建 商品表 /** * 商品表 */ create table `product_info` ( `product_id` varchar(32) n ...
 - Java多线程之创建线程的三种方式比较
			
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6560057.html 一:继承Thread类创建线程 1:继承Thread类定义线程子类: 2:重写run( ...
 - Java并发容器之CopyOnWriteArraySet与ConcurrentSkipListSet
			
一:CopyOnWriteArraySet CopyOnWriteArraySet底层其实是通过CopyOnWriteArrayList来实现的,通过组合一个CopyOnWriteArrayList作 ...
 - 【DB2】表函数监控数据库
			
1.快照表函数 在DB2 V9中能够使用SQL表函数捕获快照,以下是部分表函数列表: 快照表函数 返回的信息 SNAPSHOT_DBM ...
 - Kinect2.0获取关节姿态(Joint Orientation)
			
Bones Hierarchy 骨骼层次结构从SpineBase作为根节点开始,一直延伸到肢体末端(头.指尖.脚): 层级结构如下图所示: 通过IBody::GetJointOrientations函 ...
 - Eclipse和MyEclipse使用技巧--MyEclipse下创建的项目导入到Eclipse中详细的图文配置方法
			
一.情景再现. 有些人比较喜欢用Myeclipse开发,有些人却比较喜欢用eclipse开发.但是其中有一个问题,Myeclipse里面的项目导入的时候出现了一个小小的问题. 如下: 二.说明问题 导 ...