Nginx HTTP详解

2023-05-16

正文

1 Nginx启动流程 

2 HTTP 初始化 

  • 新连接建立时的行为

在上次博客的最后可以看到,在ngx_event_accept方法建立连接的最后一步,将会调用ngx_listening_t监听结构体的handler方法。这时候HTTP框架就开始介入请求了。

HTTP框架在初始化时就会将每个监听ngx_listening_t结构体的handler方法设为ngx_http_init_connection方法,该方法执行流程如下图:


其中定时器中的超时时间是nginx.conf配置文件中指定的client_header_timeout,后面的超时时间设定也是这个值

  • 第一次可读事件的处理

当TCP连接上第一次出现可读事件时,将会调用ngx_http_init_request方法初始化这个HTTP请求

该方法主要做了3件事情:

1.对请求构造ngx_http_request_t结构体并初始化部分参数;

2.修改读事件的回调方法为ngx_http_process_request_line

3.调用上面的回调方法解析HTTP请求行


6.读事件被触发,这是需要在用户态的进程空间分配内存,用来把内核缓冲区上的TCP流复制到用户态的内存中。

   这一步将在ngx_connection_t的内存池中分配一块内存,内存块的大小与nginx.conf文件中的client_header_buffer_size配置项参数一致。

   ngx_connection_t结构体的buffer指针以及ngx_http_request_t结构体的header_in指针共同指向这块内存缓冲区。

  • 整体流程

http模块作用:解析http 请求.

ngx_http_process_request:处理请求,设置读写事件的handler
ngx_http_handler:初始化phase_handler
ngx_http_core_run_phase:处理http 11个阶段

ngx_http_read_client_request_body是首次接收http包体函数,如果一次没全部接收完包体,则调用ngx_http_read_client_request_body_handler继续接收。
发送http header filter和发送http body filter不同

上述两张图片来自网络,图片重点各有不同

流程图

nginx拥有众多http模块,如何将其整合并确保http请求会用到相应模块?

  • nginx将http请求划分11个阶段,每一阶段可包含多个http模块,每个模块handler运行结果决定下一个模块;
  • 每个http阶段由ngx_http_phase_handler_s描述,包含3个成员:checker,handler以及 next;
  • Nginx不允许直接调用http模块的handler,而是通过提供的checker封装调用,共有7个http请求阶段实现了checker(4个),也就是说只有这7个阶段允许第3方模块注册;
    Nginx初始化时,调用每个http模块的ngx_http_module_t->postconfiguration将自身的handler加入cmcf->phases(二维数组);
  • 然后通过ngx_http_init_phase_handlers()将cmcf->phases重组为一维数组cmcf->phase_engine.handlers,此时所有的ngx_http_phase_handler_s都位于其中;
  • 一个http请求经过解析请求行和请求头后,最终调用ngx_http_core_run_phases,其以http请求的phase_handler为下标,尝试遍历cmcf->phase_engine.handlers (可能因为处理结果提前返回)
ngx_http_core_run_phases(ngx_http_request_t *r)
{
    ......
    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
    ph = cmcf->phase_engine.handlers;
    while (ph[r->phase_handler].checker) {
        rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);
    }
}

以上是接受客户端连接,并根据http请求行和请求头执行相应http模块,http请求可能还有包体,由http模块负责处理;
一般有两种方法: 1 接收包体并存入内存或文件; 2 接收包体后直接丢弃;

3 接收HTTP请求行(line)

在初始化请求之后,将调用ngx_http_process_request_line方法接收HTTP请求行

因为请求行的长度是不定的,这意味着在读事件被触发时,内核套接字缓冲区的大小未必足够接收到全部的HTTP请求行。

因此调用一次ngx_http_process_request_line方法不一定能够接收完完整的HTTP请求行,该方法会被多次调度。下图展示了该方法的流程


该方法会调用recv方法把Linux内核套接字缓冲区中的TCP流复制到header_in缓冲区中。

header_in的类型是ngx_buf_t,它的pos成员和last成员指向的地址之间的内存就是收到的未解析的字符流.

4.在本次没有接收到TCP流的时候,告诉事件驱动程序继续检测这个读事件,然后该方法就结束。在该读事件准备好的时候,该方法将被再次调度。

5.在接收到TCP流后,用状态机(ngx_http_parse_request_line方法)解析已经接收到的TCP字符流,确认其是否构成完整的HTTP请求行。

7.如果ngx_http_parse_request_line方法返回NGX_OK,表示已经成功地接收到完整的请求行。这一步将把请求行的的信息设置到ngx_http_request_t结构体的相应成员中

   (request_line、uri、method_name、http_protocol、args等)。

11.接收完HTTP请求行后,把读事件回调方法更改为ngx_http_request_headers准备接收HTTP头部

handler仅仅处理header(行,header),不处理body.需要处理body,说明是post情况,需要交互。都交给后面第三方模块处理

4 接收HTTP请求头部(header)

注意:上面是请求行,这里是请求头部。
跟HTTP请求行一样,HTTP头部也属于可变长度的字符串,它与HTTP请求行和包体间都是通过换行符来区分的。

下图展示了HTTP框架使用ngx_http_process_request_headers方法接收、解析HTTP头部的流程


6.调用ngx_http_parse_header_line方法解析缓冲区的字符流。这个方法有3个返回值:

   返回NGX_OK时,表示解析出一行HTTP头部;返回NGX_HTTP_PARSE_HEADER_DONE时,表示已经解析出了完整的HTTP头部;

   返回NGX_AGAIN时,表示还需要接收到更多的字符流才能继续解析;除此之外的错误情况,将发送400错误给客户端。

7.解析出的HTTP头部信息设置到ngx_http_request_t结构体headers_in成员的headers链表中。

9.当ngx_http_parse_header_line方法返回NGX_HTTP_PARSE_HEADER_DONE时,将会根据HTTP头部中的host字段情况,

   调用ngx_http_find_virtual_server方法找到对应的虚拟主机配置块。ngx_http_request_t结构体里的srv_conf、loc_conf成员被重新设置,以指向正确的虚拟主机。

在接收到完整的HTTP头部后,已经有足够的必要信息开始在业务上处理HTTP请求了。

notes 接收http 头部如果buffer不够,会分配更大的buffer,如果大于最大的buffer则返回错误。header只用一个buffer接收,不能用多个buffer接收

5 处理HTTP请求

2.设置读、写事件的回调方法为ngx_http_request_handler方法,请求的后续处理都是通过ngx_http_request_handler方法进行的

6.设置ngx_http_request_t结构体的write_event_handler成员为ngx_http_core_run_phases方法。该方法可能会被多次调度来完成HTTP请求的处理

7.调用ngx_http_core_run_phases回调方法,该方法执行流程如下


ngx_http_request_t结构体中的phase_handler成员(处理流程的核心)将决定执行到哪一阶段,关于该成员跟其相关的数据结构可以查看http://www.cnblogs.com/runnyu/p/4910952.html。

  • HTTP请求11个阶段

NGX_HTTP_FIND_CONFIG_PHASE,NGX_HTTP_POST_REWIRTE_PHASE,NGX_HTTP_POST_ACESS_PHASE,NGX_HTTP_TRY_FILES_PHASE,这4个阶段用户不可介入.

  • 该回调方法的源码如下
void ngx_http_core_run_phases(ngx_http_request_t *r)
{
    ...
    cmcf=ngx_http_get_module_man_conf(r,ngx_http_core_module);
    ph=cmcf->phase_engine.handlers;
    
    while(ph[phase_handler].checker){
        rc=ph[r->phase_handler].checker(r,&ph[r->phase_hanlder]);
    }
}

 只有当相应的checker方法返回NGX_OK时才将控制权交还给Nginx的事件模块,否则将继续执行(checker方法中会修改phase_handler成员以向下执行)。

当这个请求上对应的事件再次触发时,HTTP框架将回调ngx_http_request_handler方法开始处理请求(上面已经设置了该方法为其读、写事件的回调方法)。

  • 下图是ngx_http_request_handler方法的流程

 2.如果当前事件可写,将调用ngx_http_reqeust_t结构体中的write_event_handler方法。该方法在上面已经设置为ngx_http_core_run_phases,可见该方法会被多次调用。

  • Checker方法

请对照上面ngx_http_core_run_phases 代码.
checker方法是HTTP框架定义的,每一个HTTP处理阶段对应着相应着一个checker方法(有的阶段的checker方法一样),handler方法只有在checker方法中调用。

