我试图将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; }