【问题标题】:Nodejs/Socket.io on Ubuntu Server with Nginx Reverse Proxy - "failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT"带有 Nginx 反向代理的 Ubuntu 服务器上的 Nodejs/Socket.io -“失败:连接建立错误:net::ERR_CONNECTION_TIMED_OUT”
【发布时间】:2019-11-12 14:50:36
【问题描述】:

我一直在尝试在我的家庭 Ubuntu 服务器上部署我的聊天应用程序。当我使用内部 ip 或本地服务器主机名连接到它时,它在本地工作。

我正在使用 nginx 反向代理从 http://localhost:3000 切换到我的外部域,以便我可以通过互联网从外部访问它:http://tfmserver.dynu.net/

Nginx 代理:

server {
    listen 80;
    listen [::]:80;

    root /var/www/tfmserver.dynu.net/html;
    index index.html index.htm index.nginx-debian.html;

    server_name tfmserver.dynu.net;

    location / {
    proxy_pass http://localhost: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;
}

我似乎收到类似于以下的错误,但有时会有所不同,具体取决于我尝试修复它的方法:

WebSocket connection to 'ws://tfmserver.dynu.net/socket.io/?EIO=3&transport=websocket&sid=wQY_D0JOZm4VWGXgAAAA' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

POST http://tfmserver.dynu.net/socket.io/?EIO=3&transport=polling&t=MklujE_&sid=fbdZir8lxOlMOZm6AAAA net::ERR_CONNECTION_TIMED_OUT

根据人们发布的一些关于此错误的帖子,他们说 Chrome 正在尝试将其作为 SSL,但并未以这种方式提供服务,但是我已将 SSL 添加到服务器并添加到项目中,但它不能解决问题。目前我已将其删除,但如果可能的话,我不介意在它工作后将其重新添加。

我已经尝试了这里发布的所有其他可能的问题,但没有一个可以解决问题。

我怎样才能让它在外部工作?我做错了什么?

这里是套接字项目的相关部分。如果您需要任何其他可以提供帮助的信息,请告诉我 - 提前致谢!

服务器:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);

server.listen(process.env.PORT || 3000, 'localhost');

客户:

var socket = io.connect();

更新:-注意:我刚刚从我的工作计算机连接到它,它可以工作吗?!但是尝试使用外部地址时它在我自己的网络中不起作用?这是怎么回事?

【问题讨论】:

  • 也许您的外部地址的 DNS 记录尚未传播到您的家庭网络?我可以很好地点击外部地址?????????
  • 我添加 DNS 已经一个星期了,它已经传播了。它将外部加载到另一个网络上,但在同一网络上时我无法使用外部域。在我的工作电脑上工作。但是通过下面的修复,问题不再存在,但现在导致了一个差异问题,使其不再工作......

标签: node.js ubuntu nginx socket.io reverse-proxy


【解决方案1】:

更新:所以我终于解决了(大部分)!

大多数情况下,我的意思是当我在家中与我的服务器位于同一网络上时,我仍然无法使用我的域来访问它。要查看它,我必须使用服务器的内部 IP 或服务器的网络主机名。该域在网络之外工作,例如工作或其他地方。 (我可以忍受!)

问题出在 Nginx 代理上,为我解决问题的最终配置如下:

server {
        listen 80;
        server_name tfmserver.dynu.net;
        client_max_body_size 800M;

        root /home/tfm/Projects/Chat;

        gzip on;
        gzip_comp_level 6;
        gzip_vary on;
        gzip_min_length  1000;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_buffers 16 8k;

        location **/socket.io/** {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_pass http://localhost:9000**/socket.io/**;
                proxy_redirect off;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

要修复新错误,即 502 错误网关,我必须将“/socket.io/”添加到位置和主机名中。 Jairo Malanay 推荐了其他添加,我添加了它们,这解决了我遇到的初始连接拒绝问题。

我遇到了 CSS 没有加载的问题,在添加 /socket.io/ 时,这个问题也得到了解决。

我的最终服务器端:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);

server.listen(process.env.PORT || 9000, 'localhost');

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

io.sockets.on('connection', function (socket) {

还有我的最终客户端:

var socket = io.connect();

再次感谢 Jairo Malanay 的帮助!

【讨论】:

    【解决方案2】:

    我能够使用我的配置使其工作。 你需要考虑重定向和代理

    server {
        listen 80;
        server_name 11.111.111.111;
        client_max_body_size 800M;
    
        gzip on;
        gzip_comp_level 6;
        gzip_vary on;
        gzip_min_length  1000;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_buffers 16 8k;
    
       location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
    
            proxy_pass http://localhost:9000/;
            proxy_redirect off;
    
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
    
      location ~* \.io {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
    
            proxy_pass http://localhost:4001;
            proxy_redirect off;
    
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
    

    【讨论】:

    • 感谢您的评论,我复制/粘贴了您的配置,将服务器名称重命名为我的域,并更改了我的项目端口以匹配您列出的内容。也打开了端口。现在它给了我一个不同的错误:polling-xhr.js:261 GET tfmserver.dynu.net/socket.io/…502 (Bad Gateway) 在另一个网络上本地和外部。但我认为另一个错误是固定的! :D 我能做些什么来处理这个新错误?在我看来,它无法找到正确的主机名来连接?感谢您的帮助
    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 2017-08-16
    • 2017-01-22
    • 1970-01-01
    • 2020-06-29
    • 2017-11-30
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多