使用SSL的SocketIO over Nginx

时间:2017-09-04 19:59:53

标签: ssl nginx socket.io

我正在尝试使用ssl通过nginx设置socketio。问题是我可以让客户端连接但是我没有看到我希望通过套接字传递的其他事件。 (注意:这在本地工作,而不是在我的生产服务器上)

客户端代码在这里:

import openSocket from "socket.io-client";
const socket = openSocket(`${SOCKET}`);

function subscribeToTimer(callBack) {
  socket.on("timer", timestamp => callBack(null, timestamp));
  socket.emit("subscribeToTimer", 1000);
}

export class App extends Component {
  constructor(props) {
    super(props);
    this.store = this.configureStore();
    subscribeToTimer((err, action) => this.store.dispatch(action));
  }

和服务器:

const port = 8000
const io = require('socket.io')()

io.on("connection", (client) => {
  console.log("a user connected")
  client.on("subscribeToTimer", (interval) => {
    console.log("a user is subscribing to timer with interval: ", interval)
    setInterval(() => {
      timestamp = new Date()
      client.emit('timer', { type: 'SET_TIME', payload: timestamp });
    }, interval);
  });
})

io.listen(port)
console.log('listening on port ', port)

由nginx /etc/nginx/sites-enabled/default管理:

server {
  <snip>
  location /socket.io {
    proxy_pass http://localhost:8000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

当我启动服务器时,我得到:

listening on port 8000
a user connected

因此,客户端正在连接到服务器,但我没有看到subscribeToTImer事件。

有什么见解吗?

2 个答案:

答案 0 :(得分:2)

问题可能是由于两个原因。一个使用Host头,一个使用localhost而不是127.0.0.1

server {
  <snip>
  location /socket.io {
    proxy_pass http://127.0.0.1:8000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_cache_bypass $http_upgrade;
  }
}

我不是100%确定根本原因,但我已经看到删除Host并使用127.0.0.1代替localhost已经帮助解决了socket.io的其他问题

答案 1 :(得分:1)

问题原来是在配置的Hash: 1fc9353f1fe6dd935744 Version: webpack 3.5.5 Time: 77ms Asset Size Chunks Chunk Names skinny-bundle.js 6.05 kB 0 [emitted] main [1] ./HelloGreeting.js 2.71 kB {0} [built] + 2 hidden modules 行。您需要创建一个包含已命名服务器组的proxy_pass部分,然后在upstream中引用该部分(而不是proxy_pass我的方式)。

工作配置http://localhost...

/etc/nginx/sites-enabled/default