写在前面
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 ]
}