nginx.conf 配置详解 nginx location优先级

 

events配置部分

worker_connections 1024;html

定义每一个work_process同时开启的最大链接数,即容许最多只能有这么多链接。linux

accept_mutex on;

当某一个时刻只有一个网络链接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗必定的服务器性能。 Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收链接时进行序列化,防止多个进程争抢资源。 默认就是on。nginx

multi_accept on;

nginx worker processer能够作到同时接收多个新到达的网络链接,前提是把该参数设置为on。 默认为off,即每一个worker process一次只能接收一个新到达的网络链接。bash

use epoll;

Nginx服务器提供了多个事件驱动器模型来处理网络消息。
其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。

* select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用

* poll:Nginx默认首选,但不是在全部系统下均可用

* kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的

* epoll: 这种方式是在Linux 2.6+内核中最高效的方式

* rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中

* /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操做系统最高效的方式

* eventport: Solaris 10最高效的方式

 

rewrite中的break和last

两个指令用法相同,但含义不一样,须要放到rewrite规则的末尾,用来控制重写后的连接是否继续被nginx配置执行(主要是rewrite、return指令)。服务器

示例1(连续两条rewrite规则):
server{
    listen 80; 
    server_name test.com;
    root /tmp/123.com;网络

    rewrite /1.html /2.html ;
    rewrite /2.html /3.html ;
    
}
当咱们请求1.html时,最终访问到的是3.html,两条rewrite规则前后执行。curl

 

break和last在location {}外部性能

格式:rewrite xxxxx  break;测试

示例2(增长break):
server{
    listen 80; 
    server_name test.com;
    root /tmp/123.com;
url

    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
}
当咱们请求1.html时,最终访问到的是2.html
说明break在此示例中,做用是再也不执行break如下的rewrite规则。

但,当配置文件中有location时,它还会去执行location{}段的配置(请求要匹配该location)。

示例3(break后面还有location段):
server{
    listen 80; 
    server_name test.com;
    root /tmp/123.com;

    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
    location /2.html {
        return 403;
    }
}
当请求1.html时,最终会返回403状态码,说明它去匹配了break后面的location{}配置。

以上2个示例中,能够把break替换为last,它们二者起到的效果如出一辙。

 

当break和last在location{}里面

#示例4(什么都不加):
server{
    listen 80; 
    server_name test.com;
    root /tmp/123.com;
    
    location / {
        rewrite /1.html /2.html;
        rewrite /2.html /3.html;
    }
    location /2.html
    {
        rewrite /2.html /a.html;
    }
    location /3.html
    {
        rewrite /3.html /b.html;
    }
}
#当请求/1.html,最终将会访问/b.html,连续执行location /下的两次rewrite,跳转到了/3.html,而后又匹配location /3.html

#示例5(增长break):
server{
    listen 80; 
    server_name test.com;
    root /tmp/123.com;
    
    location / {
        rewrite /1.html /2.html break;
        rewrite /2.html /3.html;
    }
    location /2.html
    {
        rewrite /2.html /a.html;
    }
    location /3.html
    {
        rewrite /3.html /b.html;
    }
}
#当请求/1.html,最终会访问/2.html
#在location{}内部,遇到break,本location{}内以及后面的全部location{}内的全部指令都再也不执行。


#示例6(增长last):
server{
    listen 80; 
    server_name test.com;
    root /tmp/123.com;
    
    location / {
        rewrite /1.html /2.html last;
        rewrite /2.html /3.html;
    }
    location /2.html
    {
        rewrite /2.html /a.html;
    }
    location /3.html
    {
        rewrite /3.html /b.html;
    }
}
#当请求/1.html,最终会访问/a.html
#在location{}内部,遇到last,本location{}内后续指令再也不执行,而重写后的url再次从头开始,从头至尾匹配一遍规则。

 

  • 当rewrite规则在location{}外,break和last做用同样,遇到break或last后,其后续的rewrite/return语句再也不执行。但后续有location{}的话,还会近一步执行location{}里面的语句,固然前提是请求必需要匹配该location。
  • 当rewrite规则在location{}里,遇到break后,本location{}与其余location{}的全部rewrite/return规则都再也不执行。
  • 当rewrite规则在location{}里,遇到last后,本location{}里后续rewrite/return规则不执行,但重写后的url再次从头开始执行全部规则,哪一个匹配执行哪一个。

 

 nginx location优先级

=  高于  ^~  高于  ~* 等于 ~  高于  /

 

对比/和~

示例1:
server{
    listen 80;
    server_name www.aminglinux.com;
    root /tmp/123.com;

    location /abc/
    {
        echo "/";
    }
    location ~ 'abc'
    {
        echo "~";
    }
}

#测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/1.png'
#结果是:~

 

对比~和~*

示例2:
server
{
    listen 80;
    server_name www.aminglinux.com;
    root /tmp/123.com;

    location ~ 'abc'
    {
        echo '~';
    }
    location ~* 'abc'
    {
        echo '~*';
    }
}
测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/123.html' 
结果是:~

示例3:
server
{
    listen 80;
    server_name www.aminglinux.com;
    root /tmp/123.com;

    location ~* 'abc'
    {
        echo '~*';
    }
    location ~ 'abc'
    {
        echo '~';
    }
}
测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/123.html' 
结果是:~*

结论:~和~*优先级实际上是同样的,若是两个同时出现,配置文件中哪一个location靠前,哪一个生效。

 

对比^~和~

示例4:
server
{
    listen 80;
    server_name www.aminglinux.com;
    root /tmp/123.com;

    location ~ '/abc'
    {
        echo '~';
    }
    location ^~ '/abc'
    {
        echo '^~';
    }
}

测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc/123.html
结果是:^~

 

对比=和^~

示例5:
server
{
    listen 80;
    server_name www.aminglinux.com;
    root /tmp/123.com;

    location ^~ '/abc.html'
    {
        echo '^~';
    }
    location = '/abc.html'
    {
        echo '=';
    }
}

测试命令:curl -x127.0.0.1:80 'www.aminglinux.com/abc.html
结果是:=
相关文章
相关标签/搜索