Nginx配置文件详解

1、location

1.1、location 的匹配规则

location 的语法规则:

location [=|~|~*|^~] /uri/ {
      ...
}

符号含义:

符号 含义
=

开头表示精确匹配

^~ 开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为/static/20%/aa,可以被规则 ^~/static/ /aa匹配到(注意是空格)
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
/ 通用匹配,任何请求都会匹配到

 

 

 

 

 

 

 

同一个 server 中有多个 location 配置的情况下的匹配顺序为:

  1. 首先匹配 =

  2. 其次匹配 ^~

  3. 其次是按文件中顺序的正则匹配

  4. 最后是交给 / 通用匹配

  5. 当匹配成功时候会立即停止匹配,按当前匹配规则的 location 来处理请求

 

示例:

location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location / {
   #规则F
}

效果:

访问根目录 /, 比如 http://localhost/ 将匹配规则 A
访问 http://localhost/login 将匹配规则 B,http://localhost/register 则匹配规则 F
访问 http://localhost/static/a.html 将匹配规则 C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则 D和规则 E,但是规则 D 顺序优先,规则 E不起作用,而 http://localhost/static/c.png则优先匹配到规则 C
访问 http://localhost/a.PNG 则匹配规则 E,而不会匹配规则 D,因为规则 E 不区分大小写
访问 http://localhost/category/id/1111 则最终匹配到规则 F,因为以上规则都不匹配,这个时候应该是 nginx 转发请求给后端应用服务器,比如 FastCGI(PHP),tomcat(jsp),nginx 作为反向代理服务器存在

 

 

1.2、root(服务器资源路径)

Nginx 中的 root 可以在 location 或者直接在 server 中配置,root 指定的是资源存放在服务器中的路径。root 既可以是绝对路径,也可以是相对路径,以 / 开头即为绝对路径。比如 location 中的 root 指定的是这个 location 规则所匹配的资源所存放的资源路径。

相对路径使用示例:

server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
}

上面 location 中 root 所指向的 html 就是一个相对路径,相对的是当前这个配置文件的路径。假设此配置文件的位置是 /etc/nginx/conf.d,那么这个 html 的绝对路径就是 /etc/nginx/conf.d/html/。因此为避免出现不必要的麻烦,在配置 root 路径的过程中最好用绝对路径。

绝对路径使用示例:

server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/local/nginx/html;
            index  index.html index.htm;
        }

        location /webTestProject/ {
            root   /usr/myTestData/;
            index  index.html index.htm;
        }
}

请注意,上面当我们访问 http://ip/webTestProject 时,实际上是访问了服务器中的 /usr/myTestData/webTestProject 路径。也就是说,当配置 root 时,最后访问到的资源路径会加上 location 中匹配到的 url。

 

1.2.1、server中的root和location的root的区别

如果我们同时在 server 和 location 中都设置了 root 路径,例如:

server {
        listen       80;
        server_name  localhost;

        root   /usr/local/nginx2/html;

        location / {
            root   /usr/local/nginx/html;
            index  index.html index.htm;
        }
}

当我们访问服务器命中了 location 的配置时,nginx 的 location 会优先匹配到此代码块,会指向 location 中所配置的 root , server 中的 root 不会生效。当 nginx 找不到匹配到的 location 或者 location 中没有配置 root 时,此时才会使用 server 中的 root 配置。

 

1.3、root 和 alias 的区别

当我们使用 root 指定资源的路径时,最终访问的服务器资源路径会自动加上 location 中的 url 。而 alias 不会,alias 所指定的资源路径就是你所访问的资源路径,这就是它们的区别。

比如说想要把服务器的 /home/source 目录作为资源目录,那么需要如下配置:

location /source/ {
        #识别url路径后,nginx会到/home/文件路径下,去找到/source目录
        root  /home/;
}

我们可以会错误地像下面这样配置:

location /source/ {
        #识别url路径后,跳转到/home/source目录路径下,去再找/source
        root  /home/source;
}

如果按照上面这样的配置方式会出现404的情况,因为/home/source 目录下不一定有/source目录

 

上面的匹配方式比较繁琐,不符合常规逻辑,此时我们可以使用 alias 解决。

比如说想要把 /home/source 目录作为资源目录,使用 alias,那么需要如下配置:

location /source/ {
        #识别url路径后,直接匹配/home/source目录
        alias  /home/source;
}

 

1.4、index(默认页面)

Nginx 可以在 location 中配置 index,index 配置的是网站初始页,也就是默认页面。该指令拥有默认值,index   index.html ,即如果没有给出index,默认初始页为index.html

比如配置如下:

server {
    listen       80;
    server_name  localhost;

    location /webTestProject/ {
        root   /usr/myTestData/;
        index  index.html index.htm;
    }
}

我们可以直接访问 http://ip//webTestProject/,会默认命中服务器中的 /usr/myTestData/webTestProject/index.html 资源。

 

Nginx配置文件详解

上一篇:Docker-搭建私有仓库


下一篇:Filnk实时数仓(Clickhouse)