HTML5中Websockets与Apache服务器的兼容性

1. 什么是Websockets?

Websocket是HTML5中新增的一种协议,使得客户端和服务器之间可以建立持久性的连接,可以去除HTTP协议中的瓶颈,使得双方可以实时地进行通讯。Websockets允许在单个TCP连接上进行双向通讯。

Websockets的协议描述可以在RFC6455中找到,并且已经被所有现代的Web浏览器所支持。

GET /chat HTTP/1.1

Host: example.com:8000

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Sec-WebSocket-Version: 13

2. Apache服务器对Websockets的支持

2.1. Apache服务器的短连接

Apache服务器是广为使用的Web服务器之一,但是它一般被用来处理短连接的HTTP请求。因此,Apache服务器本身并不支持Websockets协议。当客户端尝试连接到一个WebSocket端口时,Apache服务器的默认配置会阻止这个握手请求并以HTTP的方式返回一个错误消息。

在默认情况下,Apache会尝试在请求的时候将其转发到被请求的HTTP端口上,然后web服务器可以将它的HTTP响应返回给客户端。这种转发方式仅仅支持常规的HTTP请求,而不支持WebSocket协议进行的通讯。

HTTP/1.1 400 Bad Request

Date: Thu, 08 Dec 2011, 21:39:00 GMT

Connection: close

Vary: Accept-Encoding

Content-Length: 111

Content-Type: text/html; charset=iso-8859-1

<html><head>

<title>Bad Request</title>

</head><body>

<h1>Bad Request</h1>

Your browser sent a request that this server could not understand.

</body></html>

2.2. 使用模块实现Websockets

Apache服务器可以使用模块来支持Websockets协议。其中两种可选的模块是:

mod_websocket

mod_proxy_wstunnel

这些模块可以将Websockets请求转发到服务器端的应用程序或服务。同时,可以使用反向代理 Apache服务器作为Websockets协议的中介。

使用mod_proxy_wstunnel模块的示例:

<ifModule mod_proxy.c>

ProxyPass /ws ws://localhost:8080/ws

ProxyPassReverse /ws ws://localhost:8080/ws

</ifModule>

这段配置的意思是将 /ws 这个路径所对应的Websockets请求,转发到本地的 8080 端口上。

3. 其他Web服务器对Websockets的支持

除了Apache服务器之外,其他的Web服务器也支持Websockets协议。下面列出几个例子:

Nginx:使用ngx_http_websocket_module模块提供支持。

Jetty:兼容Servlet和Websockets协议。

Tomcat:使用Tomcat7之后的版本可以兼容Websockets协议。

IIS:使用iisnode模块提供支持。

这些Web服务器也通过模块或者插件的方式来支持Websockets协议。不过具体的实现方法会依赖Web服务器的不同。

4. 总结

Websockets是HTML5中新增的一种协议,通过Websockets协议,可以使得客户端和服务器之间建立持久性的连接,实现双向实时通讯。Apache服务器本身并不支持Websockets协议,但是可以使用模块来支持Websockets协议。其他的Web服务器也可以通过类似的方式来支持Websockets协议。