checker方法的主要任务在于,根据phase_handler执行某个HTTP模块实现的回调方法,并根据方法的返回值决定:

1.当前阶段是否已经结束

2.下次要执行的回调方法是哪一个

3.是立刻执行下一个回调方法还是先把控制权交还给epoll

下面介绍HTTP框架中其中两个checker方法的介绍

  • ngx_http_core_generic_phase

在前面的http://www.cnblogs.com/runnyu/p/4910952.html下面有该方法的介绍,下面只给出该方法的流程图

可见,checker方法主要是根据handler方法的返回值来改变phase_handler的值以用来控制handler方法的执行顺序的。

  • ngx_http_core_content_phase

ngx_http_core_content_phase是NGX_HTTP_CONTENT_PHASE阶段的checker方法。是我们开发HTTP模块时最常用的一个阶段。

1) 两种挂载

content phrase handler默认调用 (按阶段挂载)

gx_http_index_handler---ngx_http_autoindex_handler---ngx_http_gzip_static_handler---ngx_http_static_handler

自定义content handler(按需挂载)

详情请参考: handler module介绍_fdsafwagdagadg6576的专栏-CSDN博客 

2) config

ngx_http_core_content_phase阶段的handler方法则可以放在ngx_http_core_conf_t结构体中,这就是按需挂载的基础,其余10个阶段中各HTTP模块的handler方法都是放在全局ngx_http_core_main_conf_t结构体中

typedef struct ngx_http_core_loc_conf_s ngx_http_core_loc_conf_t
struct ngx_http_core_loc_conf_s {
    ...
    ngx_http_handler_pt handler;
    ...
}

3)实例分析

在我们最初的开发的HTTP模块中:http://www.cnblogs.com/runnyu/p/4871866.html

当检测到mytest配置项后,调用ngx_http_mytest方法将上面ngx_http_core_loc_conf_t的handler成员设置为自己的handler函数,实现了按需挂载。

事实上,在NGX_HTTP_FIND_CONFIG_PHASE阶段就会把ngx_http_request_t结构体的content_handler成员设置为匹配请求URI的location下的ngx_http_core_loc_conf_t结构体的handler成员。

下面是该checker方法的流程图,可以看出是如何实现按需挂载的

6 处理HTTP包体 ngx_http_read_client_request_body

        请求体的读取一般发生在nginx的content handler中,一些nginx内置的模块,比如proxy模块,fastcgi模块,uwsgi模块等,这些模块的行为必须将客户端过来的请求体(如果有的话)以相应协议完整的转发到后端服务进程,所有的这些模块都是调用了ngx_http_read_client_request_body
接口来完成请求体读取.
        值得注意的是这些模块会把客户端的请求体完整的读取后才开始往后端转发数据。
        第一次读取通过ngx_http_read_client_request_body.第二次及以后通过ngx_http_do_read_client_request_body函数,进行消息体的相关处理 .

1).接收包体

ngx_int_t ngx_http_read_client_request_body(ngx_http_request *r,ngx_http_client_body_handler_pt post_handler);
typedef void (*ngx_http_client_body_handler_pt) (ngx_http_request_t *r);

接收到的包体保存在ngx_http_reqeust_body_t中,一般调用该函数的handler函数会接着返回NGX_DONE。

在完成接收动作之后,会调用post_handler函数继续处理请求。

2).放弃接收包体(Nginx必须接收包体,但不做处理)


ngx_int ngx_http_discard_reqeust_body(ngx_http_request_t *r);  

调用该函数的handler函数继续处理请求,Nginx会异步地接收跟丢弃包体

为什么不主动读取HTTP BODY数据?

为什么HTTP的核心模块只读取了HTTP协议的请求行和请求头,而没有读取HTTP的请求body内容

因为大部分情况下,HTTP协议是不需要用到HTTP body中的数据的,例如你返回一张图片或者一个静态页面。

只有在需要将body数据传输到后端的例如JAVA、PHP等的时候,才会需要将HTTP的body数据带过去(POST请求、文件上传等).所以Nginx只有在特殊的模块下(比如proxy模块,fastcgi模块,uwsgi模块等),才会去主动调用ngx_http_read_client_request_body方法,将body传递到后端。

