从 Nginx 到 express.js 上的 socket.io 的反向代理上的“无法获取”

     2023-03-07     50

关键词:

【中文标题】从 Nginx 到 express.js 上的 socket.io 的反向代理上的“无法获取”【英文标题】:"Cannot GET" on reverse proxy from Nginx to socket.io on express.js 【发布时间】:2015-10-06 01:20:50 【问题描述】:

我已经关注this tutorial,让 Node.js 通过私有网络在两台 Ubuntu 14.04 服务器上通过 Nginx 工作(Node.js 在 myappserver 上 - 可通过私有 IP myprivatewebserver 访问并通过 mypublicappserver 公开访问 - 以及 mywebserver 上的 Nginx) .到目前为止一切正常 - 我可以通过 Nginx 访问 myprivateappserver:3000 上的 node.js 应用程序,方法是转到 http://mywebserver/node。

但是,当我尝试在 express.js 上的 socket.io 中运行 chat application 时,当我直接访问它时它可以工作 (http://mypublicappserver:3000) 但是,当我尝试通过我的 Nginx 代理访问它时 (@ 987654325@),我在浏览器和萤火虫控制台中得到“Cannot GET /node” “网络错误:404 未找到 - http://mywebserver/node”。

如果我从 mywebserver curl http://myprivateappserver:3000,我可以从我的 socket.io 应用程序中获取 index.html。

我的 /etc/nginx/sites-available/default 包含:

location /node
proxy_pass http://myprivateappserver:3000;
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;

我的 index.js 是:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res)
  res.sendFile(__dirname + '/index.html');
);

io.on('connection', function(socket)
  console.log('a user connected');
  socket.on('disconnect', function()
    console.log('user disconnected');
  );
  socket.on('chat message', function(msg)
    io.emit('chat message', msg);
  );
);

http.listen(3000, function()
  console.log('listening on *:3000');
);

而我的 index.html 是:

<!doctype html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      *  margin: 0; padding: 0; box-sizing: border-box; 
      body  font: 13px Helvetica, Arial; 
      form  background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; 
      form input  border: 0; padding: 10px; width: 90%; margin-right: .5%; 
      form button  width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; 
      #messages  list-style-type: none; margin: 0; padding: 0; 
      #messages li  padding: 5px 10px; 
      #messages li:nth-child(odd)  background: #eee; 
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      var socket = io();
      $('form').submit(function()
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
      );
      socket.on('chat message', function(msg)
        $('#messages').append($('<li>').text(msg));
      );
    </script>
  </body>
</html>

这是我第一次涉足 nginx/node/express/socket(我通常是 Apache/CakePHP 人员),所以我很可能遗漏了一些非常简单的东西,但也非常感谢任何关于如何调试的指针出错了

【问题讨论】:

【参考方案1】:

我认为这样会更好:

location /node
proxy_pass http://myprivateappserver:3000/; # add "/"
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;

proxy_pass加'/',然后app.get('/')也ok!

【讨论】:

【参考方案2】:

location ~ /(node|socket.io)  
.......


这也适用于没有“^”和“\”符号的情况。

【讨论】:

【参考方案3】:

好奇的好回答。我想补充一点,如果您使用 sub_filter,则不必调整 node.js 应用程序。你的 nginx 一定是用那个模块编译的。

location ~ ^/(node|socket\.io) 
    #your proxy directives
    sub_filter /node /;

【讨论】:

【参考方案4】:

这是因为 SocketIO 默认使用/socket.io 路径,所以你需要配置 Nginx 使其不仅代理/node 请求,还代理/socket.io

location ~ ^/(node|socket\.io) 
    #your proxy directives

(顺便说一句,你好像有错别字:你写了proxypass,但正确的形式是proxy_pass。其他proxy指令也是如此)

您还需要在 NodeJS 服务器文件中再执行一次编辑。替换:

app.get('/', function(req, res)

与:

app.get('/node', function(req, res)

现在应该可以了。

这不是唯一的解决方案。您也可以通过对 Nginx 配置进行一些更改来更改 SocketIO path,但上面描述的解决方案对我来说似乎是最简单的。祝你好运!

【讨论】:

非常感谢@Curious。这将花费我很长时间来为自己解决 - 我不明白代理地址与它所代理的应用程序是如何相互关联的。当我粘贴它们时,我重新插入了从 proxy_pass 等指令中删除的下划线,以免混淆到达此页面的其他人。再次感谢。 @theotherdy 不客气)代理时如何转换 URL 有多种选择,您可以阅读更多 here。下划线怎么样 - 你做了一件好事,但你错过了$httpupgrade 变量中的下划线。祝你好运:) 我想我需要做一些 Nginx 手册阅读。很好地发现了那个缺失的下划线 - 现在也添加了那个。再次感谢 万一其他人关注这个线程,我早上大部分时间都在意识到,当我的 CakePHP 应用程序由 mywebserver 提供服务时,我尝试设置一个连接: var socket = io('mywebserver/node');这被正确代理并连接到mypublicappserver:3000 但是,虽然连接在那里,但 Socket.io 认为我是说我希望通信在“节点”命名空间中,所以发出不起作用!但是更改为: var nsp=io.of('/node') 然后 nsp.on('connection', function(socket)etc. 它可以工作! 请帮助我。我不想让请求传递给我的应用程序。 ***.com/questions/39574238/…

在 Node.js/Express.js 中,如何将 JSON 对象从服务器传输到客户端?

】在Node.js/Express.js中,如何将JSON对象从服务器传输到客户端?【英文标题】:InNode.js/Express.js,howcanItransferaJSONobjectfromservertoclient?【发布时间】:2018-12-2518:47:18【问题描述】:在我的服务器中,我从数据库中检索一个对象并将其... 查看详情

如何将远程(用户)IP 从 nginx 传递到托管在 google 容器引擎上的 Rails?

...如何将远程(用户)IP从nginx传递到托管在google容器引擎上的Rails?【英文标题】:HowdoIpasstheremote(users)IPfromnginxtoRailshostedongooglecontainerengine?【发布时间】:2016-11-2216:07:49【问题描述】:我在nginx上运行乘客并有一个rails应用程序服... 查看详情

将 $ssl_client_s_dn 从 nginx/uwsgi 传递到烧瓶应用程序

】将$ssl_client_s_dn从nginx/uwsgi传递到烧瓶应用程序【英文标题】:Pass$ssl_client_s_dnfromnginx/uwsgitoflaskapp【发布时间】:2019-04-0522:07:40【问题描述】:我正在运行一个带有uWSGI和nginx的PythonWeb服务器,其基本映像为tiangolo/uwsgi-nginx-flask。... 查看详情

从 node.js/express.js 中的多个异步源构建对象

】从node.js/express.js中的多个异步源构建对象【英文标题】:Buildinganobjectfrommultipleasynchronoussourcesinnode.js/express.js【发布时间】:2014-10-1005:30:37【问题描述】:我很难在网上找到解决问题的方法,希望这里的人能帮助我。我有一个... 查看详情

Express.js 重定向到 HTTPS 并发送 index.html

】Express.js重定向到HTTPS并发送index.html【英文标题】:Express.jsredirecttoHTTPSandsendindex.html【发布时间】:2016-01-0207:34:01【问题描述】:我有一个简单的Express.js实例,它为单页Angular应用程序提供静态资源。我在Express配置中设置了一... 查看详情

Express.js 中删除 req.body 时的空对象

】Express.js中删除req.body时的空对象【英文标题】:Emptyobjectondeletereq.bodyinExpress.js【发布时间】:2019-01-1814:05:56【问题描述】:我正在尝试删除服务器端(Express.js)上的某些内容。因此,我需要从前端(ReactwithRedux)发送要在后端使... 查看详情

服务器未将 JSON 从 Express 返回到 React(代理)

】服务器未将JSON从Express返回到React(代理)【英文标题】:ServernotreturningJSONfromExpresstoReact(proxy)【发布时间】:2017-11-2806:03:05【问题描述】:我正在尝试制作一个具有React前端(在端口8080上运行)和Express-Node.js后端(在端口3000... 查看详情

从 POST 访问中隐藏 Node.js&Express 中的错误消息

】从POST访问中隐藏Node.js&Express中的错误消息【英文标题】:HidingerrormessageinNode.js&ExpressfromPOSTaccess【发布时间】:2017-12-1722:04:14【问题描述】:我正在使用Express.js运行基于Node.js的RestfulAPI服务器。今天,我意识到有人可以... 查看详情

express.js 4 JSON 解析来自 GET 请求的问题(从数据表请求数据)

】express.js4JSON解析来自GET请求的问题(从数据表请求数据)【英文标题】:express.js4JSONparsingproblemsfromGETrequest(requestdatafromdatatables)【发布时间】:2015-02-0321:28:52【问题描述】:我在解析发送到我的express.js4服务器的序列化JSONAjaxGet... 查看详情

express.js 网站图标未显示

】express.js网站图标未显示【英文标题】:express.jsfaviconsnotshowingup【发布时间】:2014-08-1223:20:43【问题描述】:我目前正在运行一个简单的express.js示例,只是想让网站图标正常工作。在本地一切正常,但是当我将它上传到我的生... 查看详情

使用 express js、passport s 保护 GraphQL 查询

】使用expressjs、passports保护GraphQL查询【英文标题】:SecureGraphQLquerieswithexpressjs,passports【发布时间】:2017-08-1016:35:21【问题描述】:我已经开始在我的expressjs项目中使用graphql,但我想知道如何保护我的一些GraphQL查询。以前我为... 查看详情

Express.JS 服务器连接到远程网络上的主机

】Express.JS服务器连接到远程网络上的主机【英文标题】:Express.JSservertoconnecttohostonremotenetwork【发布时间】:2022-01-0210:49:12【问题描述】:所以我让这个小型快递服务器运行起来。我可以将它连接到本地网络上的其他设备,例如... 查看详情

使用“Access-Control-Allow-Origin”发布到 express.js

】使用“Access-Control-Allow-Origin”发布到express.js【英文标题】:POSTtoexpress.jswith\'Access-Control-Allow-Origin\'【发布时间】:2014-06-0408:25:11【问题描述】:我是Node和Express的新手。我可以从我的服务器应用程序获取数据,但在POST上失败... 查看详情

没有 Express.js 的 node.js 上的 Access-Control-Allow-Origin

】没有Express.js的node.js上的Access-Control-Allow-Origin【英文标题】:Access-Control-Allow-Originonnode.jsWITHOUTExpress.js【发布时间】:2014-09-2616:48:02【问题描述】:解决错误\'NoAccess-Control-Allow-Origin\'所以我尝试为Node.js搜索Access-Control-Allow-Origi 查看详情

无法在 node.js 上设置代理

...015-10-0515:38:46【问题描述】:我在端口5550上有node.js4.1.1和express.js4.8.5。我还在端口8080上有Geoserver2.8.0。两台服务器都在同一台笔记本电脑上。节点上的应用想要从Geoserver访问一些地图数据,这些是openlayers上的详细信息source:newol.s 查看详情

将 Web 套接字请求从 Nginx 传递到 uWSGI 服务器

】将Web套接字请求从Nginx传递到uWSGI服务器【英文标题】:PassingwebsocketrequestsfromNginxtouWSGIserver【发布时间】:2018-11-2616:19:24【问题描述】:我有Nginx在服务器a(端口8000)上运行,uWSGI在服务器b(端口8001)上运行。b已经在ws://b:800... 查看详情

从文件 express js 提供 json

】从文件expressjs提供json【英文标题】:Servingjsonfromafileexpressjs【发布时间】:2018-05-1209:16:02【问题描述】:新手要表达,我有一个包含db.json文件的文件夹,它每11秒被一个新的db.json替换。让express.js服务它以便在api调用上显示新... 查看详情

从 Jade 模板访问 Express.js 请求或会话

】从Jade模板访问Express.js请求或会话【英文标题】:AccessingExpress.jsreqorsessionfromJadetemplate【发布时间】:2011-09-1323:27:45【问题描述】:我想知道是否有一种简单的方法可以从Jade模板中访问Express.js的req或session变量,而无需通过正... 查看详情