如果你的业务是短连接,但是要主动推送某些东西,做成长连接的样子。
例如:
卡牌游戏,他是弱交互,但是需要一点推送和聊天服务。
部分商户后台,需要在有订单的时候来个弹窗。
Github:https://github.com/wandenberg/nginx-push-stream-module
介绍是说支持EventSource, WebSocket, Long Polling, 和 Forever Iframe。
这里用WebSocket举例
由于我的机器里面有NGINX,只能再编译一个举例:
wget nginx.org/download/nginx-1.8.0.tar.gz
tar -zxf nginx-1.8.0.tar.gz
apt-get install git
git clone https://github.com/wandenberg/nginx-push-stream-module
编辑配置文件,让他只监控8080
vim nginx-1.8.0/conf/nginx.conf
worker_processes auto;
events {
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 30;
push_stream_max_messages_stored_per_channel 20;
push_stream_message_ttl 7d;
push_stream_shared_memory_size 2048M;
server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /channels-stats {
push_stream_channels_statistics;
push_stream_channels_path $arg_id;
}
location /pub {
push_stream_publisher admin;
push_stream_store_messages on;
push_stream_channels_path $arg_id;
}
location ~/sub/(.*) {
push_stream_subscriber;
push_stream_channels_path $1;
}
location ~ /ws/(.*) {
push_stream_subscriber websocket;
push_stream_channels_path $1;
push_stream_message_template "~text~";
push_stream_websocket_allow_publish off;
push_stream_ping_message_interval 10s;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
此处的配置参考了 baseconfig,以及websocket配置(点我)
cd nginx-1.8.0
./configure --add-module=./../nginx-push-stream-module
make
make install
这时候推送服务器已经架设完毕了
你的推送服务器http请求就是
http://你的ip:8080
你的推送服务器ws监控就是
ws://你的ip:8080
官方举例说,你给pub推送消息的时候,你的ws也会收到,我们测试一下
首先我们写一段JS,让他监控我的服务器频道为medusaTest,随便新建个页面吧
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
TestPage
</body>
<script>
ws = new WebSocket("ws://192.168.1.50:8080/ws/medusaTest/");
ws.onopen = function(){};
ws.onmessage = function(evt){
console.log(evt);
alert(evt.data);
};
ws.onclose = function(evt){};
ws.onerror = function(evt){};
</script>
</html>
如果想监控多个频道
ws://192.168.1.50:8080/ws/mt/test2/id1to2/...
然后用POST向该频道推送一下数据试一下,我这里用的是POSTMAN,当然你也可以自己写脚本
http://192.168.1.50:8080/pub/?id=medusaTest
简单的使用完成了,具体基本都是业务进行拓展
官方文档介绍的还算详细
从此告别JS轮训和业务上难搞的服务器端长连接
告辞