本节我们讲述一下nginx中对所涉及到的文件操作。
1. 函数ngx_conf_set_path_slot()
对于解析到http模块中的下述指令时会调用本函数进行路径设置:
-
client_body_temp_path
-
fastcgi_temp_path
-
proxy_temp_path
-
scgi_temp_path
-
uwsgi_temp_path
对于一个nginx模块,其一般都有如下结构:
这里先举一个例子,看client_body_temp_path
指令的用法,则有助于我们理解ngx_conf_set_path_slot()。该指令的基本语法为:
Syntax: client_body_temp_path path [level1 [level2 [level3]]];
Default:
client_body_temp_path client_body_temp;
Context: http, server, location
用法举例:
下面我们再来看ngx_conf_set_path_slot()函数:首先求得path->name全路径;再接着解析每一级level的值;最后调用ngx_add_path()将该slot添加到cycle->paths数组中。
2. 函数ngx_conf_merge_path_value()
本函数较为简单,就是合并prev
或者init
到path中
3. 函数ngx_conf_set_access_slot()
这里我们先举个例子,看fastcgi_store_access
指令回调本函数时的一个配置:
Syntax: fastcgi_store_access users:permissions ...;
Default: fastcgi_store_access user:rw;
Context: http, server, location
用法举例:
这里分别用于设置nginx某一文件的访问路径。
4. 函数ngx_add_path()
这里在添加slot
时,首先检查cycle->paths数组中是否已经有同名的path。如果有则进一步检查path->data、path->level等字段是否一致;否则直接向cycle->paths数组中添加slot
。
5. 函数ngx_create_paths()
这里遍历创建cycle->paths数组中的每一个目录,然后修改目录的访问权限为0700,所有者为user。
6. 函数ngx_ext_rename_file()
本函数用于将名称为src
的文件重命名为to
的文件,重命名步骤如下:
7. 函数ngx_copy_file()
本函数较为简单,将from
文件拷贝为
to
`文件。在拷贝时由cf指定拷贝大小以及拷贝过程中用的缓冲区大小。
8. 函数ngx_walk_tree()
本函数较为简单,遍历tree
目录下的所有文件,这里有3中情况:
-
遍历到的文件时普通文件: 直接调用ctx->file_handler()处理
-
遍历到的文件的目录文件: 递归调用ngx_walk_tree()遍历文件,此时会调用两个回调函数,一个是进入目录时的回调pre_tree_handler();另一个是离开目录时的回调post_tree_handler()
-
遍历到的文件时特殊文件: 调用ctx->spec_handler()处理
这里注意如果ctx->alloc
不为0,则会创建一个空间data,并调用ctx->init_handler(data,ctx->data)来进行相关数据结构初始化。
[参考]
-
nginx文件结构
-
Nginx中目录树的遍历
-
ngx-http-core-module