写在前面

NGINX主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来表示开始与结束。 提示:若编译安装则nginx.conf 位于编译时所指定目录。 我是手动编译安装的,在安装时设置安装文件的路径(将软件安装在:/opt/software/nginx-1.18.0/target目录下),所以配置文件为:/opt/software/nginx-1.18.0/target/conf/nginx.conf

官方文档

LOCATION指令官方指南

LOCATION指令的作用?

NGINX通过将一个请求的URL与LOCATION进行比对判断,决定将该请求使用到哪个LOCATION对应的策略进行处理,可以把LOCATION理解为URL路由,或者当成URL的分发处理器。

配置文件的目录结构

Main层位于nginx.conf 配置文件的最高层;Main层下可以有 EVENTS、HTTP 层;Http层下面允许有多个SERVER块,用于对不同的网站做不同的配置;SERVER块下面允许有多个LOCATION,用于对不同的路径进行不同模块的配置。

1. 全局配置,用来配置对整个 server 都有效的参数,主要设置一些影响NGINX服务器整体运行的配置指令。主要包括配置运行NGINX服务器的用户(组)、允许生成的 worker process 数、进程 PID 存放路径、日志存放路径、类型以及配置文件的引入等。

2. EVENTS层,涉及的指令主要影响NGINX服务器与用户的网络连接。主要包括配置是否开启对多 worker process 下的网络连接进行序列化、是否允许同时接收多个网络连接、选取哪种事件驱动模型来处理连接请求、每个 worker process 可以同时支持的最大连接数等。

