1、什么是nginx?
Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。
Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。
在微服务的体系之下,Nginx正在被越来越多的项目采用作为网关来使用,配合Lua做限流、熔断等控制。
它的作用主要是体现在三个方面:
- 反向代理
- 负载均衡
- 动态分离
1.1、正向代理
正向代理:对客户端的代理
1.2、反向代理
反向代理:对服务器端的代理
1.3、负载均衡
通过nginx可以配置服务器集群,将原本应该由一台服务器处理的请求,分散到多台服务器共同处理
假设超市促销,有1000人买东西,他们到收银台买单,此时只有一个收银员。此时,超市可以多开放一 些收银窗口,这样可以 共同处理请求,减少单个收银员的压力
配置负载均衡有下列好处:
1、在高并发环境下,大量请求可以分散到多个服务器进行处理,减少单台服务器压力
高并发:大量请求同时访问
2、配置服务器集群,可以实现高可用
高可用:在集群环境下,请求是由多台服务共同处理,即使某一些服务器出现问题,其他正常 的服务器依然可以正常处理请求,不会影响用户体验
1.4、动静分离
将静态资源(例如图片)放在静态资源服务器,将动态资源(例如:数据库的数据)放在web服务器中, 数据从不同的服务器加载,这样可以提高处理效率
2、location规则以及优先级详解
nginx 配置文件里往往有多个location来区分不同的路径来执行不同的配置
2.1、location 匹配命令
- 正则匹配 location ~ /abc { }
- 不区分大小写的正则匹配 location ~* /abc { }
- 匹配路径的前缀,如果找到停止搜索 location ^~ /abc { }
- 精确匹配 location = /abc { }
- 普通路径前缀匹配 location /abc { }
优先级
4 > 3 > 2 > 1 > 5
2.2、详解
location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}
================
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}
location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}
================
location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}
================
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}
================
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}
================
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}
================
location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}
2.3、Location处理逻辑
1.用uri测试所有的prefix string;
2.Uri精确匹配到=定义的loacation,使用这个location,停止搜索;
3.匹配最长prefix string,如果这个最长prefix string带有^~修饰符,使用这个location,停止搜索,否则:
4.存储这个最长匹配;
5.然后匹配正则表达;
6.匹配到第一条正则表达式,使用这个location,停止搜索;
7.没有匹配到正则表达式,使用#4步存储的prefix string的location。
2.4、location 优先级官方文档
- Directives with the = prefix that match the query exactly. If found, searching stops.
- All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
- Regular expressions, in order of definition in the configuration file.
- If #3 yielded a match, that result is used. Else the match from #2 is used.
- =前缀的指令严格匹配这个查询。如果找到,停止搜索。
- 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
- 正则表达式,在配置文件中定义的顺序。
- 如果第3条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。
参考: