关键词:
【中文标题】从 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变量,而无需通过正... 查看详情