Apache2开发自定义RTMP协议模块请求被拒绝如何解决
错误原因
你当前的实现仅注册了HTTP体系下的内容处理器、Scheme和默认端口,但RTMP是完全独立于HTTP的二进制TCP协议,Apache核心默认会对所有进入的连接执行HTTP请求行解析逻辑,RTMP握手的首字节是0x03(也就是访问日志里的\x03),完全不符合HTTP请求行的格式规范,所以直接被Apache核心返回400错误,请求根本没有走到你编写的mod_rtmp_handler里。
解决方案
代码修改
- 移除现有HTTP内容处理器的注册逻辑,改用连接级钩子接管全链路处理:注册
ap_hook_process_connection钩子,在TCP连接建立后、Apache启动HTTP解析前就抢占整个连接的IO控制权,返回OK即可跳过Apache默认的HTTP解析流程。 - 自行实现完整的RTMP协议逻辑:包括C0/C1/C2握手、帧拆分解析、命令处理、流推拉逻辑,不能使用
ap_rputs这类面向HTTP响应的输出函数,直接操作apr_socket接口进行二进制数据读写。 - 你当前注册的
ap_hook_http_scheme、ap_hook_default_port仅适用于HTTP体系下的衍生协议,对RTMP无实际作用,可直接移除。
配置修改
- 首先确认Apache的
ports.conf配置中添加了Listen 1935,确保Apache监听RTMP默认端口。 - 现有虚拟主机配置中的
Protocols、SetHandler配置均为HTTP体系下的指令,对RTMP无效可以直接删除,仅保留端口监听绑定即可。
调试注意
curl对RTMP的支持依赖编译时的libcurl RTMP拓展,且你需要先完成RTMP握手逻辑开发后再进行请求测试,否则即使跳过HTTP解析也会收到握手失败的报错。
内容的提问来源于stack exchange,提问作者Dropye
相关产品推荐
相关产品推荐

