`
galebo
  • 浏览: 15386 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

nginx如何读取缓存文件

 
阅读更多
转http://blog.csdn.net/nmgfrank/article/details/6826209

1. 一些和文件操作相关的函数

      (1)ngx_file_info

             宏定义: #define ngx_file_info(file, sb) stat((const car*)file, sb)

             stat函数 :具体用法见 http://wenku.baidu.com/view/31777dc1d5bbfd0a795673b1.html

      (2)ngx_open_file(name,mode,create,access)

             宏定义 : #define ngx_open_file(name,mode,create,access) open((const char*) name, mode|create, access);

               open函数: http://baike.baidu.com/view/26337.htm

                                        

2. nginx如何读取缓存文件

     之前紧紧大致弄明白了upstream的工作流程,可一谈到细节,依然是一头雾水。

例如,nginx如何读取缓存文件?今天继续看源代码,希望能够找到答案。

       (1)打开缓存文件

       在ngx_http_file_cache.c中

       ngx_http_file_cache_open() {

              ......//打开或是创建内存结点

              if (ngx_open_cached_file(clcf->open_file_cache,&c->file.name,&of,r->pool) != NGX_OK) {

              }

              c->file.fd = of.fd;//保存缓存文件的文件句柄

              c->uniq = of.uniq;//保存缓存文件的inode节点号

              c->length = of.size;//保存缓存文件的大小(字节)

              c->buf = ngx_create_temp_buf(r->pool,c->body_start)//这个buf中不知存储着什么????



     }

     这个ngx_open_cached_file似乎和打开缓存文件有关,于是深入地查看一下。

     ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name, ngx_open_file_info_t *of, ngx_pool_t *pool) {

            if (cache == NULL) {

                     if (of->test_only) {}//不会执行这个if语句

                     rc = ngx_open_and_stat_file(name->data, of, pool->log);

                     if (rc == NGX_OK && !of->is_dir) {

                             clnf->fd = of ->fd;//保存打开文件的句柄

                             clnf->name = name->data;//保存文件路径

                      }

            }

     }

    再看ngx_open_and_stat_file() {

              ......

              fd = ngx_open_file(name,....)//打开缓存文件

              ......

              of->fd = fd;//将文件句柄保存于of

     }

        (2) 利用缓存文件响应客户端

ngx_http_upstream_cache() {

      ......

      case NGX_OK:

               rc = ngx_http_upstream_cache_send(r,u);

}


ngx_http_upstream_cache_send() {    

       ......

        ngx_http_cache_send();

}


ngx_http_cache_send() {

           ngx_buf_t *b;

           ngx_chain_t out;


           c = r->cache;

           b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

           if (b == NULL) {

                 return NGX_HTTP_INTERNAL_SERVER_ERROR;

           }

           b->file = ngx_pcalloc(r->pool,sizeof(ngx_file_t));

           if (b->file == NULL) {

                  return NGX_HTTP_INTERNAL_SERVER_ERROR;

            }

            b->file_pos = c->body_start;

            b->file_last = c->length;

            b->in_file = 1;

            b->last_buf = (r==r->main)?1:0;

            b->last_in_chain;

            b->file->fd = c->file.fd;

            b->file->name = c->file.name;

            b->file->log = r->connection->log;


            out.buf = b;

            out.next = NULL;

            return ngx_http_output_filter(r,&out);

}


         (3) 自己使用缓存文件响应客户

             a.缓存文件的结构:

          缓存文件的第一部分存储着关于ngx_http_file_cache_header_t这个结构的数据。

                   typedef struct {

                             time_t    valid_sec;

                             time_t    last_modified;

                             time_t    date;

                             uint32_t crc32;

                             u_short  valid_msec;

                             u_short  header_start;//缓存文件中,存放HTTP头的起始位置

                             u_short  body_start;//存放HTTP body的起始位置

         缓存文件的第二部分是KEY,例如KEY:http://主机IP/相对路径/文件名 , 如果客户端拥有

                  相同的KEY,那么客户端使用同一个缓存。

        第三部分是源服务器的响应头,这部分内容可存储到结构
        第四部分是源服务器的响应体。


             b. 缓存文件的文件名: r->cache->file.name.data,可以通过此文件名打开缓存。

             c.    打开文件,获得文件句柄

                     ngx_fd_t fd;

                     fd = ngx_open_file(r->cache->file.name.data, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,NGX_FILE_OPEN, 0);

                     if (fd == NGX_INVALID_FILE) {

                                   //打开失败

                     }

             d.    获取文件信息

                     ngx_file_info_t fi;

                     if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {

                                   //获取信息失败

                                 ngx_close_file(fd);

                     }

               e. 获取文件信息后提取有效信息

                    int length;

                    if (ngx_is_dir(&fi)) {

                               ngx_close_file(fd);//如果打开的是文件夹

                    } else {

                              length  = ngx_file_size(&fi);//打开文件的字节数

                   }

               f. 申请空间,以读取缓存文件

                    u_char *buf = ngx_palloc(pool,   u->conf->buffer_size);

                    ssize_t n;

          #if (NGX_HAVE_PREAD)

                    n = pread(fd, buf, u->conf->buffer_size,0);

          #else

                   n = read(fd,buf,u->conf->buffer_size);

          #endif

                   if (n == -1) {

                         ngx_close_file(fd);//读取出错

                    }

                  g. 分析缓存文件的第一部分

                       ngx_http_file_cache_header_t *h;

                       h = (ngx_http_file_cache_header_t *) buf;

                       size_t body_start = h->body_start;

                       size_t header_start = h->header_start;

                   h. 读取缓存的body

                       u_char *sbuf = ngx_palloc(pool, length - body_start);

                       n = pread(fd, cbuf, length-body_start, body_start);

       
                   i. 使用ngx_http_send_header()和ngx_http_output_filter()发送HTTP数据。
分享到:
评论

相关推荐

    nginx静态文件缓存的解决方案1

    如果存在缓存,后续请求会直接读取缓存而不执行 `proxy_pass`。 2. 避免使用 `proxy_set_header Host $host`,因为它可能导致缓存失效。 3. 如果 `proxy_pass` 使用 upstream,可以替换为域名或 IP。 ### 第三步:...

    Nginx越界读取缓存漏洞 CVE-2017-7529

    Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。...如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容

    nginx访问静态文件不下载.rar

    如果仍然存在问题,检查`/var/www/html/images/`目录下是否存在`logo.png`,并且权限是否允许Nginx读取。 通过理解以上知识点并根据实际情况调整配置,通常可以解决Nginx访问静态文件不下载的问题。如果还有疑问,...

    NGINX反向代理缓存[参考].pdf

    **NGINX反向代理与缓存详解** NGINX是一款高性能的HTTP和反向代理服务器,常用于负载均衡和内容缓存,以提高网站的响应速度和整体性能。在本文中,我们将深入探讨如何利用NGINX进行反向代理和缓存配置,特别是对于...

    nginx-cache-reader:解析 nginx 的缓存文件夹和文件

    解析 nginx 的缓存文件夹和文件 这是一个用于快速查看nginx缓存文件夹信息的CLI客户端。 它可以从缓存文件夹中读取密钥并提取其中的内容。 这也可以用作库。 见 先决条件 节点 >=12.xx 建议您启用 strictatime ...

    使用nginx缓存服务器上静态文件的设置方法

    2. 提高响应速度:缓存文件直接存储在Nginx服务器上,当有相同的请求再次发生时,可以直接从缓存中读取文件,而不需要再次请求源服务器。这种机制大大加快了文件的响应速度,改善用户体验。 3. 减少带宽使用:由于...

    nginx文件资源下载

    在1.21.0版本中,它可能优化了文件读取和缓存机制,以提高响应速度。 3. **反向代理**:Nginx可作为反向代理服务器,接收来自客户端的请求,并将这些请求转发到后端应用服务器(如Apache、Node.js或PHP-FPM)。这有...

    微信小程序https服务nginx配置示例.pdf

    9. 文件权限和目录结构:配置SSL证书和私钥时,需要确保nginx进程有足够的权限读取这些文件。同时,合理的目录结构有助于管理不同的配置文件和资源。 总结来说,这份文档详细介绍了在nginx环境中配置微信小程序...

    Nginx上传文件全部缓存解决方案

    此外,在Nginx处缓存文件,也降低了传输效率。 nginx采用1.5.6。 后端采用nodejs+formidable的方式接受上传文件,本问题的对应与采用什么样的后端没太大关系,这里只是交代一下。 问题: 在前端页面上将文件上传,...

    nginx配置文件祥解

    在Nginx的配置文件中,每一行指令都对应着一个特定的功能,对服务器的性能和响应速度有着直接影响。以下是配置文件中的关键设置及其详细解释: 1. **全局块**: - `user nobody nobody;`:指定Nginx进程的运行用户...

    fastDFS+Nginx_fastdfs_fastdfs、nginx_fastdfs/nginx_

    Storage Server则负责文件的实际存储和读取操作,每个Storage Server可以设置多个数据卷,实现数据的冗余备份。 1. **安装FastDFS** - 安装依赖:`libevent`, `gcc`, `glibc-devel`, `zlib` - 下载FastDFS源码并...

    海康威视摄像头web端显示方案(Nginx环境测试)

    - 考虑到性能,可能需要对Nginx进行优化,如使用缓存、调整并发连接数等。 综上所述,该方案主要涉及Nginx与海康威视摄像头的集成,通过Web页面实时展示摄像头的视频流,适用于监控系统或者远程视频查看的场景。在...

    nginx源代码1.13.10

    在`src/http/modules/ngx_http_file_cache_module.c`中,Nginx如何管理缓存文件和响应缓存请求的逻辑得以实现。 9. **日志记录** Nginx的日志功能在`src/core/ngx_log.c`和`src/http/ngx_http_log_handler.c`中...

    nginx-1.20.2.tar.gz

    主进程负责读取和解析配置文件,然后创建并管理多个工作进程。工作进程则负责实际的网络I/O和请求处理。 ### 六、Nginx 运维 在运维过程中,监控Nginx的状态和性能非常重要。可以使用`nginx -t`检查配置文件的语法...

    nginx-1.19.2.tar.gz

    3. **静态文件处理**:Nginx 在处理静态文件(如图片、CSS、JavaScript等)时非常高效,可以直接从内存中读取,减少磁盘I/O操作。 4. **缓存功能**:Nginx 可以作为HTTP缓存服务器,对频繁访问的资源进行本地缓存,...

    nginx-1.17.6.7z

    执行这个脚本时,Nginx会读取新的配置,更新运行时设置,这在需要修改配置但又不想中断服务时非常有用。 2. **关闭nginx.bat**:这个文件用于停止Nginx服务。在维护或更新Nginx时,需要先关闭服务以避免数据丢失或...

    第一个Nginx模块的例子

    - **第三方模块**:由社区开发,用于扩展Nginx功能,如缓存、压缩、限速等。 2. **创建Nginx模块的基本步骤**: - **理解模块结构**:每个模块通常包含解析配置文件的函数(如`ngx_module_init`)、处理请求的...

    nginx1.8.1

    2. **缓存机制**:Nginx 可以配置缓存策略,将经常访问的图片存储在内存中,减少对磁盘的读取,提高响应速度。 3. **GZIP 压缩**:Nginx 支持开启 GZIP 压缩,减小传输数据量,降低带宽消耗。 4. **HTTP/2 支持**:...

    nginx-1.24.0

    9. **conf**目录:包含Nginx的默认配置文件,如`nginx.conf`,它是Nginx启动时读取的主配置文件。这里可以设置服务器块、监听端口、日志格式、缓存设置等。 10. **html**目录:这是Nginx默认的静态HTML文件存储位置...

Global site tag (gtag.js) - Google Analytics