天天看点

Nginx 配置指令的执行顺序(七)

来看一个 <code>ngx_static</code> 模块服务磁盘文件的例子。我们使用下面这个配置片段:

同时在本机的 <code>/var/www/</code> 目录下创建两个文件,一个文件叫做 <code>index.html</code>,内容是一行文本 <code>this is my home</code>;另一个文件叫做 <code>hello.html</code>,内容是一行文本 <code>hello world</code>. 同时注意这两个文件的权限设置,确保它们都对运行 Nginx worker 进程的系统帐户可读。

    现在来通过 HTTP 协议请求一下这两个文件所对应的 URI:

我们看到,先前创建的那两个磁盘文件的内容被分别输出了。

    那么“配置前缀”是由什么来决定的呢?默认情况下,就是 Nginx 安装时的根目录(或者说 Nginx 构造时传递给 <code>./configure</code> 脚本的 <code>--prefix</code> 选项的路径值)。如果 Nginx 安装到了 <code>/usr/local/nginx/</code> 下,则“配置前缀”便是 <code>/usr/local/nginx/</code>,同时默认的“文档根目录”便是 <code>/usr/local/nginx/html/</code>. 不过,我们也可以在启动 Nginx 的时候,通过 <code>--prefix</code> 命令行选项临时指定自己的“配置前缀”路径。假设我们启动 Nginx 时使用的命令是

则对于该服务器实例,其“配置前缀”便是 <code>/home/agentzh/test/</code>,而默认的“文档根目录”便是<code>/home/agentzh/test/html/</code>. “配置前缀”不仅会决定默认的“文档根目录”,还决定着 Nginx 配置文件中许多相对路径值如何解释为绝对路径,后面我们还会看到许多需要引用到“配置前缀”的例子。

    获取当前“文档根目录”的路径有一个非常简便的方法,那就是请求一个肯定不存在的文件所对应的资源名,例如:

我们会很自然地得到 <code>404</code> 错误页。此时再看 Nginx 错误日志文件,应该会看到类似下面这一行错误消息:

这条错误消息是 <code>ngx_static</code> 模块打印出来的,因为它并不能在文件系统的对应路径上找到名为 <code>blah-blah.txt</code>的文件。因为这条错误信息中包含有 <code>ngx_static</code> 试图打开的文件的绝对路径,所以从这个路径不难看出,当前的“文档根目录”是 <code>/home/agentzh/test/html/</code>.

    很多初学者会想当然地把 <code>404</code> 错误理解为某个 <code>location</code> 不存在,其实上面这个例子表明,即使 <code>location</code>存在并成功匹配,也是可能返回 <code>404</code> 错误页的。因为决定着 <code>404</code> 错误页的是抽象的“资源”是否存在,而非某个具体的 <code>location</code> 是否存在。

    初学者常犯的一个错误是忘记配置 <code>content</code> 阶段的模块指令,而他们自己其实并不期望使用 <code>content</code> 阶段缺省运行的静态资源服务,例如:

继续阅读