【问题标题】:Running socket.io behind nginx at a sublocation在子位置的 nginx 后面运行 socket.io
【发布时间】:2016-11-12 02:31:02
【问题描述】:

我正在尝试在我家的树莓上运行 express-socket.io-angular.js 应用程序。

Express 和 socket.io 在端口 3001 上运行。通过 http://[IP]:3001 访问应用程序可以正常工作。我想通过http://[IP]/ttt 访问该应用程序。

我是这样配置 nginx 的:

location /ttt/ {
    proxy_pass http://localhost:3001/;
}

在服务器上我运行这些代码行:

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

...

app.use(express.static(__dirname + '/public'));
app.use('/node_modules', express.static(__dirname + '/node_modules'));

...

var io = require('socket.io')(http, {path: '/ttt/socket.io'});

...

http.listen(3001, function () {
    console.log('Listening on port 3001');
});

在客户端,我像这样包含 socket.io:

<script src="socket.io/socket.io.js"></script>

并像这样连接:

socket: Socket = io.connect({path: "/ttt/socket.io"});

问题:

我获得了所有资源(html、css、js 包括 socket.io.js),但在浏览器日志中我收到错误消息,它无法获得http://[IP]/socket.io/?EIO=3&transport=polling&t=LNGvDUd,其中 t 经常更改。

它报告状态404,很明显,因为nginx在/socket.io没有响应。

提前致谢!


与 jfriend00 的组合结果:

工作设置如下所示:

nginx(找到更多关于正确配置的细节here):

location /ttt/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://localhost:3001/;
    }

快递:

var io = require('socket.io')(http);

客户端(打字稿):

socket: Socket = io({path: "/ttt/socket.io"});

【问题讨论】:

    标签: javascript node.js sockets nginx socket.io


    【解决方案1】:

    如果我正确理解您的代理配置,它将在转发到端口 3001 之前从路径中剥离 /ttt。因此,您的 socket.io 初始化在服务器上不正确。

    改变这个:

    var io = require('socket.io')(http, {path: '/ttt/socket.io'});
    

    到这里:

    var io = require('socket.io')(http);
    

    编辑:

    并且,确保加载到浏览器中的客户端文件实际上是最新编辑的客户端文件。您可以在浏览器中使用 View/Source 查看它,以查看您正在运行的确切文件。

    【讨论】:

    • 感谢您的快速回复!是的,您正确理解了我的代理设置。我试过了,但浏览器仍然试图在错误的 URL 处获取 /socket.io/...
    • 我不知道您的客户端代码中的这种语法是什么意思:socket: Socket = io.connect({path: "/ttt/socket.io"});。它适用于我在客户端:socket = io({path: "/ttt/socket.io"});&lt;script src="/ttt/socket.io/socket.io.js"&gt;&lt;/script&gt;
    • 抱歉,我仍然在 http://[IP]/socket.io/?EIO=3&transport=polling&t=LNGvDUd 上收到 404-Error 你是什么意思?跨度>
    • @Stefan - 与您在客户端中显示的不一样,因为path 选项到io()io.connect() 将更改客户端请求的URL。我自己试过了。有用。您正在运行什么版本的 socket.io?您确定您在其他地方没有 socket.io 连接,或者您实际上正在编辑正确的客户端源文件并且旧的已缓存吗?l 您可以在浏览器中执行 View/Source 以准确查看哪个页面它正在运行。
    • 我发现了错误,我的 IDE 被配置为在保存时自动上传文件。在我编译完我的 ts 文件后,它没有更新服务器上的 js 文件....非常感谢您的帮助并告诉我检查从服务器获得的文件:)
    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 2019-02-28
    • 2020-09-21
    • 2020-05-28
    • 2013-05-14
    • 2015-11-20
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多