您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
nginx实现websocket的域名绑定
发布时间:2020-06-21 08:32:05编辑:雪饮阅读()
我们知道在服务器端可以通过ip和端口并结合相关后端开发语言就可以搭建一个websocket服务,这里以swoole举例,形如
<?php
$ws=new swoole_websocket_server("0.0.0.0",9501);
//监听websocket客户端打开事件
$ws->on('open',function($ws,$request){
//向websocket客户端响应(必须回应)
$ws->push($request->fd,"welcome");
});
//监听websocket服务端接收信息事件
$ws->on('message',function($ws,$request){
$data=json_decode($request->data,true);
if(json_last_error()!=JSON_ERROR_NONE) return;
if(!isset($data['notify'])) return;
if($data['notify']!=1) return;
foreach ($ws->connections as $fd) {
// 需要先判断是否是正确的websocket连接,否则有可能会push失败
if($fd!=$request->fd && $ws->isEstablished($fd)){
$ws->push($fd, $request->data);
}
}
});
//监听客户端关闭连接事件
$ws->on("close",function($ws,$request){
echo "close\n";
});
$ws->start();
?>
我们可以看到这里第一个参数就是ip地址,也就是服务端允许将该websocket服务向外提供的ip入口,虽然提供了ip入口,但当通过该ip入口到达服务器时还不能让其进入服务器内部,此时就是第二个参数端口的作用,即该websocket允许从某个端口进入。
那么此时前端(javascript)访问websocket的地址即“ws://服务器ip地址+:9501/”该访问形式有点安全隐患,暂且不考虑前缀ws(websocket也有类似与http的https安全协议,只是websocket的安全协议是wss),而是地址问题,该地址直接曝露了服务器ip地址,这样很不安全。
Websocket域名绑定
为了让websocket能像域名那样可以直接访问域名即所谓的域名绑定,其实websocket的确可以这样做,以nginx服务器为例。
首先我们在nginx中新建一个server即站点配置在apache中可以理解为一个vhost配置
然后在该server中覆盖原本的” location / {。。。}”段的配置,这里原本是配置web站点根服务的,我们可以直接覆盖如:
location / {
proxy_pass http://127.0.0.1:9501;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
那么此时只要前端把ws的ip地址和端口直接整体替换为该nginx新增的server的域名即可。当然该域名也必须像是正常域名那样有解析到上面的服务器才行。
关键字词:nginx,websocket,域名绑定
上一篇:LetsgoMessaging即时聊天开发(SignalR+php+websocket)
下一篇:关于php500错误communication error(return code 0或return code 9)