ngx_http_read_client_request_body 不会主动调用,是第三方fastcgi等模块调用的。
注册handler read request body 实例: https://blog.csdn.net/ApeLife/article/details/73866197

request body 的读取详解:请参考

nginx request body读取流程详解 - charming丶的个人空间 - OSCHINA - 中文开源技术交流社区
  与read header只要一个buffer不同,body可能很大。由于内存的限制,ngx_http_read_client_request_body()接口读取的请求体会部分或者全部写入一个临时文件中。

7 发送 HTTP 响应头部

发送函数 ngx_http_send_header,该函数调用 ngx_http_top_header_filter 方法开始顺序遍历过滤链表的每一个元素处理方法,直到最后一个把响应头部发送出去为止。
在Nginx中,过滤链表的顺序如下:

 +----------------------------+
  |ngx_http_not_modified_filter|
  +----------+-----------------+
             |
             v
  +----------+------------+
  |ngx_http_headers_filter|
  +----------+------------+
             |
             v
  +----------+-----------+
  |ngx_http_userid_filter|
  +----------+-----------+
             |
             v
  +----------+-------------------+
  |ngx_http_charset_header_filter|
  +----------+-------------------+
             |
             v
  +----------+---------------+
  |ngx_http_ssi_header_filter|
  +----------+---------------+
             |
             v
  +----------+----------------+
  |ngx_http_gzip_header_filter|
  +----------+----------------+
             |
             v
  +----------+-----------------+
  |ngx_http_range_header_filter|
  +----------+-----------------+
             |
             v
  +----------+-------------------+
  |ngx_http_chunked_header_filter|
  +----------+-------------------+
             |
             v
  +----------+-----------+
  |ngx_http_header_filter|
  +----------------------+

Filter作用,比如处理respond做类似css,加粗变色等效果

发送header和body:
当执行ngx_http_send_header发送HTTP头部时,就从ngx_http_top_header_filter指针开始遍历所有的HTTP头部过滤模块,
而在执行ngx_http_output_filter发送HTTP包体时,就从ngx_http_top_body_filter指针开始遍历所有的HTTP包体过滤模块 

8 发送 HTTP 响应包体

注意:发送HTTP 响应报头和包体使用的filter不同

发送函数:ngx_int_t ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in),
然后调用下面的filter

  +--------------------------+
  |ngx_http_range_body_filter|
  +----------+---------------+
             |
             v
  +----------+---------+
  |ngx_http_copy_filter|
  +----------+---------+
             |
             v
  +----------+-----------------+
  |ngx_http_charset_body_filter|
  +----------+-----------------+
             |
             v
  +----------+-------------+
  |ngx_http_ssi_body_filter|
  +----------+-------------+
             |
             v
  +----------+-------------+
  |ngx_http_postpone_filter|
  +----------+-------------+
             |
             v
  +----------+--------------+
  |ngx_http_gzip_body_filter|
  +----------+--------------+
             |
             v
  +----------+-----------------+
  |ngx_http_chunked_body_filter|
  +----------+-----------------+
             |
             v
  +---------------------+
  |ngx_http_write_filter|
  +---------------------+

根据发送响应包体的过滤链表顺序可以知道,除了最后一个模块是真正发送响应包体给客户端之外,其他模块都只是对响应包体进行修改,最后一个过来模块是ngx_http_write_filter_module,该模块提供的处理方法是ngx_http_write_filter;

总结:真正发送响应的是 ngx_http_write_filter 函数,但是该函数不能保证一次性把响应发送完毕,若发送不完毕,把剩余的响应保存在out 链表缓冲区中,继而调用ngx_http_writer 把剩余的响应发送出去,函数ngx_http_writer 最终调用的是ngx_http_output_filter 函数发送响应.

9 关闭连接请求

ngx_http_finalize_request 函数执行流

10 HTTP DEMO

Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)_自娱自乐的代码人-CSDN博客

小结:

Request流程
1) 请求头读取完成了,nginx的做法是先不读取请求body,所以这里面我们设置read_event_handler为ngx_http_block_reading,即不读取数据了.
2) 调用ngx_http_core_run_phases来处理请求,产生的响应头会放在ngx_http_request_t的headers_out中
3) nginx的各种阶段会对请求进行处理,会调用filter来过滤数据,对数据进行加工,如truncked传输、gzip压缩等。最后也会调用ngx_http_write_filter来进行输出。

 关键函数:ngx_http_core_run_phase:处理http 11个阶段

​​​​​​​ngx_http_core_run_phases(ngx_http_request_t *r)
{
    ......
    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
    ph = cmcf->phase_engine.handlers;
    while (ph[r->phase_handler].checker) {
        rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);
    }
}

ngx_http_core_content_phase 是NGX_HTTP_CONTENT_PHASE阶段的checker方法。是我们开发HTTP模块时最常用的一个阶段。

两种挂载:content phrase handler默认调用 (按阶段挂载)和自定义content handler(按需挂载).
挂载使用方法:push_event : Nginx入门之两种handler函数的挂载方式 - PaulWeiHan - 博客园

nginx http 模块主要是处理 http header,处理之后,发送函数 ngx_http_send_header,该函数调用 ngx_http_top_header_filter .
Nginx只有在特殊的模块下(比如proxy模块,fastcgi模块,uwsgi模块等),才会去主动调用ngx_http_read_client_request_body方法,将body传递到后端.
发送 HTTP 响应包体.注意:发送HTTP 响应报头和包体使用的filter不同

 更多handler模块示例分析

http static module

本模块的作用就是读取磁盘上的静态文件,并把文件内容作为产生的输出。

具体内容参见:Nginx 更多 handler 模块示例分析 - Nginx 入门指南 教程 | BootWiki.com
引用:Nginx:解析HTTP配置的流程 - Runnyu - 博客园
Nginx module开发 简单实例——hello world_Besko的博客-CSDN博客

Nginx 中处理 HTTP 请求 ,此文有源码的详细介绍:Nginx 中处理 HTTP 请求_关注校招求职,微信号:job_campus -CSDN博客
Nginx:HTTP框架是如何介入请求 - Runnyu - 博客园

nginx HTTP处理流程 - self-imporvement - 博客园

