用的是nginx代理转发443到2120端口实现,官方说workman原生支持,没有实现(现象是 访问 htttps://域名:2120/ 超时,不知道是服务器问题还是什么)

后转为用nginx代理转发实现

1、假设用https://socket.test.com 作为socket连接的地址. https://www.test.com还是网站本身,实现共存,不影响主站访问

1、nginx的 网站.conf,注意红色部分。2121那个转发不是必须的,因为是服务端curl请求,可以直接请求ip地址带端口

server
{
listen 443;
server_name *.test.com test.com; set $flag 0;
if ($host != 'www.test.com') {
set $flag "${flag}1"; } if ($host = 'socket.test.com'){
set $flag "${flag}1";
} if ($flag = "01"){
rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
#if ($host != 'www.test.com' ) { # }
ssl on;
ssl_certificate cert/cert-1542176077391__.test.com.crt;
ssl_certificate_key cert/cert-1542176077391__.test.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on; index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/test;
error_page 404 /404.html; location /push.api
{
proxy_pass http://127.0.0.1:2121;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
location /socket.io
{
proxy_pass http://127.0.0.1:2120;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
} location /{
if (!-e $request_filename) {
rewrite ^/(.+\.(html|xml|json|htm|php|jsp|asp|shtml))$ /index.php?$1 last;
}
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } include enable-php5.2.conf;
} location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
} location ~ .*\.(js|css)?$
{
expires 12h;
} location ~ /.well-known {
allow all;
} location ~ /\.
{
deny all;
} #access_log /home/wwwlogs/test.com.log;
}

2、服务端socket.io.php,无需更改。还是用端口2120,不用开启ssl

<?php
use Workerman\Worker;
use Workerman\WebServer;
use Workerman\Lib\Timer;
use PHPSocketIO\SocketIO; include __DIR__ . '/vendor/autoload.php'; // 全局数组保存uid在线数据
$uidConnectionMap = array();
// 记录最后一次广播的在线用户数
$last_online_count = 0;
// 记录最后一次广播的在线页面数
$last_online_page_count = 0; // PHPSocketIO服务
$sender_io = new SocketIO(2120);
// 客户端发起连接事件时,设置连接socket的各种事件回调
$sender_io->on('connection', function($socket){ file_put_contents('/home/wwwroot/test/home/socketioserver.txt',date('Y-m-d H:i:s')."\r\n connection:uid:".$uid."\r\n=======\r\n",FILE_APPEND); /**/
// error_reporting(E_ALL ^ E_NOTICE);
//$root_dir = realpath(dirname(__FILE__).'/../'); //require_once($root_dir."/config/config.php");
/*
require_once(APP_DIR.'/base/kernel.php');
@require_once(APP_DIR.'/base/defined.php'); if(!kernel::register_autoload()){
require_once(APP_DIR.'/base/autoload.php');
}*/
/**/ // 当客户端发来登录事件时触发
$socket->on('login', function ($uid)use($socket){
file_put_contents('/home/wwwroot/test/home/socketioserver.txt',date('Y-m-d H:i:s')."\r\n login:uid:".$uid."\r\n=======\r\n",FILE_APPEND); global $uidConnectionMap, $last_online_count, $last_online_page_count;
// 已经登录过了
if(isset($socket->uid)){
return;
}
// 更新对应uid的在线数据
$uid = (string)$uid;
if(!isset($uidConnectionMap[$uid]))
{
$uidConnectionMap[$uid] = 0;
}
// 这个uid有++$uidConnectionMap[$uid]个socket连接
++$uidConnectionMap[$uid]; /* $dbs= kernel::database();
$dbs->exec('update sdb_b2c_online_users set online="'.serialize($uidConnectionMap).'"');*/
//file_put_contents(HOME_DIR.'/chat/OnlineUsersCache.txt',serialize($uidConnectionMap));
//app::get('b2c')->setConf('chat.online_users',$uidConnectionMap); // 将这个连接加入到uid分组,方便针对uid推送数据
$socket->join($uid);
$socket->uid = $uid;
// 更新这个socket对应页面的在线数据
$socket->emit('update_online_count',count($uidConnectionMap));
}); // 当客户端断开连接是触发(一般是关闭网页或者跳转刷新导致)
$socket->on('disconnect', function () use($socket) { file_put_contents('/home/wwwroot/test/home/socketioserver.txt',date('Y-m-d H:i:s')."\r\n disconnect:uid:".$socket->uid."\r\n=======\r\n",FILE_APPEND); if(!isset($socket->uid))
{
return;
}
global $uidConnectionMap, $sender_io;
// 将uid的在线socket数减一
if(--$uidConnectionMap[$socket->uid] <= 0)
{
unset($uidConnectionMap[$socket->uid]);
}
// file_put_contents(HOME_DIR.'/chat/OnlineUsersCache.txt',serialize($uidConnectionMap)); });
}); // 当$sender_io启动后监听一个http端口,通过这个端口可以给任意uid或者所有uid推送数据
$sender_io->on('workerStart', function(){
// 监听一个http端口
$inner_http_worker = new Worker('http://0.0.0.0:2121');
// 当http客户端发来数据时触发
$inner_http_worker->onMessage = function($http_connection, $data){
$_POST = $_POST ? $_POST : $_GET; if($_POST['appkey']!='fads'){
// return $http_connection->send('fail');
} // 推送数据的url格式 type=publish&to=uid&content=xxxx
switch(@$_POST['type']){
//聊天
case 'publish':
global $sender_io;
$to = @$_POST['to'];
$_POST['content'] = (@$_POST['content']);
// 有指定uid则向uid所在socket组发送数据
if($to){
$sender_io->to($to)->emit('new_msg', $_POST['content']);
// 否则向所有uid推送数据
}else{
$sender_io->emit('new_msg', @$_POST['content']);
}
// http接口返回ok
return $http_connection->send('ok'); break; //新的拍卖出价时
case 'new_auction_price':
global $sender_io;
$to = @$_POST['to'];
$_POST['content'] = (@$_POST['content']);
// 有指定uid则向uid所在socket组发送数据
if($to){
$sender_io->to($to)->emit('new_auction', $_POST['content']);
// 否则向所有uid推送数据
}else{
$sender_io->emit('new_auction_price', @$_POST['content']);
}
return $http_connection->send('ok'); break; //创建拍卖
case 'create_auction':
global $sender_io;
$to = @$_POST['to'];
// 有指定uid则向uid所在socket组发送数据
if($to){
$sender_io->to($to)->emit('create_auction', $_POST['content']);
// 否则向所有uid推送数据
}else{
$sender_io->emit('create_auction', @$_POST['content']);
}
return $http_connection->send('ok');
break; //延迟
case 'delay_auction':
global $sender_io;
$to = @$_POST['to'];
// 有指定uid则向uid所在socket组发送数据
if($to){
$sender_io->to($to)->emit('delay_auction', $_POST['content']);
// 否则向所有uid推送数据
}else{
$sender_io->emit('delay_auction', @$_POST['content']);
}
return $http_connection->send('ok');
break; //流拍
case 'cancel_auction':
global $sender_io;
$to = @$_POST['to'];
// 有指定uid则向uid所在socket组发送数据
if($to){
$sender_io->to($to)->emit('cancel_auction', $_POST['content']);
// 否则向所有uid推送数据
}else{
$sender_io->emit('cancel_auction', @$_POST['content']);
}
return $http_connection->send('ok');
break; //开始今日拍卖时+切换到下一个拍卖时+结束当日拍卖到下一个拍卖时
case 'change_domain_item':
global $sender_io;
$to = @$_POST['to'];
// 有指定uid则向uid所在socket组发送数据
if($to){
$sender_io->to($to)->emit('change_domain_item', $_POST['content']);
// 否则向所有uid推送数据
}else{
$sender_io->emit('change_domain_item', @$_POST['content']);
}
return $http_connection->send('ok'); }
return $http_connection->send('fail');
};
// 执行监听
$inner_http_worker->listen(); // 一个定时器,定时向所有uid推送当前uid在线数及在线页面数
Timer::add(1, function(){
global $uidConnectionMap, $sender_io, $last_online_count, $last_online_page_count;
$online_count_now = count($uidConnectionMap);
$online_page_count_now = array_sum($uidConnectionMap);
// 只有在客户端在线数变化了才广播,减少不必要的客户端通讯
if($last_online_count != $online_count_now || $last_online_page_count != $online_page_count_now)
{
$sender_io->emit('update_online_count', $online_count_now);
$last_online_count = $online_count_now;
$last_online_page_count = $online_page_count_now;
}
});
}); if(!defined('GLOBAL_START'))
{
Worker::runAll();
}

3、客户端js.最大的坑就是这里。原先以为io('地址'),是要填完整的,比如下面

<script src='https://socket.test.com/web-msg-sender-master/socket.io-client/socket.io.js?v=123123'></script>
<script>
$(document).ready(function () {
// 创建WebSocket 对象
var socket = io("https://socket.test.com/socket.io",{debug:true});
/*
* 2019-08-24 11:27:35
connection:uid:
=======
2019-08-24 11:28:04
disconnect:uid:
*
* */ //var socket = io("http://118.190.21.61:2120",{debug:true});
/*
* 2019-08-24 11:26:08
connection:uid:
=======
2019-08-24 11:26:08
login:uid:1566617168000
=======
2019-08-24 11:26:35
disconnect:uid:1566617168000
=======
* */ //连接成功时,触发事件
// 连接后登录
console.log('socket',socket);
socket.on('connect', function(){
socket.emit('login', uid);
});
// 后端推送来消息时
socket.on('new_msg', function(msg){
$('#content').html('收到消息:'+msg);
$('.notification.sticky').notify();
});
// 后端推送来在线数据时
socket.on('update_online_count', function(online_stat){
$('#online_box').html(online_stat);
}); })
</script>

后来发现怎么也连不上socket服务,on事件监听完全失效。

后来看了 lib/manager.js里源码才知道,系统会自动补全socket.io,所以初始化时io里变量只需填写域名即可,正确如下。注意红色加粗部分

<script src='https://socket.test.com/web-msg-sender-master/socket.io-client/socket.io.js?v=123123'></script>
<script>
$(document).ready(function () {
// 创建WebSocket 对象
var socket = io("https://socket.test.com",{debug:true});
/*
* 2019-08-24 11:27:35
connection:uid:
=======
2019-08-24 11:28:04
disconnect:uid:
*
* */ //var socket = io("http://118.190.21.61:2120",{debug:true});
/*
* 2019-08-24 11:26:08
connection:uid:
=======
2019-08-24 11:26:08
login:uid:1566617168000
=======
2019-08-24 11:26:35
disconnect:uid:1566617168000
=======
* */ //连接成功时,触发事件
// 连接后登录
console.log('socket',socket);
socket.on('connect', function(){
socket.emit('login', uid);
});
// 后端推送来消息时
socket.on('new_msg', function(msg){
$('#content').html('收到消息:'+msg);
$('.notification.sticky').notify();
});
// 后端推送来在线数据时
socket.on('update_online_count', function(online_stat){
$('#online_box').html(online_stat);
}); })
</script>

web-msg-sender的https支持改造的更多相关文章

  1. 使用Spring Boot开发Web项目(二)之添加HTTPS支持

    上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...

  2. web基础系列(五)---https是如何实现安全通信的

    https是如何实现安全通信的 如果有不正确的地方,还望指出! web基础系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 回顾 总结几个概念(具体描述可以看上一篇文章) 数字 ...

  3. 转自《https安全链接的配置教程:startSSl免费证书申请与nginx的https支持配置》

    一.什么是 SSL 证书,什么是 HTTPS 网站? SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secu ...

  4. 为Azure Web Site 添加ADFS验证支持之二 在代码里使用ADFS

    下面我们来创建一个MVC 5.0的ASP.Net程序,并且将它部署到Azure Web Site上 通过Visual Studio 2015创建Web Project 在选择ASP.net模板的地方, ...

  5. 为Azure Web Site 添加ADFS验证支持之一 设置ADFS的信任关系

    很多时候企业开发的应用都会通过AD(Active Directory)进行验证用户名密码的,在企业里面统一一个AD来进行账号密码管理也是一个很好的实践.当企业打算将一个应用迁移到Azure的时候,使用 ...

  6. 解决企业In-House安装APP需HTTPS支持的问题(转载)

    同事写的一篇文章,感觉不错,转过来. 解决企业In-House安装APP需HTTPS支持的问题 问题背景: 能否通过应用服务器发布企业应用: 解决iOS7.1后,发布地址必须为HTTPS服务器. 写作 ...

  7. Asp.Net Web Api 接口,拥抱支持跨域访问。

    如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...

  8. vs中开发web站点使IIS Express支持局域网连接

    vs中开发web站点使IIS Express支持局域网连接 在开发webapi的时候,客户端设备都会使用局域网的地址访问webapi,有时候需要调试api.这个时候就需要使用一些技巧了,这里我记录了我 ...

  9. 无法打开项目文件“Web.csproj” 此安装不支持该项目类型

    今天把另外一个项目拷贝到我自己的机器上运行,发现突然打不开webapplication项目了,提示:无法打开项目文件“Web.csproj” 此安装不支持该项目类型.,就是那个网站,用度娘网上搜了一大 ...

随机推荐

  1. Docker基础理论整理(精简)

    目录 一.什么是docker,docker的概念 二.docker中的镜像 三.docker中的容器 四.docker中的仓库 五.docker的网络通信 bridge模式 host模式 contai ...

  2. springboot ElasticSearch 简单的全文检索高亮

    原文:https://segmentfault.com/a/1190000017324038?utm_source=tag-newest 首先引入依赖 <dependency> <g ...

  3. Resource接口

    [转]https://blog.csdn.net/hbtj_1216/article/details/85487787 参考:官方文档 1 简介 Java标准库中的java.net.URL类和标准处理 ...

  4. webpack多页面打包配置

    单页面应用:整个应用里面只有一个html文件.现在主流的框架,vue,react都是单页面应用. 所以webpack绝大部分都是对单页面打包.那么webpack如何对多页面进行打包 index.htm ...

  5. linux网络编程之posix消息队列

    在前面已经学习了System v相关的IPC,今天起学习posix相关的IPC,关于这两者的内容区别,简单回顾一下: 而今天先学习posix的消息队列,下面开始: 接下来则编写程序来创建一个posix ...

  6. Vim使用技巧(5) -- 宏的录制与使用

    想象一个场景,我们怎么快速把下面的所有链接都加上双引号?可能你手速快,可以很快的加完,但是如果链接有上万个呢?你如何在十秒以内加完? 这时候就需要用到“宏”(其实除了宏vim还有其它方法加上双引号,这 ...

  7. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——机器人塔(程序大题)

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B.他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A BA B A B B A 队内的组塔规则是: A 只 ...

  8. 【HDU-1045,Fire Net-纯暴力简单DFS】

    原题链接:点击!   大致题意:白块表示可以放置炮台的位置——每个炮台可以攻击到上下左右的直线上的炮台(也就是说在它的上下左右直线上不可以再放置炮台,避免引起互相攻击),黑块表示隔离墙的位置——不可放 ...

  9. Mongoose初使用总结

    连接mongoose mongoose连接数据库有两种方式 第一种: 'use strict'; const mongoose = require('mongoose'); mongoose.conn ...

  10. Python 操作Sonqube API 获取检测结果并打印

    1.需求:每次Sonqube检查完毕后,需要登陆才能看到结果无法通过Jenkins发布后直接看到bug 及漏洞数量. 2.demo:发布后,可以将该项目的检测结果简单打印出来显示,后面还可以集成钉钉发 ...