DigitalOcean上的NodeJS服务器使用socket.io返回连接被拒绝

我试图将socket.io引入到在Laravel和AngularJS中开发的应用程序中。
应用程序在我的电脑工作正常,但是当我尝试使其在服务器上工作时,我得到错误“ GET http:// localhost:8080 / socket.io /?EIO = 3&transport = polling&t = LQxpNjO net :: ERR_CONNECTION_REFUSED ' 。

服务器运行Ubuntu 16.04,我使用nginx作为Web服务器。

这是创buildnodejs服务器的文件:

var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var Redis = require('ioredis'); var redis = new Redis(); var port = 8080; http.listen(port, function() { console.log('Listening on *:' + port); }); io.on('connection', function (socket) { console.info('Client connected'); redis.subscribe('counter.increase'); redis.on('message', function (channel, message) { console.log('Received message ' + message + ' in channel ' + channel); socket.emit(channel, message); }); socket.on('disconnect', function() { console.info('Client disconnected'); }); }); 

这是应该连接到nodejs服务器的AngularJS工厂。 这里我使用的是angular-socket-io:

 angular.module('myServices').factory('socket', function (socketFactory) { var ioSocket = io.connect('http://localhost:8080'); socket = socketFactory({ ioSocket: ioSocket }); return socket; }); 

这是nginx的configuration文件(/ etc / nginx / sites-available / default):

 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/public; index index.php index.html index.htm index.nginx-debian.html; server_name XXX.XXX.XXX.XXX; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location ~ /\.ht { deny all; } } 

我怎么能解决这个问题?

更新1

我更新了像这样的nginxconfiguration文件:

 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/public; index index.php index.html index.htm index.nginx-debian.html; server_name XXX.XXX.XXX.XXX; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location ~* \.io { proxy_pass http://localhost:8080; 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; } location ~ /\.ht { deny all; } } upstream app_yourdomain { server 127.0.0.1:3000; keepalive 8; } 

和AngularJS工厂是这样的:

 angular.module('myServices').factory('socket', function (socketFactory) { var ioSocket = io.connect('http://localhost:8080/socket.io'); socket = socketFactory({ ioSocket: ioSocket }); return socket; }); 

现在我得到以下错误:
– 获取http://example.com/bower_components/socket.io-client/socket.io.js

更新2

这些是我的nginxconfiguration文件:

 upstream app_example.com { server 127.0.0.1:3000; keepalive 8; } server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/public; index index.php index.html index.htm index.nginx-debian.html; server_name XXX.XXX.XXX.XXX; location / { # First attempt to serve request as file, then as # directory, then fall back to displaying a 404. try_files $uri $uri/ /index.php; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location ~ ^/(socket\.io) { proxy_pass http://localhost:8080; 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; } location ~ /\.ht { deny all; } } 

和AngularJS工厂:

 angular.module('myServices').factory('socket', function (socketFactory) { var ioSocket = io.connect('http://localhost'); socket = socketFactory({ ioSocket: ioSocket }); return socket; }); 

工作解决scheme

感谢约翰,我最终设法使应用程序工作。

这是nginxconfiguration文件:

 upstream app_example.com { server 127.0.0.1:3000; keepalive 8; } server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/public; index index.php index.html index.htm index.nginx-debian.html; server_name XXX.XXX.XXX.XXX; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location ~ ^/(socket\.io) { 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; } location ~ /\.ht { deny all; } } 

这是AngularJS工厂:

 angular.module('myServices').factory('socket', function (socketFactory) { var ioSocket = io.connect('http://example.com'); socket = socketFactory({ ioSocket: ioSocket }); return socket; }); 

这是nodejs服务器:

 var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var Redis = require('ioredis'); var redis = new Redis(); var port = 3000; http.listen(port, function() { console.log('Listening on *:' + port); }); io.on('connection', function (socket) { console.info('Client connected'); redis.subscribe('counter.increase'); redis.on('message', function (channel, message) { console.log('Received message ' + message + ' in channel ' + channel); socket.emit(channel, message); }); socket.on('disconnect', function() { console.info('Client disconnected'); }); }); 

Socket.io在您的域名后面使用/socket.io。 那么你必须指定socket.io位置:

 location ~* \.io { proxy_pass http://localhost:8080; 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; } 

不要忘记你的节点js应用程序的上游

 upstream app_yourdomain { server 127.0.0.1:3000; keepalive 8; }