发送http响应头数据篇 ----- nginx 处理http(发送http响应头数据篇 ----- ngx_http_header_filter_module模块处理)_huzilinitachi的专栏-CSDN博客_ngx_http_header_filter_module

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx HTTP详解 的相关文章

  • Angular - UI 路由器路由 - HTML5 模式

    我正在尝试在我的 Angular 应用程序中使用 HTML5 推送状态链接 我拥有的是一系列类似于以下的路线 stateProvider state product url product productCode templateUrl p
  • DefaultHttpClient GET 和 POST 命令 Java Android

    好的 这是我的应用程序 一个 Android 应用程序 允许我从移动应用程序 而不是从网站 将 CokeZone 代码提交到 CokeZone co uk 所以我编写了这部分代码来执行登录后命令 然后检查我是否登录后 问题是 发送 post
  • HTTP请求压缩

    一般用例 想象一下一个正在上传大量 JSON 的客户端 内容类型应保留application json因为这描述了实际数据 Accept Encoding 和 Transfer Encoding 似乎是为了告诉服务器应该如何格式化响应 看起
  • 通过 http 的私有 git 存储库

    你能推荐任何简单的解决方案来设置可通过http s cleutus建议的 访问的git存储库吗 我有自己的 http 服务器 我想用它来托管一些小型私人项目 在家里我可以通过 ssh 连接 但在工作中防火墙阻止我这样做 有没有免费的方法来设
  • Angular4如何使用flatMap链接forkJoin

    我所处的情况是 我需要进行 5 个可以并行执行的 http 调用 在这五个调用之后需要执行另一个 http 调用 我在前 5 个中使用了 forkJoin 但我不知道如何链接 flatMap 或其他函数 forkJoin firstObse
  • Angular JS 在调用新的 $http 之前取消 $http 调用

    在 Angular JS 1 1 5 中 您可以取消之前启动的 http 调用 这两个link1 https stackoverflow com questions 16962232 in angularjs how to stop ong
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • 是否可以修改 $_SESSION 变量?

    恶意用户是否可以将 SESSION 在 php 中 变量设置为他想要的任何值 很大程度上取决于您的代码 有一点非常明显 SESSION username REQUEST username
  • 由于浏览器设置的标头,Safari 拒绝重定向的 CORS 请求

    Summary Safari 拒绝一些涉及重定向的 CORS 请求 声称某些标头是不允许的 但该标头从来不是由脚本请求的 而是由浏览器添加的 所以我认为这应该不重要 Safari 的行为是一个错误吗 规格有问题吗 或者 事情变成这样是有原因
  • 当 ssl 和 http2 打开时,Nginx 似乎忽略 server_name

    我有这个 nginx 配置 server listen 80 default server listen 80 default server server name www example com return 301 https www
  • Nginx 位置、别名、重写、根

    我正在通过 proxypass 提供 foo bar 服务 并希望继续这样做 但是 我想从 var www mystatic baz swf 等静态地提供 foo bar baz swf 服务 我希望我能做类似的事情 location fo
  • 在使用 Let's Encrypt 和 Nginx 进行的 SSL Labs 测试中,如何在所有类别中获得 A+ 100 分?

    在 www ssllabs com 测试我的 SSL 证书时 我试图在所有类别上获得 100 分 然而 我正在努力争取所有分数都达到 A 和 100 关于我应该使用什么 NGINX 配置有什么建议吗 或者我应该如何生成 Let s Encr
  • Nginx 配置文件在 Elastic Beanstalk 部署期间被覆盖?

    我需要将 p3p 标头添加到标准 Nodejs 和 Nginx Elastic Beanstalk 上的静态资源位置 我创建了一个ebextension脚本如上所解释这个问题 https stackoverflow com question
  • 使用什么 API 在现有 MFC 应用程序中添加 HTTP 客户端支持?

    我最近接到一项任务 要添加与以下内容交互的能力网络地图服务 http en wikipedia org wiki Web Map Service到现有的 MFC 应用程序 我需要客户端 HTTP API 根据我的研究 领先的候选人似乎是CA
  • 使用 Http Post 发送图像

    我想使用 Http Post 将图像从 android 客户端发送到 Django 服务器 该图像是从图库中选择的 目前 我正在使用列表值名称 Pairs 将必要的数据发送到服务器并接收来自 Django 的 JSON 响应 是否可以对图像
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 为什么 websocket 需要使用 HTTP 进行打开握手?为什么不能成为一个独立的协议呢?

    Websocket 的设计方式是 通过使其握手成为有效的 HTTP 升级请求 其服务器可以与 HTTP 服务器共享端口 我对这个设计理念存有疑问 无论如何 WebSocket 协议都是一个独立的基于 TCP 的协议 为什么我们需要这个 HT
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • WordPress 3.0 .htaccess 到 nginx 重写规则的转换

    RewriteEngine On RewriteBase BASE uploaded files RewriteRule files index php L RewriteCond REQUEST URI wp content plugin
  • Nginx 与 Daphne 给出 502 Bad Gateway

    由于 Django Channels 和 uwsgi 出现问题 我决定用 daphne 替换 uwsgi 关注后this http masnun rocks 2016 11 02 deploying django channels usin

