- 浏览: 447261 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (267)
- java (8)
- 求职&面试 (1)
- linux (33)
- windows (1)
- C++ (5)
- android (12)
- QT (1)
- 经验 (1)
- memory-leaks (1)
- Streaming&V/A (1)
- network&security (5)
- SCM (13)
- mysql (10)
- browsers (4)
- Windows APIs (2)
- opensource (1)
- pm (1)
- GDI (1)
- database (14)
- MFC (1)
- web&fronts (17)
- Tomcat (4)
- OLE (1)
- 观后感 (1)
- Production (2)
- UML (3)
- Javascript (7)
- Cloud Computing&SAAS (5)
- SoftwareEngineering (1)
- Computer&Maintenance (1)
- Web (8)
- Desgin (1)
- J2ee (10)
- mysql cluster (0)
- LB&HA (2)
- webserver (11)
- php (5)
- cas&authtication (0)
- Languages (1)
- IDEs (3)
- architecture (2)
- iOS (8)
- spring (3)
- webservices (1)
- security (1)
- MVCFrameworks (2)
- bservices (0)
- build-tools (2)
- unittest (1)
- spring-security (0)
- sphinx (2)
- hibernate (1)
- mybatis (2)
- search (0)
- nginx (2)
- design&production (2)
- DFS (0)
- algorithm (0)
- distributed&network (0)
- blogs (0)
- os&admin (0)
- fastcgi (0)
- kv-db (0)
- operation&maintenance (1)
- productions (9)
- 养生 (1)
- appserver (1)
- HTTP (2)
- test (1)
- erlang (2)
- browser (0)
- 非技术 (2)
- mobiles (2)
- cloud computing (2)
- Business (2)
- maven (1)
- python (5)
- 人生 (0)
- Cryptography (3)
- CV (0)
- cms (2)
- jqm (2)
- html (2)
- flex (1)
- redmine (1)
- iptables (1)
- groovy (1)
- scala (1)
- grails (1)
- ftp (3)
- vsftpd (2)
- lua (0)
- chroot (3)
- jailkit (3)
- UED (0)
- myeclipse (2)
- ide (2)
- eclipse (2)
最新评论
-
Nick712:
http://blog.csdn.net/victory08/ ...
处理SVN出现:Cleanup failed to process the following paths: xxx -
xs6262460:
Spring AOP根据JdbcTemplate方法名动态设置数据源 -
xhpscdx:
我的解决办法是把D:\ACRS\Projects\TAIS 下 ...
处理SVN出现:Cleanup failed to process the following paths: xxx -
hnraysir:
总结得相当不错,支持下。
使用CodeIgniter 创建 RESTful 服务 REST API【原创译文】 -
云上太阳:
这个必须评论下,间接的救过俺的命啊
解决tomcat启动报错,加强错误日志的显示:
杂谈Nginx与HTTP协议
在项目中遇到一个问题,需要详细了解下HTTP协议及其Nginx中对HTTP协议的支持程度。今天一天收集了一些资料,也梳理出最终方案。记录到博客上,方便后续查阅。重点关注以下几个方面:1、Http交互中如何判定内容的长度及其HTTP协议中关于Content-Length的解读。2、Chunk和Gzip在Nginx中的实现及原理。3、Upstream如何和Chunked结合。
Http协议中关于Content-Length的解读
在HTTP协议中,有Content-Length的详细解读。Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。
在具体的HTTP交互中,客户端是如何获取消息长度的呢,主要基于以下几个规则:
- 响应为1xx,204,304相应或者head请求,则直接忽视掉消息实体内容。
- 如果有Transfer-Encoding,则优先采用Transfer-Encoding里面的方法来找到对应的长度。比如说Chunked模式。
- “如果head中有Content-Length,那么这个Content-Length既表示实体长度,又表示传输长度。如果实体长度和传输长度不相等(比如说设置了Transfer-Encoding),那么则不能设置Content-Length。如果设置了Transfer-Encoding,那么Content-Length将被忽视”。这句话翻译的优点饶,其实关键就一点:有了Transfer-Encoding,则不能有Content-Length。
- Range传输。不关注,没详细看了:)
- 通过服务器关闭连接能确定消息的传输长度。(请求端不能通过关闭连接来指明请求消息体的结束,因为这样可以让服务器没有机会继续给予响应)。这种情况主要对应为短连接,即非keep-alive模式。
- HTTP1.1必须支持chunk模式。因为当不确定消息长度的时候,可以通过chunk机制来处理这种情况。
- 在包含消息内容的header中,如果有content-length字段,那么该字段对应的值必须完全和消息主题里面的长度匹配。
“The entity-length of a message is the length of the message-body before any transfer-codings have been applied”
也就是有chunk就不能有content-length 。
其实后面几条几乎可以忽视,简单总结后如下:
1、Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致。(经过测试,如果过短则会截断,过长则会导致超时。)
2、如果存在Transfer-Encoding(重点是chunked),则在header中不能有Content-Length,有也会被忽视。
3、如果采用短连接,则直接可以通过服务器关闭连接来确定消息的传输长度。(这个很容易懂)
结合HTTP协议其他的特点,比如说Http1.1之前的不支持keep alive。那么可以得出以下结论:
1、在Http 1.0及之前版本中,content-length字段可有可无。
2、在http1.1及之后版本。如果是keep alive,则content-length和chunk必然是二选一。若是非keep alive,则和http1.0一样。content-length可有可无。
Nginx在Http协议方面的处理
第一、Nginx的chunk模块
Nginx的Chunk模块是一个典型的Filter模块,它本身是内置必选的Nginx模块。在0.7.66版本之后,有一个配置项chunked_transfer_encoding可以开启或者关闭chunk模式,默认是开启的。
首先,先简单了解下在HTTP协议中Chunked相关的知识点。Chunked一种transfer coding方式,在HTTP1.0之前(包含http1.0)的版本是不支持的。在HTTP协议中定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Chunked-Body = *chunk last-chunk
trailer
CRLF
chunk = chunk-size [ chunk-extension ] CRLF chunk-data CRLF
chunk-size = 1*HEX last-chunk = 1*( "0" ) [ chunk-extension ] CRLF
chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
chunk-ext-name = token chunk-ext-val = token | quoted-string chunk-data = chunk-size(OCTET) trailer = *(entity-header CRLF) |
其中可以看到,每一个chunk都是可以大小自描述的。
在Nginx的Chunked模块中,header filter函数的流程如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
//如果没有content或者是head请求,则直接跳过。 if (r->headers_out.content_length_n == -1) {
if (http版本 < http 1.1) {
r->keepalive = 0; //关闭keep alive
} else {
if (开启chunk) {
r->chunked = 1;
} else {
r->keepalive = 0; //也就是,如果关闭了chunk,则也关闭了keep alive。
}
}
}
|
对应的body filter的流程,则更加简单,直接对当前输出的buf chain进行一个chunk封装。
第二、Nginx中Gzip模块和r->headers_out.content_length_n
r->headers_out.content_length_n :这个在Nginx内部用于表述请求返回内容的长度。但注意这不是完全相等的,只有在 r->headers_out.content_length_n >=0的时候,才有意义。比如说,通常后端的upstream(比如说PHP),如果没有在脚本中强制header输出content-length,则默认在nginx中 r->headers_out.content_length_n = -1。
Gzip模块也是一个典型的Filter模块。这里简单介绍下,后续可以详细描述。在header filter中会直接清空 r->headers_out.content_length_n和header中输出的content_length。为什么要清空呢?主要是因为gzip要对内容模块进行压缩处理,而在header filter的时候,gzip模块不可能计算出压缩后的内容长度(原因是在nginx中,header 输出和body的输出是完全两个不同的阶段),所以最好的办法就是在清空header中的content-length。这样结合之前的介绍的chunked模块,可以看出:在nginx中,如果采用gzip,如果是keep alive,则必然是chunked模式。
Upsteam如何和chunked结合
在前面介绍的Nginx Chunked模式实现中提到,Chunked模块的body filter是对当前处理的buf chain进行封装成一个Chunk。那么在Nginx中是如何实现多个Chunk的呢?这里要从 ngx_event_pipe_write_to_downstream这个函数说起,该函数是upstream处理中非常关键的一个函数,用于把upstream返回的数据直接进行输出。
分析该函数的伪代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
for ()
{ if (p->downstream_error) {
return ngx_event_pipe_drain_chains(p); //出错了
}
if (p->upstream_eof || p->upstream_error || p->upstream_done) {
//是最后一个节点,或者已经读取upstream数据完毕
//分类比的flush输出,这里面一般都含有bodyfilter比如
rc = p->output_filter(p->output_ctx, p->in);
//并且结束循环
p->downstream_done = 1;
break ;
}
/*计算当前BUF的size*/
if (bsize >= ( size_t ) p->busy_size) {
/*超过大小则刷数据*/
go flush;
}
for ( ;; ) {
//循环拼装输出buf,如果超过busy_size同样进行flush
}
flush: //flush输出
rc = p->output_filter(p->output_ctx, out);
} |
可以看到,有一个关键点,就是busy_size,它决定了一个chunk的大小。这个对应一个配置,追查后如下:在不同的upstream中有不同的定义,比如说proxy模式下,有proxy_busy_buffers_size,该值默认是proxy buffer size * 2 。(proxy buffer size根据操作系统,可以是4K或者8k)。fastcgi模式下,buffer_size默认是ngx_pagesize。配置项是fastcgi_busy_buffers_size。默认情况下是fastcgi的buffer size的2倍。(buffer size个是可配置的,buffer 个个数也是可以配置的,个数不能小于2)。
发表评论
-
软件介绍(apache lighttpd nginx)
2013-02-01 23:06 0一.软件介绍(apache lighttpd nginx ... -
如何设置nginx反向代理实现服务器瞬间故障转移
2013-01-30 13:39 0如何设置nginx反向代理实现服务器瞬间故障转移 ... -
Nginx下配置Http Basic Auth保护目录
2013-01-26 02:06 1134Nginx下配置Http Basic Auth保护目录 & ... -
Nginx 修改配置文件根据url来分发后端服务器(转)
2012-12-12 23:06 0Nginx 修改配置文件根据url来分发后端服务器( ... -
nginx 处理header 全攻略
2012-12-07 17:22 0nginx 处理header 全攻略 ... -
nginx配置
2012-12-04 23:18 0nginx配置 nginx配置 ... -
Nginx+tomcat配置集群
2012-12-04 22:43 0Nginx+tomcat配置集群 ... -
nginx:413 Request Entity Too Large
2012-11-23 14:44 0nginx:413 Request Entity T ... -
nginx+fastcgi+c/c++搭建高性能Web框架
2012-11-17 22:18 0nginx+fastcgi+c/c++搭建高性能 ... -
Nginx负载均衡重定向问题
2012-11-09 18:01 0用nginx实现负载均衡,当负载端口不是80时, ... -
CentOS安装Nginx 报错“configure: error: the HTTP rewrite module requires the PCRE lib
2012-10-31 14:10 5274CentOS安装Nginx 报错“configu ... -
Linux系统优化(1)---给nginx反向代理做优化
2012-10-20 14:54 0Linux系统优化(1)---给ng ... -
Avoid nginx 411 Content-Length required errors
2012-10-20 14:11 1759Avoid nginx 411 Content-Le ... -
Nginx+Tomcat实现https安全链接
2012-09-07 14:38 0Nginx+Tomcat实现https安全链接 ... -
Nginx配置文件详细说明
2012-09-07 12:48 8904Nginx配置文件详细说明 ... -
nginx配置文件详解
2012-09-07 12:46 1563nginx配置文件详解 列出了ng ... -
nginx 负载均衡-反向代理+cache浅谈
2012-09-01 23:23 992ngin只有硬盘 ... -
Nginx+Keepalived+Tomcat之动静分离的web集群
2012-08-29 00:38 10121Nginx+Keepalived+Tomcat之 ... -
关于nginx upstream的几种配置方式
2012-08-21 11:58 0Posted on 2011 年 06 月 16 ... -
nginx参考
2012-08-21 11:53 0nginx参考 http://whxhz.iteye.com ...
相关推荐
标签 "推流" 提到,这意味着系统允许内容提供商通过 RTMP 协议将流媒体内容推送到 Nginx 服务器。例如,使用 ffmpeg 工具可以将本地视频源推送到 Nginx 的 RTMP 监听端口。 6. **运行与监控** 在 `logs` 目录下,...
**Nginx与Nginx-RTMP及Nginx-HTTP-FLV模块** Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,被广泛应用于高并发场景,尤其在处理静态文件、HTTP缓存以及反向代理等方面表现出色。Nginx以其高效的事件驱动...
在给定的压缩包文件中,"使用必看.txt"可能包含了编译和使用过程中的注意事项,而"nginx-rtmp.zip"可能是包含了RTMP模块的源代码,这在搭建流媒体服务器时也会用到,因为HTTP FLV Module通常与RTMP模块结合使用,为...
这个模块是Nginx的一个扩展,它添加了对HTTP FLV流的支持,通常与RTMP服务器一起使用,用于视频流的推送和分发。 1. **Nginx**: Nginx是一款高性能的HTTP和反向代理服务器,也是一款邮件代理服务器。它的特点是稳定...
Nginx 中 HTTP 请求处理过程详解 Nginx 是一个流行的开源 Web 服务器软件,广泛应用于 Web 开发和生产环境中。理解 Nginx 中 HTTP 请求处理过程对于提高网站性能和可靠性至关重要。在本文中,我们将详细介绍 Nginx ...
本资源提供的是一款针对Windows平台的Nginx,其中已经集成了`nginx-http-flv-module`模块,这个模块主要用于支持HTTP实时流(HTTP Live Streaming, HLS)和Flash视频流(Flash Video, FLV)。现在我们将深入探讨这一...
HTTP FLV模块支持动态播放列表(m3u8),这与Apple的HLS协议兼容,使得用户可以在不同设备和浏览器上流畅地观看视频。 2. **RTMP 模块介绍** RTMP是一种基于TCP的应用层协议,常用于实时数据传输,如在线直播。...
虽然这两个协议与FLV不是直接关联,但它们同样用于流媒体服务,可能暗示这个Nginx配置也考虑到了这些协议的支持。 压缩包子文件的文件名"nginx-1.19.3_Compiled"表示包含了编译好的Nginx服务器,这通常包括配置文件...
在实际应用中,这个模块可能会与RTMP(Real-Time Messaging Protocol)或者HLS(HTTP Live Streaming)等其他流媒体协议结合使用,以提供多样化的播放方案。RTMP通常用于实时流传输,而HLS更适合适应不同的网络环境...
此外,HTTP-FLV 模块还可以与 RTMP 模块结合使用,允许 Nginx 服务器接收来自 RTMP 发布点的直播流,并将其转换为 HTTP-FLV 形式供客户端播放。 **RTMP 协议** RTMP 是 Adobe Systems 开发的实时传输协议,用于在...
已编译好的nginx-http-flv-molule(windows版) 基于: --> openssl-1.1.1g --> pcre-8.44 --> zlib-1.2.11 --> nginx-http-module-v1.2.10 --> nginx-1.21.6 ======================== 在网上查找半天都只有教程,...
【标题】"NGINX集成nginx-http-flv" 涉及的核心技术是将Nginx Web服务器与HTTP FLV模块结合,以实现高效的实时流媒体服务。Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,而HTTP FLV模块则允许它支持Flash ...
### Nginx对HTTP Method的控制与修改方法详解 #### 一、背景介绍 Nginx是一款广泛使用的高性能Web服务器和反向代理服务器,在实际应用中,有时我们需要自定义Nginx支持的HTTP请求方法。默认情况下,Nginx可能不支持...
通过这个模块,Nginx可以支持RTMP协议,实现实时流媒体的推拉流,为Flash Player和其他支持RTMP的客户端提供服务。1.2.9版本带来了稳定性和兼容性的提升,确保了与不同客户端的良好交互。 ### 编译集成过程 集成`...
标题“windows-nginx-http-flv.zip”提示我们这是一个在Windows操作系统上用于实现HTTP-FLV流媒体服务的Nginx配置文件和相关组件的压缩包。这个压缩包旨在帮助用户在Windows环境中快速搭建一个能够支持FLV格式视频流...
本篇文章将深入探讨一个特别版本的Nginx,即集成了`nginx-http-flv-module` 1.2.7模块的64位Nginx程序,该程序能够支持流媒体服务,特别是实时流媒体协议(RTMP)和FLV格式的视频流。 **Nginx简介** Nginx是由Igor ...
Nginx作为一款高性能的HTTP和反向代理服务器,也支持RTMP(Real-Time Messaging Protocol)协议,可以用于处理流媒体数据。本文将详细介绍如何配置Nginx以实现RTSP(Real Time Streaming Protocol)到RTMP的转换,并...
5. **配置与使用**:要使用`nginx-http-flv-win32-master`,你需要在Windows环境中安装Nginx,并将解压后的文件夹中的配置文件集成到Nginx的配置结构中。这通常包括修改`nginx.conf`,添加或更新模块配置,以及设置...
HTTP-FLV模块是Nginx的一个扩展,允许服务器通过HTTP协议传输FLV(Flash Video)流。这种模块对于那些希望利用HTTP分发FLV流的开发者来说非常实用,尤其适用于RTMP(Real-Time Messaging Protocol)不被支持或者需要...
**Nginx-1.19.6与Nginx-HTTP-FLV-Module** Nginx是一款高性能的Web服务器和反向代理服务器,它以其轻量级、高并发和稳定性著称。Nginx-1.19.6是Nginx的一个版本,发布于2020年11月27日。这个版本可能包含了性能优化...