如何解决网页字体加载性能瓶颈:TTF转WOFF格式转换架构深度解析
2026/6/8 14:26:00
ngx_file_info_wrapper 函数 定义在 ./nginx-1.24.0/src/core/ngx_open_file_cache.cstaticngx_int_tngx_file_info_wrapper(ngx_str_t*name,ngx_open_file_info_t*of,ngx_file_info_t*fi,ngx_log_t*log){ngx_int_trc;#if!(NGX_HAVE_OPENAT)rc=ngx_file_info(name->data,fi);if(rc==NGX_FILE_ERROR){of->err=ngx_errno;of->failed=ngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;#elsengx_fd_tfd;if(of->disable_symlinks==NGX_DISABLE_SYMLINKS_OFF){rc=ngx_file_info(name->data,fi);if(rc==NGX_FILE_ERROR){of->err=ngx_errno;of->failed=ngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;}fd=ngx_open_file_wrapper(name,of,NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN,0,log);if(fd==NGX_INVALID_FILE){returnNGX_FILE_ERROR;}rc=ngx_fd_info(fd,fi);if(rc==NGX_FILE_ERROR){of->err=ngx_errno;of->failed=ngx_fd_info_n;}if(ngx_close_file(fd)==NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n" \"%V\" failed",name);}returnrc;#endif}ngx_file_info_wrapper 函数是 Nginx 封装的文件元数据获取函数。 它的作用是: 根据 `disable_symlinks` 配置, 选择安全的方式获取文件的 `stat` 信息。 如果允许符号链接,直接调用 `stat`; 如果需要禁用符号链接,则先通过 `open` 打开文件(遵守符号链接限制), 再用 `fstat` 获取信息,最后关闭文件。 同时它会将操作中的错误码和失败阶段记录到 `of` 中,供上层使用。staticngx_int_tngx_file_info_wrapper(ngx_str_t*name,ngx_open_file_info_t*of,ngx_file_info_t*fi,ngx_log_t*log)返回值 仅表示系统调用执行是否成功。 成功返回 NGX_OK, 失败返回 NGX_FILE_ERROR( -1)参数1 ngx_str_t *name 文件的完整路径参数2 ngx_open_file_info_t *of 指向 ngx_open_file_info_t 结构体的指针。 这是一个双向参数,既携带输入控制信息,又承载输出错误信息。参数3 ngx_file_info_t *fi 指向 ngx_file_info_t 结构体的指针,这是一个纯粹的输出参数 用于接收文件系统返回的完整元数据信息参数4 ngx_log_t *log 表示当前的日志对象1 不支持 openat 2 支持 openat 1 无符号链接限制 直接调用 ngx_file_info(stat)获取文件信息 2 有符号链接限制{ngx_int_trc;局部变量声明 存储底层系统调用的返回值 统一接收返回值,便于后续错误判断和传递#if!(NGX_HAVE_OPENAT)rc=ngx_file_info(name->data,fi);if(rc==NGX_FILE_ERROR){of->err=ngx_errno;of->failed=ngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;如果系统不支持 openat,则编译以上代码块。支持 openat 时#elsengx_fd_tfd;if(of->disable_symlinks==NGX_DISABLE_SYMLINKS_OFF){rc=ngx_file_info(name->data,fi);if(rc==NGX_FILE_ERROR){of->err=ngx_errno;of->failed=ngx_file_info_n;returnNGX_FILE_ERROR;}returnrc;}检查是否完全未启用符号链接限制。 逻辑: 如果 disable_symlinks 配置为 off, 则允许跟随符号链接, 此时可直接使用 stat,性能更好。直接调用 stat 获取文件信息。若 stat 失败,将全局 errno 保存到 of->err, 并设置 of->failed 为 "stat" 字符串标识,然后返回错误。 逻辑:错误信息由 of 带回,调用者可根据 of->err 判断具体原因。return rc; 成功时返回 NGX_OK。 正常路径结束,文件信息已填入 fi。需要限制符号链接时fd=ngx_open_file_wrapper(name,of,NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN,0,log);if(fd==NGX_INVALID_FILE){returnNGX_FILE_ERROR;}rc=ngx_fd_info(fd,fi);if(rc==NGX_FILE_ERROR){of->err=ngx_errno;of->failed=ngx_fd_info_n;}if(ngx_close_file(fd)==NGX_FILE_ERROR){ngx_log_error(NGX_LOG_ALERT,log,ngx_errno,ngx_close_file_n" \"%V\" failed",name);}returnrc;#endif}