我正在尝试制作一个简单的webapp,它使用websocket与lighttpd服务器通信。不幸的是,我的设置不工作,我不知道为什么。在互联网上搜索没有提供如何使用mod_wstunnel的明确示例(可能有人有lighttpd的经验。你可以在下面找到我的沙盒:
lighttpd.conf
server.modules += ("mod_wstunnel", "mod_setenv")
server.indexfiles = ("index.html")
server.document-root = "/var/www/html/websocket"
$HTTP["url"] =~ "^/websockify" {
wstunnel.server = ( "" => ( ( "host" => "127.0.0.1", "port" => "5900" ) ) )
wstunnel.frame-type = "binary"
server.stream-request-body = 2
server.stream-response-body = 2
}
index . html
<h1>Real Time Messaging</h1>
<pre id="messages" style="height: 400px; overflow: scroll"></pre>
<input type="text" id="messageBox" placeholder="Type your message here" style="display: block; width: 100%; margin-bottom: 10px; padding: 10px;" />
<button id="send" title="Send Message!" style="width: 100%; height: 30px;">Send Message</button>
<script>
(function() {
const sendBtn = document.querySelector('#send');
const messages = document.querySelector('#messages');
const messageBox = document.querySelector('#messageBox');
let ws;
function showMessage(message) {
messages.textContent += `nn${message}`;
messages.scrollTop = messages.scrollHeight;
messageBox.value = '';
}
function init() {
if (ws) {
ws.onerror = ws.onopen = ws.onclose = null;
ws.close();
}
ws = new WebSocket("ws://127.0.0.1:5900/websockify")
ws.onopen = () => {
console.log('Connection opened!');
}
ws.onmessage = ({ data }) => showMessage(data);
ws.onclose = function() {
ws = null;
}
}
sendBtn.onclick = function() {
if (!ws) {
showMessage("No WebSocket connection :(");
return ;
}
ws.send(messageBox.value);
showMessage(messageBox.value);
}
init();
})();
</script>
提前感谢您的帮助。
lighttpd mod_wstunnel终止lighttpd中的websocket隧道,以便客户端可以,例如,通过websocket向lighttpd发送JSON, lighttpd将解码并仅将JSON传递给后端。
如果你的服务器是它自己的websocket服务器,你想让lighttpd代理websocket连接到你的websocket服务器,然后看到lighttpd mod_proxy或lighttpd mod_cgi和配置这些模块中的任何一个允许升级Upgrade: websocket
请求
我一直在使用boost::beast c++库来做这样的事情…但是这个想法对于任何其他语言/库都是一样的。
大多数可用的ws库(c++或其他)被认为是独立的websocket服务器,被设计成独立的。为了使它们作为lighttpd后端工作,web服务器需要代理websocket消息,使库相信它们正在接收直接的客户端提要。把您的服务器想象成像cgi应用程序一样与lighttpd通信…不完全是,但这就是我的想法。
就像gstrauss说的,lighttpd使用mod_proxy:
server.modules += ( "mod_proxy" )
$HTTP["url"] =~ "^/wsck" {
proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => "6000" ) ) )
proxy.header = ( "upgrade" => "enable" )
}
从Boost::Beast中选择一个服务器示例(其他语言应该有类似的库):
https://www.boost.org/doc/libs/1_75_0/libs/beast/doc/html/beast/examples.html
编译并让它在后台运行。不要忘记lighttpd之间的端口。配置和websocket守护进程必须匹配!!
从javascript创建websocket:
ws = new WebSocket("ws://yourServer.xyz/wsck");
所有其他代码可以保持不变…我还没检查你的;-)
请注意这里没有使用端口号。我们直接与lighttpd对话,它将请求代理到后端运行服务器(端口6000打开)。
希望有帮助!