【充电】《Nginx核心知识100讲》content阶段:sta
极客专栏《Nginx核心知识100讲》63~65小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
63 | content阶段:详解root和alias指令
content阶段中有一个static 模块 ,这个模块我们可能见不到,但是它提供的root跟alias指令是常见的。它默认是nginx框架中的。我们没办法移出nginx框架。
image.pngstatic模块是五个content阶段指令的最后一个模块。
root 和alias 指令
image.png image.png实例 配置文件
image.pngcurl static.taohui.tech/root/ 会访问location /root
,里面配置的是root html
。会在/root/html下面找index.html。
下面的演示不截图了。自己试试就明白了。
64 | static模块提供的3个变量
三个nginx变量
image.pngdocument_root 是指向文件所属的文件夹,这个文件夹怎么生成的呢?根据root、alias来配合我们location 以及用户请求的url。
realpath_root 跟 document_root有什么差别呢?document_root可能有些软连接。real_path会把软连接替换成真实的路径。
示例
image.png image.png image.pngtype指令
image.png当我们读磁盘上的文件的时候,根据文件的扩展名做一次映射。type指令就是做这样的事情的。
type在做这件事情的时候呢,为了加速需要把content-type跟扩展名做一次映射,放到hash表中。type_hash配置就是来存这些指令的。
default_type,很多时候在用return 的时候或者说身没有文件名来使用type,来告诉用户这个content-type究竟应该怎么填的时候,我们可以使用default_type
找不到文件时的错误日志
image.png留言问题
- “64 static 模块提供的三个指令” 一节中,你举的例子,return 指令在 rewrite 阶段, alias 在 content 阶段,那 alias 应该不执行的,为啥返回 request_filename 还返回了 alias 的值 ?
作者回复
alias是一个值指令,它用来告诉静态文件的目录的,通常它配合content阶段中的模块一起工作。
return指令在rewrite阶段先于content阶段,但它没有去读文件,它只是把3个变量的值取出来返回哦。你可以参见第72课,它介绍了变量的值取出来时,只是拼出一个字符串而已。
2.content_type 映射到Hash表这个没有听明白 麻烦老师帮忙解释一下 谢谢
作者回复
1、static模块读取到文件时,需要根据文件扩展名来确定response中的content-type的值。而types指令里,设置好了哪个扩展名对应哪个content-type值。
2、如果依次查询types中的数组,那么性能太差,于是用hash表来存放types中的名值对,这样static模块可以用O(1)的算法复杂度快速找到content-type.
65 | static模块对url不以斜杠结尾却访问目录的做法
static模块的root 和alias指令,把nginx当成静态资源服务器的时候,很可能发现,当我们去访问一个目录,但是在url结尾没有加/
时候,实际上nginx会返回一个301的重定向。对于301重定向location的内容,nginx提供了三个不同的指令去控制location行为。下面看这三个指令如何影响301重定向的。
URL末尾加/,会有一些不同的结果。比如absolute_redirect,返回301重定向是nginx自动发生的。所以,我们到底要不要填域名呢?默认absolute_redirect 为on,绝对的路径是打开的。所以,这个时候要填域名。如果为off,就不会返回了。如果配置on,返回域名,这个时候我们到底应该返回谁呢?是应该返回请求中的域名?还是返回请求中头部host域名?还是返回server name中所配置的主域名?这是由server_name_in_redirect 来控制的。有时候我们可能有个端口,可能不是80端口,可能是其他端口。这个端口是否要显示在重定向中的域名中呢?可以通过port_in_redirect来控制。
示例
image.png image.png然后注释掉(默认是on,所以注释掉也为on)
image.png image.png这时候把域名都添加进去了。
如果请求头配置了host。那么返回的响应中就会替换掉我们发送的Host。
image.png这个端口号也是可以去掉的。用port_in_redirect控制。如果说现在我希望按照server_name中的配置,比如:server_name的主域名return.taohui.tech,想以这个主域名确认location(响应中重定向的location字段)中的配置。把server_name_in_redirect 打开。
image.png image.png留言问题
1.docker内部nginx监听80端口,映射出来是8080,访问不带斜杠目录的请求时,返回301,但localtion是内部的80端口,这个怎么处理。
作者回复
- 1、如果请求的Host头部含有8080端口,那么server_name_in_redirect off;时的重定向是以Host来填域名的。
- 2、如果docker主机直接对客户端服务,那么只能nginx也监听8080,映射为8080到8080,同时打开port_in_redirect on;
- 3、docker主机前有负载均衡,可以由该LB决定路由端口。
2.演示中没有看到 rewrite 指令啊 在哪里做的 rewrite
作者回复
这是nginx的内部机制,自动跳转的,不需要我们显示的配置rewrite指令。