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协议。