node.js+socket.io部署到线上无法建立链接?

在项目中发现,请求监听 3002 端口、socket.io 监听 8090 端口
在本地运行无误,但传到线上发现无法与 socket.io 建立链接
以下是我得代码:

const fs = require('fs')
const path = require('path')
const http = require('http')
const https = require('https')
const express = require('express')
const app = express()

// 允许跨域
app.all('*', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header('Access-Control-Allow-Headers', 'content-type')
  res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
  if (req.method.toLowerCase() == 'options')
    res.sendStatus(200)
  else
    next()
})

// 获取 https 请求参数
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({
  extended: false
}))
app.use(bodyParser.json())

// 连接 mongodb 数据库 writeOff
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/writeOff', {
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(doc => {
  console.log('mongoose.connect success')
}).catch(err => {
  console.log('mongoose.connect fail', err)
})
const schema = {
  name: String,
  bulletChat: String,
  fabulous: 0
}
var Kitten = mongoose.model('meetings', schema)

app.post('/update', (req, res) => {
  Kitten.findByIdAndUpdate(req.body.id, {
  }, (err, doc) => {
    if (err) {
      res.send('updata fail')
      return
    }
    console.log('updata success', doc)
    res.send(doc)
  })
})

app.get('/get', (req, res) => {
  Kitten.find().then(doc => {
    res.send(doc)
  }).catch(err => {
    res.send(err)
  })
})

// 创建服务
const options = {
  key: fs.readFileSync('../../FreeSSL.cn/bj.cn.key', 'utf8'),
  cert: fs.readFileSync('../../FreeSSL.cn/bj.cn.crt', 'utf8')
}

// const server = http.createServer(app)
const server = https.createServer(options, app)

// 监听 3002 端口
// server.listen(3002, '0.0.0.0', () => {
//   console.log('Http 3002 Server Open')
// })
server.listen(3002, '0.0.0.0', () => {
  console.log('Https 3002 Server Open')
})

const server2 = https.createServer(options, app)
const io = require('socket.io')(server2)

// 监听连接事件
io.on('connection', socket => {
  console.log('io connection success')
  socket.on('disconnect', err => {
    console.log('io connection break', err)
  })
  socket.on('to-server', data => {
    console.log('client fail:' + data)
    Kitten.create(data).then(() => {
      console.log('bulletChat submit success')
      io.emit('to-client', data)
    }).catch((err) => {
      console.log(err)
    })
  })
})

// 监听 8001 端口
// server.listen(8090, function(){
//   console.log('app run at 127.0.0.1:8090')
// })
server2.listen(8090, '0.0.0.0', () => {
  console.log('Https 8090 Server Open')
})

我不确定是因为线上使用得 Https 导致得还是其他原因,目前没有排查出来
还望大拿可以指点迷津,谢谢!

阅读 2.5k
3 个回答

Nginx增加如下配置:

location /websocket {
    proxy_buffering off;
    #rewrite ^/websocket/(.*)$ /$1 break;
    proxy_pass http://xxx.xx.xxx.xx:3000/websocket;
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #升级http1.1到 websocket协议
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}
  1. 有没有有在应用前面挂负载均衡,不排除是负载均衡配置问题。
  2. 前端无法建立连接,最好贴一下更详细一点的错误提示。

如果是常见的云服务器,除了自己在服务器上开放端口之外,还要配置云厂商的安全策略。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题