随机推荐

  • 一个C++解析HTML的库

    HTTP协议使用广泛 xff0c 相应的 xff0c C 43 43 在这块需求也开始增加 一个好的解析库可以达到事半功倍的效果 xff0c 在此贴出我的解析库的代码 xff0c 方便新手朋友们使用 hHttpParse h ifndef
  • Intel Realsense D435i SDK Install

    Intel Realsense D435i 0 引言1 参考2 Install3 Other 0 引言 自己买的还没到 xff0c 借的同学 xff0c 生怕给他搞坏了 1 参考 ref0 官方giahubref1 官方Installref
  • OBVP问题推导

    OBVP问题推导 0 引言1 推导2 code 0 引言 记录一下 时间紧张 xff0c 不整理了 xff0c 直接上草稿纸 一元四次方程求解参考博客 1 推导 2 code 代码完全按照推导书写 xff0c 包括变量的命令 span cl
  • CMakeLists中的add_definitions()函数

    CMakeLists中的add definitions函数 0 引言1 add definitions 2 应用 0 引言 其实这个函数在安装一些库的时候 xff0c 它的CMakeLists里面就有这样的函数 典型的就是opencv了 o
  • Intel Realsense D435i&L515 驱动安装

    Intel Realsense D435i amp L515 驱动安装 0 引言1 D435i amp L515固件更新1 1 D435i固件更新1 2 L515固件更新 2 Intel Realsense驱动安装3 ROS Wrapper
  • 位置编码Positional Encoding

    位置编码Positional Encoding 1 Transformers中的PE2 什么是Transformer位置编码2 1 表格型2 2 相对位置的关系 函数型 3 为什么可以表示相对距离 xff1f 4 其他参考 内容全来自于网络
  • vscode 调试 Python 代码

    vscode 调试 Python 代码 0 引言1 插件2 环境布置3 parser解析 0 引言 参考0参考1 1 插件 官方的python插件代码助手 xff0c 自动补全 xff1a 解释器选择 xff0c 在窗口右下角选择解释器 x
  • OpenCV 相机转换为 OpenGL 相机

    OpenCV 相机转换为 OpenGL 相机 0 引言1 预备知识和概述2 资源3 OpenCV和OpenGL中的图像坐标系统3 1 OpenCV H Z和OpenGL中的主轴3 2 齐次坐标和OpenGL中的归一化设备坐标 4 OpenC
  • 两轮差速小车循线控制原理分析

    硬件资料设定 xff1a 小车驱动来自于两个相同的电机 xff0c 转向依靠两轮差速实现 xff0c 小车前后左右安装超声波传感器 xff0c 前后各一个 xff0c 左右各两个 xff1b 功能目标 xff1a 假设小车左侧有墙壁 xff
  • ch06-Pytorch的正则化与归一化

    ch06 Pytorch的正则化与归一化 0 引言1 weight decay 和 dropout1 1 Regularization1 2 Dropout 2 Normalization2 1 Batch Normalization2 2
  • ch07-Pytorch的训练技巧

    ch07 Pytorch的训练技巧 0 引言1 模型保存与加载1 1 序列化与反序列化1 2 PyTorch 中的模型保存与加载1 3 模型的断点续训练 2 模型 Finetune2 1 Transfer Learning amp Mode
  • opencv-contrib-Python编译module 'cv2.cv2' has no attribute 'xfeatures2d'

    opencv contrib Python编译module 39 cv2 cv2 39 has no attribute 39 xfeatures2d 39 引言解决步骤一解决步骤二 引言 opencv contrib Python编译出现
  • find_package()函数

    find package函数 引言1 find package用法2 find package原理3 A required library with LAPACK API not found 错误解决4 添加findpackage查询路径
  • py安装文件时报错usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]

    py安装文件时报错usage setup py global opts cmd1 cmd1 opts cmd2 cmd2 opts 引言solved 引言 报错 xff1a python setup py fastentrypoints u
  • VScode单步调试

    VScode配置 0 快捷键1 安装clang2 VScodeDebug3 Cmake支持gdb调试的方法 0 快捷键 稍大工程在vscode下的调试参考该博客 Ctrl 43 打开默认终端 Ctrl 43 Shift 43 新建新的终端
  • 串口通信简介

    串口通信 串口通信是一种串行异步通信 xff0c 通信双方以字符帧作为数据传输单位 xff0c 字符帧按位依次传输 xff0c 每个位占固定的时间长度 两个字符帧之间的传输时间间隔可以是任意的 xff0c 即传输完一个字符帧之后 xff0c
  • ubuntu16.0 ROS(介绍EAI的YDLIDAR-X4激光雷达在ROS下使用方法)

    YDLIDAR X4激光雷达介绍 YDLIDAR X4激光雷达是深圳越登智能科技有限公司 xff08 YDLIDAR xff0c 这家公司属于EAI xff09 研发的一款 360 度二维测距产品 xff0c 本产品基于三角测距原理 xff
  • php使用http_build_query,parse_url,parse_str创建与解析url

    1 http build query http build query 可以创建urlencode之后的请求字符串 span class hljs keyword string span http build query mixed spa
  • 无人驾驶小车调试笔记(六)-- 车轮校准

    简介 xff1a 小车的动力完全来自于两个电机带动的车轮 xff0c 在理想状态下 xff0c 给两个电机同样的驱动参数 xff0c 两个车轮会以同样的转速带动小车直线行驶 xff0c 而实际情况是每个电机可能都会有个体差异 xff0c 也
  • Nginx HTTP详解

    正文 1 Nginx启动流程 2 HTTP 初始化 新连接建立时的行为 在上次博客的最后可以看到 xff0c 在ngx event accept方法建立连接的最后一步 xff0c 将会调用ngx listening t监听结构体的handl