【问题标题】:Socket.io connects but never listens to any event when HTTPSSocket.io 连接但在 HTTPS 时从不监听任何事件
【发布时间】:2018-09-11 01:03:45
【问题描述】:

长话短说; 在 localhost 和 http 上开发我的代码时,socket.io 很好,并且可以在我的客户端和服务器之间来回通信。

现在我实现了 NGINX 并添加了 SSL 代理,socket.io 似乎与服务器成功连接,但没有听到或“触发”任何事件。

这是 NGINX 的 error.log 文件显示的内容

2018/04/01 15:58:45 [错误] 31893#0: *772 connect() 连接到上游时失败(111:连接被拒绝),客户端:XXX.XXX.XXX.XXX,服务器:. com,请求:“GET /socket.io/?EIO=3&transport=polling&t=MA1xgon HTTP/2.0”,上游:“http://127.0.0.1:8000/socket.io/?EIO=3&transport=polling&t=MA1xgon”,主机:“.com”,引用者:“https://.com/”

这是我的服务器 WebSocket 文件:

    import * as socketIo from 'socket.io';

let io;

export class WebSocket {

    static setServer(server): void {
        io = socketIo(server);

        io.on('connection', (socket) => {
            console.log('new connection');
            socket.on('sessionData', (data) => {
                console.log('Session Data event received');
                try {
                    data = JSON.parse(data);
                } catch(e) {
                    console.log('Unable to parse JSON data', data);
                    return;
                }
                console.log('Permission ID: ' + data.perm_id);
                io.emit('CON-' + data.perm_id,  JSON.stringify(data));
            });
        })
    }
}

这是我的主要服务器类,其中 socket.io 连接到端口 8000

import * as express from 'express';
import * as http from 'http';
import * as cors from 'cors';
import * as Passport from 'passport';
import * as bodyParser from 'body-parser';
import * as fileUpload from 'express-fileupload';
import {AuthStrategy} from './includes/passport-strategy';
import {WebSocket} from './includes/ws';
import {Database} from './includes/database';    

const app = express();


// Middleware go here
Passport.use('jwt', AuthStrategy);
app.use(Passport.initialize());
app.use(cors());
app.use(bodyParser.json());
app.use(fileUpload());

const server = http.createServer(app);
WebSocket.setServer(server);
server.listen(8000, function(){
    console.log('Server is running...');
    Database.connect().then(() => {
      console.log('Connected to SQL...');
      // Database.initializeDB().then(success => { console.log('success');}).catch(err => {
      //     console.log(err);
      // });
    }).catch( err => {
        console.log(err);
        console.log('error connecting to DB, make sure credentials entered are correct (secureaccessserver/Mavis/src/main/Server/includes/config.txt)');
    })
});

现在这是我的客户端尝试发送到我的 socket.io 服务器

    pathToSocket = 'https://' + window.location.hostname + '/socket.io/';
    // I've also tried pathToSocket = 'https://' + ..... + '/server/' with same results
    socket = io(this.pathToSocket);

    terminateConnection(): void {
    const Permission = this.sessionService.getPermission();
    this.socket.emit('sessionData', JSON.stringify({
      perm_id: Permission.perm_id,
      terminate: true
    }));
  }

最后是我的 nginx 配置文件

    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  cracenter.com www.cracenter.com;

        ssl_certificate "/root/cracenter.com.crt";
        ssl_certificate_key "/root/cracenter.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        include /etc/nginx/default.d/*.conf;

        location /server/ {
        proxy_pass "http://127.0.0.1:8000";
        }

        location /socket.io/ {
         proxy_pass "http://127.0.0.1:8000/socket.io/";
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $host;
        }
    }

}

现在,当我运行服务器并启动我的客户端(在同一云服务器上运行,只是不同的端口)时。我成功地获得了“新连接”控制台日志(来自 websocket 文件代码)但是“会话数据收到的事件”永远不会在控制台中打印,无论我尝试在我的服务器代码中触发多少次“terminateConnection”功能

【问题讨论】:

    标签: node.js sockets ssl nginx socket.io


    【解决方案1】:

    你有const server = http.createServer(app);,但也许你应该有const server = https.createServer(app);

    【讨论】:

    • 我假设我必须将它作为独立于非的依赖项安装?
    • 它已经包含在节点中。你必须要求它...const https = require ('https');
    • 或者我想,在你的情况下:import * as https from 'https';
    • 转换为 https 并添加一个选项参数 ` https.createServer(options, app) ` 包含我用于 ssl 的 .crt 和 .key 文件现在会引发错误 502 .. 我的错误有点偏离从主要问题,但有什么建议吗?服务器似乎运行良好,但所有路由都导致 502
    • 似乎我通过 nginx 访问时只得到 502,但如果我直接进入 IP 路由工作正常
    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多