极客专栏《Nginx核心知识100讲》46小节、47小节的笔记
46 | Nginx中的正则表达式
当在nginx确定那个域名处理请求时,或者用location匹配哪个url的时候,往往我们使用正则表达式,正则表达式让匹配的功能更加强大。
正则表达式
image.png image.png如何验证你的正则表达式呢?如果放在nginx配置中验证,你需要重启nginx。所以推荐pcretest工具(下载源代码安装)验证。
image.png注意:在nginx使用中不用加转义符
\
,但是在pcretest要使用。
掌握好的正则表达式的使用。可以在配置location、server name 或者rewrite的时候如虎添翼。
留言问题
1.NGINX中的正则用的也是PCRE标准吗
作者回复
是的,configure中可以用--with-pcre=选项指定pcre版本。
47 | 如何找到处理请求的server指令块
在nginx http模块处理请求之前,首先确保它的指令被正确的解析出来了。为了处理请求到底使用哪个指令的值。因为指令的配置可以出现在http下,server下,location下。首先必须确保这个请求时被哪个server块处理。
server name
server name 它可以保证在处理11阶段的http模块处理之前,先决定哪个server块指令被使用。
server name 后面可以跟三种域名
image.png主域名概念。这个主域名有什么用呢?当我们跟多个域名的时候,前面就是主域名。有个控制主域名用法的配置server_name_in_redirect
,默认值是off。可以出现在http,server,location。
redirect off时,主域名是不生效的。主域名怎样用呢?当我们用return这个指令,会做一个302重定向,这个指令后面没有明确的domain只有一个url(/redirect),这个时候会发生什么样的事情呢?
image.png如果redirect off改成on。再返回的location用的就是主域名。这就是主域名的一个用法。
image.png当server_name后面跟正则表达式的时候,这个正则表达式还可以为我们创建新的变量。还是用小括号()分组提取的方式。
image.pngdomain。
server 匹配顺序
image.png上图1,2,3条跟顺序无关,第4条跟文件顺序有关。第5条,如果访问了没有指定的子域名的时候,将会default server处理,保证后面11个阶段各个http模块找到它在server配置块下一个指令的值。default server 有两种指定方式。如果我们没有指定的时候,我们按照顺序来,所有的server大括号块,第一个就是default server。当我们指定了 default。这个listen所属的server块 就将变成default server。
留言问题
1.如果没有server_name指令,只有listen指令,是不是只检查端口就行了?不再检查host了
作者回复
如果所有server{}都没有server_name,那么唯一的就是default server,host匹配不上其他 server_name时,就会选用它
2.如果没有Host头部呢?是不是使用url中的域名做匹配?
作者回复
没有Host头部会报错。
3.server name是和请求中的Host头部做匹配吗?还是和url中的域名做匹配?
作者回复
与Host头部匹配
4.最近在配置nginx反向代理时被location后匹配规则和转发机制给绕晕了,希望您给解答一下
location /test/ {
proxy_pass http://127.0.0.1
}
location /test/ {
proxy_pass http://127.0.0.1/
}
末尾带斜杠,对最后的代理地址会有直接的影响,这是为啥,没想明白
作者回复
当末尾有斜杠时,认为带url了,此时location对请求URL采用替换关系,把location后的url1替换为proxy_pass中的url2。
第4部分课程中会详细介绍。
5.系统内核不应该是和master交互,有master进程调用worker进程处理请求么
作者回复
不是哦,这样性能可以想见会非常差,环节太多!
6.什么场景一下会使用server_name_in_redirect? 如果server_name后面跟3个域名,设置为on时,结果是哪个呢?
作者回复
后面在谈到处理/结尾的url时,会深入谈这个指令。大概在说static模块提供的root/alias指令时,你关注下这一课。
网友评论