3. HTTP层,包括全局层和多个SERVER块。全局块层主要包括配置文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。提示:通常SERVER块配置在独立的:/opt/software/nginx-1.18.0/target/conf/*.conf中,通过引用的方式,在HTTP层调用。

4. SERVER块也被叫做“虚拟主机”部分,它描述的是一组根据不同 server_name 指令逻辑分割的资源,这些虚拟服务器响应HTTP 请求,因此都包含在 http 部分。最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。一个SERVER块可以配置多个LOCATION块。

ROOT指令?

ROOT指令,用于设置请求的根目录,允许NGINX将传入的请求映射到文件系统。

如何配置LOCATION指令?

1. 语法

SERVER块可以包含多个LOCATION块,LOCATION指令用于匹配URI,语法:

location [ = | ~ | ~* | ^~] uri {

... ;

}

location @name {

... ;

}

2. 前缀

= # 普通字符串匹配,精确且严格匹配,第一个被处理,匹配到即停止搜索;

^~ # 普通字符串匹配,按最长匹配执行,匹配到即停止搜索,不匹配其它LOCATION选项,一般用来匹配目录;

空 # 普通字符串匹配,按最长匹配执行,匹配到不停止搜索,还要继续看有没有匹配的正则表达式,

# 例如:location /abc {};

~ # 波浪线,正则匹配,区分大小写;

~* # 波浪线带星,正则匹配,不区分大小写(*表示大小写不敏感,不用区分大小写);

@ # "@" 定义一个命名的 location, 不参与匹配, 在内部重定向时使用,

# 一般用在其他的指令中, 例如:error_page, try_files;

3. 说明

=,精确匹配且第一个被处理,精确匹配成功,停止搜索其他匹配。除了精确匹配,然后执行普通字符匹配(非正则表达式匹配),按最长匹配执行,找到最长前缀匹配的LOCATION块。 举例来说:如果请求的路径是 /abcde,那么 location /abc {} 即使匹配成功,还要再看配置中有没有更长的匹配,如果有 location /abcd {} 的配置,找到这个最长匹配之后,如果URI前面有 ^~ 前缀,则停止搜索其他匹配; 如果没有 ^~ 前缀,那么还要继续看有没有匹配的正则表达式,按正则表达式在配置文件中出现的顺序进行匹配,如果找到一个的正则表达式匹配,则停止搜索其他匹配,执行该匹配的LOCATION块。 当没有正则表达式或者没有正则表达式被匹配的情况时,那么匹配程度最高的且最长前缀匹配 location 会被使用。

4. 注意

匹配优先级: = > ^~ > ~ = ~* > 不带任何字符(最长前缀匹配) > /如果URI包含正则表达式, 则必须要有 ~ 或者 ~* 标识默认大小写敏感

5. 示例

location = / {

# 只精确匹配"/".

[ configuration A ]

}

location = /login {

# 只精确匹配"/login".

[ configuration A+ ]

}

location / {

# 匹配任何请求, 因为所有请求都是以"/"开始

# 但是更长字符匹配或者正则表达式匹配会优先匹配

[ configuration B ]

}

location ^~ /images/ {

# 匹配任何以 /images/ 开始的请求, 并停止匹配其它LOCATION块

[ configuration C ]

}

location ~* .(gif|jpg|jpeg)$ {

# 匹配以 gif, jpg, or jpeg结尾的请求

# 但是所有 /images/ 目录的请求将由 [Configuration C]处理

[ configuration D ]

}

请求URI例子:

/ -> 符合[ configuration A ]

/doc/index.html -> 符合[ configuration B ]

/images/1.gif -> 符合[ configuration C ]

/documents/1.jpg ->符合[ configuration D ]

6. 常用配置

location / {

# 网站根目录

root /usr/share/nginx/html;

# 定义首页文件的名称

index index.html index.htm;

# 禁止访问的IP地址

deny 192.168.22.101;

# 允许访问的IP地址

allow 192.168.33.104;

...;

}

LOCATION指令配置的URI结尾带不带/的区别?

对于请求URI结尾是否带有/,一般的处理逻辑如下:

带/:表示匹配目录; 不带/:表示先匹配文件,如果文件不存在也会去匹配目录。

但是: 对于LOCATION指令中的URI来说,如果URI的结尾带有/,并且LOCATION要执行的命令是proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass、grpc_pass之一时:

location /images/{

proxy_pass http://www.baidu.com

}

对于这种情况,NGINX不管images命名的文件或目录存不存在,如果访问请求为:http://blog.baidu.com/images,则NGINX会将请求重定向到:http://blog.baidu.com/images/。所以如果这两种请求对应不同的处理,就要明确增加不带/结尾的LOCATION指令,如:

location /images {

proxy_pass http://www.baidu.com

}

location /images/ {

proxy_pass http://www.google.com

}

LOCATION指令的配置建议

# 1. 先写精准匹配的匹配规则

location = / {

# 只精确匹配"/".

# 一般首页会非常频繁, 所以设置精准匹配, 提高匹配效率。

[ configuration A ]

}

location = /login {

# 只精确匹配"/login".

# 登录等也会非常频繁, 所以设置精准匹配, 提高匹配效率。

[ configuration A+ ]

}

# 2. 再写排除正则的匹配规则

location ^~ /images/ {

# 匹配任何以 /images/ 开始的请求, 并停止匹配其它LOCATION块

# 排除正则匹配可以配置给一般路径资源, 这样可以提高匹配效率, 因为一旦命中下面的3.(正则的匹配规则) 就不会执行了

[ configuration C ]

}

# 3. 再写正则的匹配规则

location ~* .(gif|jpg|jpeg)$ {

# 匹配以 gif, jpg, or jpeg结尾的请求

# 但是所有 /images/ 目录的请求将由 [Configuration C]处理

# 一般配置给一些特殊路径的资源或者后缀, 可以有多条正则, 越精确的放到前面, 因为正则一旦命中,

# 直接下面的正则就不匹配了

[ configuration D ]

}

# 4. 最后写默认的根路径匹配

location / {

# 匹配任何请求, 因为所有请求都是以"/"开始

# 但是更长字符匹配或者正则表达式匹配会优先匹配, 上面的都不命中的URI, 全部都走这里

[ configuration B ]

}

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: