nginx静态文件处理

SAP成本核算变式OKKN配置详解:从CK11N到CK24,手把手教你搞定标准成本发布 本文深入解析SAP成本核算变式OKKN的配置原理与实战应用,涵盖从CK11N到CK24的标准成本发布全流程。详细讲解数量结构控制、价值结构配置及间接费用计算规则,帮助成本会计精准掌握标准成本计算逻辑,解决BOM版本选择、工艺路线获取等常见问题,提升企业成本管理效率。 阅读详情

其实看nginx的主要目的就是想要搞清楚它高并发是如何实现的,然后能够在它的基础上自己写一个静态文件服务器。

我们知道nginx对request的处理分为phase来处理的,最终产生输出的phase为NGX_HTTP_CONTENT_PHASE,对静态文件的处理将会由ngx_http_static_module来处理,它将会在NGX_HTTP_CONTENT_PHASE注册一个handler函数:ngx_http_static_handler,好接下来我们就来看这个函数吧:

    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {  //判断当前请求的类型
        return NGX_HTTP_NOT_ALLOWED;
    }

    if (r->uri.data[r->uri.len - 1] == '/') {
        return NGX_DECLINED;     //表示当前phase handler无法处理这个请求
    }
首先对request的一些基本的信息进行判断,也就是说看这个http请求是不是访问静态资源的。
    last = ngx_http_map_uri_to_path(r, &path, &root, 0);   //把uri对应到文件路径上面
    if (last == NULL) {
        return NGX_HTTP_INTERNAL_SERVER_ERROR;  
    }

    path.len = last - path.data;    //last是指向路径的最后一个字符的地址,因此这里求的是路径的长度
接着调用ngx_http_map_uri_to_path函数,将最终资源的路径保存在path当中去。
ngx_memzero(&of, sizeof(ngx_open_file_info_t));

    of.read_ahead = clcf->read_ahead;
    of.directio = clcf->directio;
    of.valid = clcf->open_file_cache_valid;
    of.min_uses = clcf->open_file_cache_min_uses;
    of.errors = clcf->open_file_cache_errors;
    of.events = clcf->open_file_cache_events;

    if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

    if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)   //打开文件,并取得其的一些基本信息
        != NGX_OK)
    {
        switch (of.err) {

        case 0:
            return NGX_HTTP_INTERNAL_SERVER_ERROR;

        case NGX_ENOENT:
        case NGX_ENOTDIR:
        case NGX_ENAMETOOLONG:

            level = NGX_LOG_ERR;
            rc = NGX_HTTP_NOT_FOUND;
            break;

        case NGX_EACCES:
#if (NGX_HAVE_OPENAT)
        case NGX_EMLINK:
        case NGX_ELOOP:
#endif

            level = NGX_LOG_ERR;
            rc = NGX_HTTP_FORBIDDEN;
            break;

        default:

            level = NGX_LOG_CRIT;
            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
            break;
        }

        if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {
            ngx_log_error(level, log, of.err,
                          "%s \"%s\" failed", of.failed, path.data);
        }

        return rc;
    }
然后获取静态文件的一些基本的信息。
    r->headers_out.status = NGX_HTTP_OK;    //http相应的状态码  200表示成功了
    r->headers_out.content_length_n = of.size;   //头部邋content_lenght
    r->headers_out.last_modified_time = of.mtime;  //资源的最后修改时间

    if (ngx_http_set_content_type(r) != NGX_OK) {   //设置返回信息的类型,说白了就是文件的类型  content_type
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

    if (r != r->main && of.size == 0) {
        return ngx_http_send_header(r); 
    }

    r->allow_ranges = 1;

    /* we need to allocate all before the header would be sent */

    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;
    }

    rc = ngx_http_send_header(r);    //调用header的filter来响应header的信息,说白了就是给客户端发送header
然后生成一些相应的头部信息,并且最终调用ngx_http_send_header函数将头部的信息发送给客户端,
 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
        return rc;
    }
//设置buffer的一些基本信息,准备把它发送出去
    b->file_pos = 0;
    b->file_last = of.size;

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

    b->file->fd = of.fd;
    b->file->name = path;
    b->file->log = log;
    b->file->directio = of.is_directio;

    out.buf = b;
    out.next = NULL;

    return ngx_http_output_filter(r, &out);    //调用body的filter来响应body的信息
接下来就是设置要发送静态资源的一些信息,并调用ngx_http_output_filter函数来讲最终的body发送出去。


其实上面的内容可以看到对于静态文件的处理还是很简单的,而且我们还可以看到最终输出响应都是通过filter来完成的。

【WRFDA安装第一期】安装 WRFDA 以运行 3DVAR/4DVAR数据同化 阅读详情

相关推荐

从问卷到结论:手把手教你用SPSS 28完成一份完整的社科数据分析报告

本文详细介绍了如何使用SPSS 28完成社会科学研究中的数据分析报告,从问卷数据导入、清洗到描述性和推断性统计分析,再到结果呈现与报告撰写。通过实际案例演示,帮助研究者掌握SPSS 28的核心功能,提升数据分析效率与报告质量。

weixin_28717431的博客 249

菜鸟学习nginx之接收HTTP Header

上一篇介绍了《菜鸟学习nginx之接收HTTP请求行》,本篇介绍Nginx接收HTTP Header处理流程。 一、HTTP Header处理流程 处理Header与上一篇处理HTTP请求行很类似,比较容易理解 1.1、流程图 1.2、代码 /** * 处理HTTP Header * @param rev 读事件 */ static void ngx_http_process...

程序员的世界 6014

STM32实战:用定时器触发ADC+DMA双缓冲实现电机电流采样(附避坑指南)

本文详细介绍了如何利用STM32的定时器触发ADC注入组采样,结合DMA双缓冲机制实现电机电流的高效采样。通过PWM触发和双缓冲架构,解决了开关噪声干扰、实时性要求和数据一致性等核心挑战,显著降低CPU负载并提升采样精度。附有完整的代码示例和避坑指南,适用于无人机电调、工业伺服驱动器等高精度电机控制场景。

weixin_33737134的博客 520

nginx源码分析之http解码实现

分析nginx是如何解析并且存储http请求的。对非法甚至恶意请求的识别能力和处理方式。可以发现nginx采用状态机来解析http协议,有一定容错能力,但并不全面

囧囧有神的专栏 1万+

告别SendKeys!用DD驱动级模拟在Windows 10/11上实现真·后台键鼠操作(Python实战)

本文详细介绍了如何使用DD驱动级模拟技术在Windows 10/11上实现真后台键鼠操作,解决传统方法如pyautogui和SendKeys的局限性。通过Python实战案例,展示了驱动级模拟在游戏自动化、RPA等场景中的高效应用,包括环境配置、核心API解析及高级优化技巧。

weixin_42519985的博客 799

Response Instance 详解:在 ABAP OData Client Proxy 中读懂每一次响应

ABAP OData Client Proxy中的Response Instance是关键信息载体,封装了业务数据及调用上下文(如分页、delta link等)。响应实例在执行请求后自动生成,根据请求类型返回特定接口(如READ返回/IWBEP/IF_CP_RESPONSE_READ)。响应抽象与OData版本解耦,支持统一处理V2/V4服务。常见响应类型包括单实体读取、列表读取(支持分页和增量同步)、创建/更新/删除响应等。开发时可通过响应对象的安全类型方法获取数据,如get_business_data获

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 136

Nginx入门之静态资源与动态访问分离

https://my.oschina.net/u/238296/blog/599706

槿之 6661

OpenDataLab 大模型训练数据集下载记录

大模型 训练数据集

u013558123的博客 3341

给nginx lua模块添加sendfile函数可代替X-Accel-Redirect

nginx发送静态文件,速度极快,Nginx中的x-sendfile机制需要依靠 X-Accel-Redirect 特性实现,不过经过我的测试,不能满足我的需求,我 要用lua来处理业务逻辑, 然后发送文件内容,一开始用如下方式来实现, 这种方式如果文件小, 到无所谓, 但是当文件很大时, 对性能的影响非常大。local file = io.open(filePath, "rb") local

Langeldep的专栏 6619

windows一键安装部署wvp-GB28181-pro视频监控平台

我们可以看到redis、mysql、zlm和wvp都正常运行了。该ip需要修改为wvp服务安装的 服务器的IP。默认用户名和密码分别为admin和admin。

zengliguang的专栏 5747

《UDS协议从入门到精通》系列——图解0x34:请求下载

上传下载类服务之0x34-请求下载,图解请求+响应格式,直观易懂,快速上手!!

车载系统攻城狮 4927

Nginx的405 not allowed错误解决

Nginx的405 not allowed错误解决

J_Lee 5万+

超强干货之---Python-数据爬取(爬虫)

定义: 深度优先搜索是一种遍历或搜索树或图的算法,从起始节点开始,一直沿着一个分支走到底,再回溯到上一个节点继续搜索下一个分支,直到遍历完所有节点。特点递归:通常用递归实现,或者使用栈来模拟递归过程。内存占用低:在有大量分支的情况下,内存占用比广度优先搜索低。适合目标较深的情况:如果目标节点距离起始节点较深,DFS能更快找到目标。适用场景需要遍历所有节点的情况,如生成树、迷宫搜索。目标节点较深,且分支较多时。在大规模数据爬取时,选择合适的存储方式取决于数据的规模、结构和访问需求。

房东的猫的博客 5万+

NGINX如何处理静态文件?你会如何优化静态文件的传输?

NGINX如何处理静态文件?你会如何优化静态文件的传输?

java1234的博客 1180

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

让Nginx处理Django的静态文件

http://my.oschina.net/u/993130/blog/214841 上次的《Django静态文件的配置》,说的主要是针对开发环境的配置。在开发中难免要处理网站的css js image等静态文件,不用顾及性能,安全的问题,交给Django内部处理好了;但如果正式部署到服务器的时候,这样的配置就会影响到性能和安全性了,这时怎么办呢?嗯,交给Nginx处理好了。

4676

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

windows下nginx直接处理静态文件

网上的沙雕们,你们发文章的时候就不能简单说明一下环境吗?老子都要看到一半才发现不是需要的类型 ji静态文件使用nginx直接处理,减轻tomcat压力 对于我的网站,静态文件有js css图片,然后图片又分为两种,用户发布文章上传的保存到userfiles,网站用到的logo什么的存放在WEB-INF/static下 所以配置起来就要分多个步骤 先看js和css的,直接使用后缀...

weixin_30251587的博客 294

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Nginx静态文件处理

通过正则表达式,我们可让 nginx 识别出各种静态文件,例如 images 路径下的所有请求可以写为: location ~ ^/images/ { root /opt/webapp/images; } 而下面的配置则定义了几种文件类型的请求处理方式。 location ~ \.(htm|html|gif|jpg|jp

kun20031029的专栏 2831

使用nginx来完成反向代理及处理静态文件请求

这里主要分三块,分别是nginx的基础安装及使用,反向代理及处理静态文件的请求。 1.安装及使用(windows 平台)首先从这里下载nginx,照流程安装即可。如果觉得英语稍显吃力的话,可以看教程启动nginx 方法1:命令行进入nginx的根目录,输入 start nginx 方法2:命令行进入nginx的根目录,输入 nginx.exe方法3:进入nginx的根目录,双击nginx.exe

Multiangle's Notepad 1万+

nginx对静态文件cache的处理分析

Nginx中对静态文件进行了Cache,对应的配置项是open_file_cache,open_file_cache_min_uses以及open_file_cache_valid。这次我就来分析下nginx如何对静态文件进行cache的。要注意一个就是open_file_cache的 inactive表示文件多久不被访问就会从cache中删除。    首先来描述一下Linux下是如何做

evsqiezi 715

nginx 集群配置方式 静态文件处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33816300的博客 392

Nginx处理静态文件性能超Apache?

Nginx在处理静态文件方面具有显著优势,包括高效配置与扩展性、内置缓存机制和强大的负载均衡能力,适合高并发场景。Apache则以稳定性和广泛支持见长,适合简单静态文件服务。选择服务器软件需根据实际需求,考虑访问量、性能要求等因素。Nginx尤其适合处理大规模静态文件,能有效提升网站性能和用户体验。

2501_90410679的博客 51

docker应用栈实践-nginx处理静态文件

在我的djangoweb应用在docker搭建好之后,发现一些css静态文件返回没有content-type属性,导致浏览器log一堆警告,强迫症的我受不了这一情况 目前的应用栈结构图: 一共四个容器,内部连接,其中APP1 APP2里面有两个应用 一个uWSGI的web服务器 一个django应用程序,其他两个容器都是内部一个应用 经过查阅很多资料,发现我使用的uwsgi貌似...

weixin_30455365的博客 112

Nginx服务器中静态文件cache的处理流程

转载自:w3cstudy学习网 本文为大家介绍nginx是如何对静态文件进行cache处理的,有兴趣的朋友可以看看。 Nginx中对静态文件进行了Cache,对应的命令就是open_file_cache,open_file_cache_min_uses以及open_file_cache_valid。这次我就来分析下nginx如何对静态文件进行cache的。 注意,open_fil

otion20122的专栏 976
上一篇: Nginx的server块listen命令详解
下一篇: cloud foundry源码启动(1)
fjs_cloud
博客等级 码龄15年 248粉丝 192原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值