我一直试图在我的家用Ubuntu服务器上部署我的聊天应用程序。当我使用内部IP或本地服务器主机名连接到本地计算机时,它将在本地运行。
我正在使用Nginx反向代理从http://localhost:3000切换到我的外部域,以便可以通过Internet外部访问它: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();
更新:-注意:我刚刚从工作计算机连接到它,并且它正常工作吗?!但是在尝试使用外部地址时,它在我自己的网络中不起作用吗?这是怎么回事?
答案 0 :(得分: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的帮助!
答案 1 :(得分:0)
我能够使用我的配置使其工作。 您需要考虑重定向和代理
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";
}
}