linux下让lighttpd支持websocket

最近,在研究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第一步是需要确定安装环境,首先需要的是automakelibtool环境,这两个环境应该是Makefile shell脚本所需的运行环境。

    1.2libpcre是正则表达式解析库。

12中在所需要的支持库一般的平台上都会有,具体可以去/lib目录下查看,如果有的话就不需要移植安装了。

1.3openssl库,这个库是httpswss所必须的,在使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,而后在执行lighttpdconfigure脚本时添加--with-websocket[=all, rfc-6455, ietf-00] [--with-openssl]  选项参数即可。

6.这样基本完成了lighttpd加入websocket的配置。这样编译出来的lighttpd就支持websocket协议。

二、lighttpdwebsocket模块理解。

添加模块的过程其实相对是比较简单的,在INSTALL说明文档中已经步骤已经详细列明了。下面我们来说说对这个插件模块的理解。这样我们就能更好的去配置使用这个模块。

 

 

通过上面这个框图,可以看到,client 端发来websocket请求,lighttpd则将请求转由websocket_mod处理,通过websocket_mod完成与client的握手,在握手后建立了连接。我们知道,websocket说到底还是socketwebsocket的特性就是能够实现长连接从而使得服务器能够主动给客户端发送消息。因此,在backendwebsocket_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\/*" 指定了lighttpdresource

后面括号内的则指定代理的地址,端口,协议。如果理解上面的模型,那么这里就很容易理解了。

这样,当我们通过lighttpd访问ws://addr:port/tcp_proxy/ 就等于lighttpdtcp来请求本地的 127.0.0.1:10000

同样的,我们可以配置porto来改变lighttpd本地请求的协议类型,如指定了protowebsocket

最后

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参数的等级可以设置14,打印信息是在lighttpd服务器主目录下的 error.log access.log

以上就是这个模块的使用方法。


你可能感兴趣的:(linux下让lighttpd支持websocket)