node.js - 为什么 Socket.io 轮询请求不断收到 404 错误?

标签 node.js reactjs socket.io amazon-elastic-beanstalk

从我的 React 应用程序中获取相当多的此类内容: GET http://exampleenvv2-env.eba-yjtafbmz.us-east-1.elasticbeanstalk.com/socket.io/?EIO=3&transport=轮询&t=NLE1Pn5

我的 React 位于端口 8080,Express 位于端口 5000,两者都位于 AWS Beanstalk 上的 Nginx 后面。从 SSH 进入实例,看起来两者都运行良好,并且由于我可以在浏览器中正常访问 React 应用程序,因此看起来它正确路由到该服务器。

我能够在两个浏览器窗口之间本地运行一个基本的聊天应用程序。

我在我的 React page.js 中执行此操作:

import socketIOClient from "socket.io-client";
var io = require('socket.io');
var socket = socketIOClient();

Server.js(用于 Express/Socket.io 监听):

const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const router = express.Router();

var Immutable = require('immutable');
var SortedSet = require("collections/sorted-set");

var Map = Immutable.Map;
var List = Immutable.List;

var hostname = process.env.IP || 'localhost';
var port = 5000;

var games = Map();
var players = Map();
var availableKeys = SortedSet();
var maxKey = 0;

/.../

http.listen(port, hostname, function () {
console.log("Server is listening on http://" + hostname + ":" + port);
});

Nginx 位置配置部分:

location / {
  proxy_http_version  1.1;
  proxy_pass          http://127.0.0.1:8080/;
  proxy_set_header    Host $host;
  proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    Connection $connection_upgrade;
  proxy_set_header    Upgrade $http_upgrade;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /socket.io {
  proxy_pass                http://127.0.0.1:5000/;
  proxy_set_header          Host $host;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header          X-NginX-Proxy true;
  proxy_set_header          X-Real-IP $remote_addr;
  proxy_ssl_session_reuse   off;
  proxy_cache_bypass        $http_upgrade;
}

我尝试使用“/socket.io”的路径选项进行 Node 和 react ,但这似乎没有帮助。

这是error.log的示例:

2020/10/22 01:36:44 [error] 20352#0: *279 connect() failed (111: Connection refused) while connecting
to upstream, client: 172.31.22.103, server: , request: "GET /socket.io/
EIO=3&transport=polling&t=NLDyuCl HTTP/1.1", upstream: "http://127.0.0.1:5000//? 
EIO=3&transport=polling&t=NLDyuCl", host: "exampleenvv2-env.eba-yjtafbmz.us-east- 
1.elasticbeanstalk.com", referrer: "http://exampleenvv2-env.eba-yjtafbmz.us-east- 
1.elasticbeanstalk.com/"

最佳答案

事实证明the top-ranked answer here Nginx 配置就是我所需要的。

我最终编辑了路径,但还添加了一些其他行,但我真的认为该路径很挑剔。 Nginx 擅长从具体到一般,但是否需要完全匹配或最相关取决于用户。

location ~* \.io {
  proxy_pass                http://127.0.0.1:5000;
  proxy_set_header          Host $http_host;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header          X-NginX-Proxy false;
  proxy_set_header          X-Real-IP $remote_addr;
  proxy_ssl_session_reuse   off;
  proxy_set_header          Upgrade $http_upgrade;
  proxy_set_header          Connection "upgrade";
  proxy_redirect            off;
  proxy_http_version        1.1;
}

感谢您的其他答案,这些答案是解决此设置问题的其他好步骤!

关于node.js - 为什么 Socket.io 轮询请求不断收到 404 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64474260/

相关文章:

reactjs - Material-UI 定义列表

node.js - Azure 移动服务和 socket.io

mysql - 如何使用 socket.io 实现长轮询?

node.js - 从 Node 访问远程mongodb

node.js - 如何在 NodeJS 中模拟嵌套依赖关系

javascript - 如何使用 Telegraf API 发送本地存储的照片?

javascript - 如何显示来自数据库的 react 项目列表

javascript - React - 使用 draftjs 的 redux-form initialValues

javascript - Next.js - Eslint 不会在开发模式下检查任何页面(pages/_app.js 除外)

node.js - 为什么我的 socket.io 事件无法在多个浏览器上处理?