最近,在研究websocket,公司需求有让嵌入式服务器lighttpd支持websocket,于是折腾了很长一段时间,终于在让通了。
下面简单讲解一下,移植的过程。
lighttpd是以查件的方式来支持websocket协议的,网上搜索了一下,找到了这个https://github.com/nori0428/mod_websocket
这个模块是一个日本人写的,看了一下讨论区,会发现,他们对待技术的纯粹性,不禁感叹国内外的差距啊。闲话不多扯,进入正题
1、下载lighttpd的websocket协议支持模块,地址在
https://github.com/nori0428/mod_websocket
解压后可以看到目录下有个INSTALL文件,模块的安装方法在这个INSTALL文件中有具体的阐明,下面来一一说明具体步骤。
1.依赖的环境,
1.1第一步是需要确定安装环境,首先需要的是automake和libtool环境,这两个环境应该是Makefile 和shell脚本所需的运行环境。
1.2libpcre是正则表达式解析库。
1和2中在所需要的支持库一般的平台上都会有,具体可以去/lib目录下查看,如果有的话就不需要移植安装了。
1.3openssl库,这个库是https和wss所必须的,在使lighttpd支持ssl的时候我们就需要用到这个依赖库,具体的配置过程,可以去网上查看lighttpd帮助文档(http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_SSL)。
2.配置安装websocket_mod
在websocket_mod目录下执行./bootstrap
然后执行 ./configure --with-websocket=all --with-test --host=mipsel-linux
参数说明: 注意文档中--with-websocket后面的[=all, rfc-6455, ietf-00]是可选项,具体看所需要使用的websocket规范做选择,这里我选择的是all表示都支持,而host参数则是表示交叉编译的环境。更多的参数配置可以执行./configure --help来查看。
在执行完上面的命令后,配置工作就完成的差不多了。下面就是将其编进lighttpd
3.下载和安装lighttpd,本文讲述的是为lighttpd添加websocket协议支持,关于移植安装lighttpd可以去网上查阅相关资料,在此不再赘述。
4.在lighttpd目录下./configure --with-lighttpd=/path/to/lighttpd_top_srcdir 这一步其实是与第2步重复了,所做的事情就是指定lighttpd的目录,因此,如果你早就下好了lighttpd,那么可以在第二步中加入后面的选项参数即可。
configure 后再执行make install 就会把websocket的相关代码和配置加入到lighttpd的源码中。为了确认这一点,可以进入lighttpd目录,产看src/目录下的源文件是否多了websocket相关的.c文件。
5.进入lighttpd目录下执行脚本文件./autogen.sh,而后在执行lighttpd的configure脚本时添加--with-websocket[=all, rfc-6455, ietf-00] [--with-openssl] 选项参数即可。
6.这样基本完成了lighttpd加入websocket的配置。这样编译出来的lighttpd就支持websocket协议。
二、lighttpd的websocket模块理解。
添加模块的过程其实相对是比较简单的,在INSTALL说明文档中已经步骤已经详细列明了。下面我们来说说对这个插件模块的理解。这样我们就能更好的去配置使用这个模块。
通过上面这个框图,可以看到,client 端发来websocket请求,lighttpd则将请求转由websocket_mod处理,通过websocket_mod完成与client的握手,在握手后建立了连接。我们知道,websocket说到底还是socket,websocket的特性就是能够实现长连接从而使得服务器能够主动给客户端发送消息。因此,在backend和websocket_mod之间的通信协议我们可以用tcp或者是websocket,这样backend可以是一个tcp服务器或者websocket服务器。而lighttpd在此只是充当一个代理服务器的角色。下面我们拿一个websocket_mod的配置文件来具体进行说明。
-------------------------------------------websocket.conf------------------------------------------------------
server.modules += ( "mod_websocket" )
websocket.server = (
# WebSocket-TCP Proxy
# $ ruby bin/echo.rb
"^\/tcp_proxy\/*" => ( "host" => "127.0.0.1",
"port" => 10000,
"proto" => "tcp" ),
# WebSocket Proxies
# for socket.io
# $ node bin/echo.js
"^\/socket.io\/" => ( "host" => "127.0.0.1",
"port" => 8081,
"proto" => "websocket" ),
# for ipython notebook
# $ ipython profile create default
# And rewrite ~/.ipython/profile_default/ipython_notebook_config.py
# see
# $ ipython notebook --pylab inline --no-browser
"^\/ipython\/kernels\/.+" => ( "host" => "127.0.0.1",
"port" => 8888,
"proto" => "websocket" ),
# for mosquitto
# refer to
"^\/mqtt\/*" => ( "host" => "127.0.0.1",
"port" => 1883,
"proto" => "tcp",
"type" => "binary",
"subproto" => "mqttv3.1" )
)
websocket.ping_interval = 5 # send PING per 5 secs
websocket.timeout = 30 # disconnect a client when not to recv PONG for 30 secs
websocket.debug = 4 # LOG_DEBUG
--------------------------------------------------------------------------------------------------------------------
首先,需要启用lighttpd 的websocket就必须要有这一行:
server.modules += ( "mod_websocket" )
接着看这段
websocket.server = (
# WebSocket-TCP Proxy
# $ ruby bin/echo.rb
"^\/tcp_proxy\/*" => ( "host" => "127.0.0.1",
"port" => 10000,
"proto" => "tcp" )
websocket.server 跟其他服务一样,指定了启用websocket中的服务。
"^\/tcp_proxy\/*" => ( "host" => "127.0.0.1","port" => 10000,"proto" => "tcp" )
这句话是websocket配置的核心,
"^\/tcp_proxy\/*" 指定了lighttpd的resource
后面括号内的则指定代理的地址,端口,协议。如果理解上面的模型,那么这里就很容易理解了。
这样,当我们通过lighttpd访问ws://addr:port/tcp_proxy/ 就等于lighttpd以tcp来请求本地的 127.0.0.1:10000。
同样的,我们可以配置porto来改变lighttpd本地请求的协议类型,如指定了proto为websocket。
最后
websocket.ping_interval = 5 # send PING per 5 secs
websocket.timeout = 30 # disconnect a client when not to recv PONG for 30 secs
websocket.debug = 4 # LOG_DEBUG
这三个参数从上面的注释就可以很容易理解,需要说明websocket.debug参数的等级可以设置1到4,打印信息是在lighttpd服务器主目录下的 error.log 和access.log
以上就是这个模块的使用方法。