찾다
백엔드 개발PHP 튜토리얼Nginx 가상 서버 도메인 이름 구성 방법

Nginx 가상 서버 도메인 이름 구성 방법

Mar 27, 2018 pm 02:32 PM
nginx섬기는 사람구성

이 글에서는 주로 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인 경우 동시에 일치할 수 있습니다.

server_name *.example.com * .com www.example.com www.example.* www.* ~^(.+).example.com$

server_name www.example.com 모두 6개의 명령 매개변수가 있습니다. 일치

, 최종 선택은 어느 것입니까?

특정 순서가 있습니다

:


  1. 정확한 도메인 이름 일치, www.example.com

  2. 와일드 카드 *, , *.example.com

  3. 으로 시작하는 가장 긴 도메인 이름

    와일드카드 *로 끝나는 가장 긴 도메인 이름 , www.example.*

  4. 그리고 마지막으로 정규식 형식으로 구성 파일에 나타나는 순서대로 일치를 시도하고 일치하는 첫 번째 것을 선택합니다. 도메인 이름 ~^(.+).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  "~^(?\w\d{1,3}+)\.example\.net$";

如果不加引号,nginx便无法正确加载配置文件,并报一个错误:

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


正则表达式使用命名捕获组,例如:

server {
    server_name ~^(?<myname>.+)\.example\.cn$;
    root /var/www/hb/$myname;   
}


PCRE语法支持下面几种捕获语法:

?<name>
?&#39;name&#39;
?P<name>

前面两者是最新的语法,第三种是老的写法。如果nginx报下面错误:

pcre_compile() failed: unrecognized character after (?

说明,你应该将?或者?'name'改为较古老的?P写法了。


同样,使用普通捕获组也是可以的:

server {
    server_name ~^(.+)\.example\.cn$;
    root /var/www/hb/$1;  
}

当然,普通捕获组要慎用,因为很容易被后面的正则所覆盖。


其他形式

除了两面提到的几种形式,sername_name的指令参数还有可能是其他的几种形式。

如果请求Request没有Host的头部,那么如果想要匹配,可以用空字符串:

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


另外,如果在server上下文中,没有定义 server_name,那么nginx使用空字符串作为虚拟机名称。

如果使用IP而不是域名来发起请求,那么Host请求头就是一个IP,此时server_name也可以写成一个IP:

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


"_"可以用来匹配所有的域名

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

其他的字符,"-"和"!@#"也是可以的。注意,匹配所有域名的不能是"*"


最佳实践

我们知道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的性能达到最大化。

例如:

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

这种方式要优于:

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

长域名,多域名的情况

在某些情况下,域名会非常的长,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

解决方式:

http {
    server_names_hash_bucket_size  64;
    ...

在另一些情况下,server_name配置的域名又很多,nginx同样可能报错:
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_names_hash_bucket_size的值(例如将2^N调整到2^(N+1))

http {
    server_names_hash_max_size:600
    server_names_hash_bucket_size 32;
    ...

如果一个域名是某个监听端口下的唯一域名,那么nginx就不会建立Hash匹配表,也不会有上面介绍的那些匹配流程,然而,如果这个唯一的域名是一个捕获组正则表达式,那么nginx还是去尝试去解析正则表达式以提取这个字段。

相关推荐:

php虚拟服务器主机

위 내용은 Nginx 가상 서버 도메인 이름 구성 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP와 Python : 다른 패러다임이 설명되었습니다PHP와 Python : 다른 패러다임이 설명되었습니다Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP와 Python : 그들의 역사에 깊은 다이빙PHP와 Python : 그들의 역사에 깊은 다이빙Apr 18, 2025 am 12:25 AM

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

PHP와 Python 중에서 선택 : 가이드PHP와 Python 중에서 선택 : 가이드Apr 18, 2025 am 12:24 AM

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP 및 프레임 워크 : 언어 현대화PHP 및 프레임 워크 : 언어 현대화Apr 18, 2025 am 12:14 AM

PHP는 현대화 프로세스에서 많은 웹 사이트 및 응용 프로그램을 지원하고 프레임 워크를 통해 개발 요구에 적응하기 때문에 여전히 중요합니다. 1.PHP7은 성능을 향상시키고 새로운 기능을 소개합니다. 2. Laravel, Symfony 및 Codeigniter와 같은 현대 프레임 워크는 개발을 단순화하고 코드 품질을 향상시킵니다. 3. 성능 최적화 및 모범 사례는 응용 프로그램 효율성을 더욱 향상시킵니다.

PHP의 영향 : 웹 개발 및 그 이상PHP의 영향 : 웹 개발 및 그 이상Apr 18, 2025 am 12:10 AM

phphassignificallyimpactedwebdevelopmentandextendsbeyondit

스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?Apr 17, 2025 am 12:25 AM

PHP 유형은 코드 품질과 가독성을 향상시키기위한 프롬프트입니다. 1) 스칼라 유형 팁 : PHP7.0이므로 int, float 등과 같은 기능 매개 변수에 기본 데이터 유형을 지정할 수 있습니다. 2) 반환 유형 프롬프트 : 기능 반환 값 유형의 일관성을 확인하십시오. 3) Union 유형 프롬프트 : PHP8.0이므로 기능 매개 변수 또는 반환 값에 여러 유형을 지정할 수 있습니다. 4) Nullable 유형 프롬프트 : NULL 값을 포함하고 널 값을 반환 할 수있는 기능을 포함 할 수 있습니다.

PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?Apr 17, 2025 am 12:24 AM

PHP에서는 클론 키워드를 사용하여 객체 사본을 만들고 \ _ \ _ Clone Magic 메소드를 통해 클로닝 동작을 사용자 정의하십시오. 1. 복제 키워드를 사용하여 얕은 사본을 만들어 객체의 속성을 복제하지만 객체의 속성은 아닙니다. 2. \ _ \ _ 클론 방법은 얕은 복사 문제를 피하기 위해 중첩 된 물체를 깊이 복사 할 수 있습니다. 3. 복제의 순환 참조 및 성능 문제를 피하고 클로닝 작업을 최적화하여 효율성을 향상시키기 위해주의를 기울이십시오.

PHP vs. Python : 사용 사례 및 응용 프로그램PHP vs. Python : 사용 사례 및 응용 프로그램Apr 17, 2025 am 12:23 AM

PHP는 웹 개발 및 컨텐츠 관리 시스템에 적합하며 Python은 데이터 과학, 기계 학습 및 자동화 스크립트에 적합합니다. 1.PHP는 빠르고 확장 가능한 웹 사이트 및 응용 프로그램을 구축하는 데 잘 작동하며 WordPress와 같은 CMS에서 일반적으로 사용됩니다. 2. Python은 Numpy 및 Tensorflow와 같은 풍부한 라이브러리를 통해 데이터 과학 및 기계 학습 분야에서 뛰어난 공연을했습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전