websocket 在NodeJs Express中让SocketIO在HTTPS上工作

cgvd09ve  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(134)

大家好
在将我的两个NoddJs应用程序推送到我的Ubuntu服务器(使用https在nginx中提供网站)后,我遇到了一个问题。在我的本地环境中使用localhost,成功建立了连接,但是在推送到服务器后,我在客户端JavaScript控制台内的第二个应用程序(管理员)admin.domainname.com中得到了以下响应:
第一个月
下面是我在domainname.com上运行的第一个应用程序中建立套接字并发送消息的部分:

/*rest of app.js file with express.js*/ 

const PORT = 3000;

const server = app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`)
})

const socket = socketIo(server);

socket.on('connection', (socket) => {
    console.log("connected")
    socket.emit("testmessage", "Hello World")
    socket.on('disconnect', () => {});
});

字符串
在我的客户端JavaScript中的第二个应用程序(admin.domainname.com)中,我希望接收这样的消息:

const socketdomainconstruct = () => {
    if (location.port) {
      return "http://localhost:3000"
    } else {
      return "https://domainname.com"
    }
  }
  
const socket = io(socketdomainconstruct(), { transports: ['websocket', 'polling', 'flashsocket'] 

socket.on("connect", () => {
  console.log("connected");
  socket.on("testmessage", (message) => {
    console.log(message);
  });
});


为了解释,当我在上面的socket.io示例中使用http://localhost:3000时,我可以成功连接,一切都按照预期工作,所以整体结构没有问题。只有当我切换到https时,我才得到错误,我似乎不明白,因为没有什么变化。
潜在问题可能包括:

  • 我初始化Socket服务器的方式(也许它不能通过https访问,但这会很奇怪,因为nodejs应用程序在nginx中运行,具有有效的SSL证书,也许我还需要包括Socket.io服务器的配置??)
  • 与CORS的东西=>,但我没有得到任何错误,我所有的标题设置(两个应用程序基本上有相同的)=>见下文:
app.use((req, res, next) => {

  res.removeHeader('Server');
  res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');
  res.setHeader('Pragma', 'no-cache');
  res.setHeader('Expires', '0');
  res.setHeader('Last-Modified', new Date().toUTCString());
  res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.socket.io code.jquery.com cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' bing.com; connect-src 'self' *");
  res.setHeader('Permission-Policy', 'accelerometer=(), camera=(), microphone=(), geolocation=(), gyroscope=()');
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('X-Content-Type-Options', 'nosniff');
  res.setHeader('X-Frame-Options', 'deny');
  res.setHeader('X-XSS-Protection', '1; mode=block');
  res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
  res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
  next();
  
});


我希望有人能帮助我澄清/隔离的问题,甚至解决它与我,作为参考,我也将包括从Socket.io有用的链接

  • https://socket.io/docs/v4/server-initialization/#with-an-https-server
  • https://socket.io/docs/v4/server-initialization/#with-express

提前感谢您提供的任何帮助和提示,这对我来说真的很有帮助!

  • 拉菲尔酒店 *
nfzehxib

nfzehxib1#

问题已修复,方法是首先将正确的cors选项添加到SocketIO服务器对象:

socketIo(server, {cors: {origin: ["https://admin.domainname.com", "http://localhost:3000"]}}); // more than one origin can be incuded with array style writing...

字符串
查看更多关于SocketIO的文档:

  • https://socket.io/docs/v4/handling-cors/#configuration

另外,我必须正确设置Nginx代理,像这样:

location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        proxy_pass http://admin-container:4000; #localhost in case of not running the app inside a Docker container

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; #important part for Websocket connection to work
        proxy_set_header Connection 'upgrade'; #important part for Websocket connection to work
        proxy_cache_bypass $http_upgrade;
   }


这也可以在SocketIO文档中看到,它不仅适用于Nginx,也适用于Apache和Caddy 2!

  • https://socket.io/docs/v4/reverse-proxy/#nginx

总的来说,这个问题可以通过正确阅读文档来预防,它们非常好,感谢大家的帮助,祝你有美好的一天,希望解决问题可以帮助其他有类似问题的人
我的设置是

  • Node V.18 lts在Docker容器中运行的应用程序
  • Nginx lts
  • Ubuntu
    干杯拉斐尔

相关问题