이 글에서는 주로 Nginx 가상 서버 도메인 이름 구성 방법을 공유합니다. 가상 서버 이름(서버 이름)은 server_name 명령을 통해 지정됩니다. 존재하다"
Nginx는 요청을 어떻게 처리합니까? "섹션에서 우리는 두 단계로 들어오는 요청 요청과 일치하는 nginx에 대해 이야기했습니다.
1. 서버 선택
2. 위치 선택
1단계에는 실제로 두 단계가 있습니다.
1) . 포트 일치
2). server_name 일치
이 섹션에서는 nginx가 어떻게 server_name과 일치하는지 설명합니다.
server_name 명령에는
3가지 형식이 있습니다.
1. 정확한 도메인 이름 형식(정확한 이름)
2. 와일드카드(*) 형식
3.
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$; ... }
정방향 와일드카드
와역방향 와일드카드로 구분됩니다(각각 두 번째 및 세 번째 예 참조). 와일드카드는 문자열 중간에 위치할 수 없습니다.
물론 호스트가 위 세 가지 형식 중 하나 이상과 동시에 일치하는 상황이 있습니다. 예를 들어 호스트가 www.example.com인 경우 동시에 일치할 수 있습니다.
, 최종 선택은 어느 것입니까?
특정 순서가 있습니다: 정확한 도메인 이름 일치, www.example.com 와일드 카드 *, , *.example.com 와일드카드 *로 끝나는 가장 긴 도메인 이름 , www.example.* 그리고 마지막으로 정규식 형식으로 구성 파일에 나타나는 순서대로 일치를 시도하고 일치하는 첫 번째 것을 선택합니다. 도메인 이름 ~^(.+).example.com$ 에는 매우 간단하고 정확한 도메인 이름 형식이 있습니다. 다음으로 각각 server_name의 와일드카드 및 정규식 형식을 소개하겠습니다. 와일드카드 서버 이름에 *를 사용하는 것은 매우 엄격합니다. 는 도메인 이름의 머리나 꼬리에만 위치할 수 있고 중간에는 위치할 수 없으며 "."로 구분해야 합니다. : *.example.com www.example.* 다음은 불법적인 형식입니다. www.*.example.org w*.example.org 물론, 마지막 두 가지를 달성하려는 경우 작성자가 반영한 목적에 맞게 정규식을 사용할 수 있습니다. 예를 들어 위의 두 가지 불법 도메인 이름은 다음과 같이 작성할 수 있습니다. ~^www..+.example.org$ ~^w.*.example.org $ 또 다른 특수 형식은 example.org 및 *.example.org 모두와 일치할 수 있습니다. 이는 .example.org 正则表达式 nginx的正则表达式语法使用的是Perl语言(PCRE)的正则语法。基本形式为 server_name ~^www\d+\.example\.net$; 这则表达式需要注意的几点 必须以~开始,没有~符号的要么被视作完全匹配或者通配符匹配 ~和正则表达式主体之间没有空格 正则表达式主体通常以^开始以$结束(虽说语法上不一定要求如此,但是从逻辑意义上强烈要求这么做)。 正则表达式中,点号"."必须转义,写作"\.";正则表达式可以不用引号包住,但是,如果其中包含"{"和"}"则必须用双引号包裹 例如: server_name "~^(? 如果不加引号,nginx便无法正确加载配置文件,并报一个错误: directive "server_name" is not terminated by ";" in ... 正则表达式使用命名捕获组,例如: PCRE语法支持下面几种捕获语法: 前面两者是最新的语法,第三种是老的写法。如果nginx报下面错误: pcre_compile() failed: unrecognized character after (?< in ... 说明,你应该将? 同样,使用普通捕获组也是可以的: 当然,普通捕获组要慎用,因为很容易被后面的正则所覆盖。 其他形式 除了两面提到的几种形式,sername_name的指令参数还有可能是其他的几种形式。 如果请求Request没有Host的头部,那么如果想要匹配,可以用空字符串: 另外,如果在server上下文中,没有定义 server_name,那么nginx使用空字符串作为虚拟机名称。 如果使用IP而不是域名来发起请求,那么Host请求头就是一个IP,此时server_name也可以写成一个IP: "_"可以用来匹配所有的域名 其他的字符,"-"和"!@#"也是可以的。注意,匹配所有域名的不能是"*"。 最佳实践 我们知道nginx是一个款高性能的web服务器,其设计充满了许多优化的技巧。在使用的时候也不例外,如果我们能对nginx的设计原理有一些了解,我们在配置时就能很好的利用这些设计,从而使得nginx的效率达到最大化。 前面提到,server_name的指令参数匹配有一定的匹配顺序,即最先匹配精确域名形式,然后匹配以通配符*开始的域名,其次匹配以通配符*结束的域名,最后是匹配正则形式。如果前面匹配到了,就会终止继续匹配。 从原理上说,这是因为,nginx会为每个监听的port分别维护精确域名,前向通配符和后项通配符的Hash表。Hash表能在nginx启动的配置阶段得到创建和优化。精确域名的Hash表首先被搜寻,如果找不到,前向通配Hash表会被接着被搜寻,如果也没有找到,那么后向通配Hash表会被搜寻。搜寻通配Hash表要比精确域名Hash表要慢,因为其是按照域名的部分来做搜寻的(比如,*.example.com,会搜寻example和com部分)。 值得注意的是:".example.org"被存在通配Hash表里面,并没有存在精确Hash表里面,因此匹配它是较慢的。 如果以上两种方式都还没有匹配上,那么最后轮到正则形式的指令上场了。正则形式的域名是按照先后顺序一个一个的去匹配的,没有存入任何Hash表,匹配到正确的就结束,因此,这是最慢的形式,没有任何“技巧”可言。 因此,最好的配置方式就是,尽可能使用精确域名,其次是通配符形式的,最后是正则形式。即便是正则形式域名,也要根据实际需要将用的最多的域名尽量前置。这样方可使得nginx的性能达到最大化。 例如: 这种方式要优于: 长域名,多域名的情况 在某些情况下,域名会非常的长,nginx不会允许其无限长,默认最大为32。在http上下文中,你可以通过server_names_hash_bucket_size指令来设置,可选参数有32,64(2的N次方)等 例如,如果域名被定义为:"too.long.server.name.example.org",超过32字符,那么会报错: could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32 解决方式: 在另一些情况下,server_name配置的域名又很多,nginx同样可能报错: you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32 这种情况下,先设置server_names_hash_max_size为一个接近你域名总数的一个合理值,如果这个还不管用,那么再调大server_names_hash_bucket_size的值(例如将2^N调整到2^(N+1))server {
server_name ~^(?<myname>.+)\.example\.cn$;
root /var/www/hb/$myname;
}
?<name>
?'name'
?P<name>
server {
server_name ~^(.+)\.example\.cn$;
root /var/www/hb/$1;
}
server {
listen 80;
server_name example.org www.example.org "";
...
}
server {
listen 80;
server_name example.org
www.example.org
""
192.168.1.1
;
...
}
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 80;
server_name example.org www.example.org *.example.org;
...
}
server {
listen 80;
server_name .example.org;
...
}
http {
server_names_hash_bucket_size 64;
...
could not build the server_names_hash,http {
server_names_hash_max_size:600
server_names_hash_bucket_size 32;
...
如果一个域名是某个监听端口下的唯一域名,那么nginx就不会建立Hash匹配表,也不会有上面介绍的那些匹配流程,然而,如果这个唯一的域名是一个捕获组正则表达式,那么nginx还是去尝试去解析正则表达式以提取这个字段。
相关推荐:
위 내용은 Nginx 가상 서버 도메인 이름 구성 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!