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
結果是:=
相關文章
相關標籤/搜索