Socket.io ne peut pas se connecter dans nginx + node.js + app php

J’essaie d’exécuter nginx avec l’application PHP et node.js ensemble (cette partie fonctionne correctement). De plus, je voudrais append socket.io à cette configuration, mais malheureusement je ne peux pas établir de connexions entre le client et le serveur (cela ressemble à un délai de connexion?).

server.js

var app = require("http"), redis = require("redis"), io = require('socket.io')(app); io.sockets.on( 'connection', function( client ) { console.log( "New client !" ); io.sockets.emit('msg', { msg: 'Foo bar' } ); }); app.createServer().listen(3000); console.log("Server running at 127.0.0.1:3000"); 

client.js

   <!-- -->  var socket = io.connect('http://localhost:3000'); socket.on('msg', function(msg) { alert('News from server: ' + msg.msg); });  

(J’ai essayé beaucoup de variantes d’url. Avec / sans http, 127.0.0.1:3000, myappp.dev etc.)

Voici ma configuration actuelle de nginx

 server { listen *:80; server_name myapp.dev www.myapp.dev; client_max_body_size 1m; root /var/www/public; index index.html index.htm index.php; access_log /var/log/nginx/nxv_b3ro4tj2wiaf.access.log; error_log /var/log/nginx/nxv_b3ro4tj2wiaf.error.log; location / { root /var/www/public; try_files $uri $uri/ /index.php$is_args$args; autoindex off; index index.html index.htm index.php; } location ~ \.php$ { set $path_info $fastcgi_path_info; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(/.*)$; try_files $uri $uri/ /index.php$is_args$args; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $request_filename; } sendfile off; } 

Mais j’ai aussi essayé quelques autres configurations par exemple:

Node.js + Nginx – Et maintenant?
https://www.digitalocean.com/community/questions/running-both-php-and-node-js-on-nginx-on-the-same-server

Quand je cours

 DEBUG=socket.io:* nodemon --debug test.js 

Je reçois

 [nodemon] 1.9.2 [nodemon] to restart at any time, enter `rs` [nodemon] watching: *.* [nodemon] starting `node --debug test.js` Debugger listening on port 5858 socket.io:server initializing namespace / +0ms Server running at 127.0.0.1:3000 

Aucune erreur, rien.
Toute idée de ce que je fais mal? Fondamentalement, je voudrais faire quelque chose comme ceci https://github.com/jdutheil/nodePHP . Mais je ne peux pas le faire fonctionner. La seule différence est que l’application de github utilise un framework express. Le mien pas.

Je suis sûr que le port 3000 est ouvert sur mon serveur (c’est vagrant en passant)

MODIFIER:

voici ma configuration nginx

 upstream app_zendnode { server 127.0.0.1:3000; keepalive 8; } server { listen *:80; server_name zendnode.dev; client_max_body_size 1m; root /var/www/public; index index index.html index.htm index.php; access_log /var/log/nginx/zendnode.access.log; error_log /var/log/nginx/zendnode.error.log; location / { root /var/www/public; try_files $uri $uri/ index.php; autoindex on; 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://app_zendnode/; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location ~ \.php$ { fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(/.*)$; try_files $uri $uri/ index.php /index.php$is_args$args; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param APP_ENV dev; } sendfile off; } 

Serveur Node.js

 var socket = require( 'socket.io' ); var express = require( 'express' ); var http = require( 'http' ); var app = express(); var server = app.listen(3000); var io = socket.listen( server ) io.sockets.on( 'connection', function( client ) { console.log( "New client !" ); io.sockets.emit('msg', { msg: 'Foo bar' } ); }); 

Node.js client

  var socket = io.connect('127.0.0.1:3000'); socket.on('msg', function(msg) { alert('News from server: ' + msg.msg); }); socket.on('connect', function () { socket.emit('hi!'); }); 

Maintenant, je ne peux même pas faire fonctionner PHP. J’obtiens l’erreur HTTP 404, page blanche avec le texte:

 Cannot GET / 

J’ai fait exactement comme dans cette question Node.js + Nginx – Et maintenant?

EDIT 2

Voici ma configuration actuelle.
Nginx:

 upstream app_zendnode { server 127.0.0.1:3000; keepalive 8; } server { listen *:80; server_name zendnode.dev; client_max_body_size 1m; root /var/www/public; index index index.html index.htm index.php; access_log /var/log/nginx/zendnode.access.log; error_log /var/log/nginx/zendnode.error.log; location / { root /var/www/public; try_files $uri $uri/ index.php; autoindex on; } location /nodejsapi/ { root /var/www/public; try_files $uri $uri/ index.php; autoindex on; 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://app_zendnode/; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location ~ \.php$ { fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(/.*)$; try_files $uri $uri/ index.php /index.php$is_args$args; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param APP_ENV dev; } sendfile off; } 

Node.js (serveur)

 var socket = require( 'socket.io' ); var express = require( 'express' ); var http = require( 'http' ); var app = express(); var server = app.listen(3000); var io = socket.listen( server ) io.use(monitorio({ port: 8000 })); io.sockets.on( 'connection', function( client ) { console.log( "New client !" ); io.sockets.emit('msg', { msg: 'Foo bar' } ); }); 

Client.js

  var socket = io.connect('127.0.0.1:3000', {path: '/nodejsapi/'}); socket.on('msg', function(msg) { alert('News from server: ' + msg.msg); }); socket.on('connect', function () { socket.emit('hi!'); }); 

Nginx n’est pas configuré pour agir en tant que proxy inverse pour nodejs. Les requêtes php et nodejs doivent passer par le même port (politique de même origine) sur nginx. Vous manquez quelque chose comme ça (vérifiez dans votre tutoriel)

 server { listen 80; server_name example.com; location / { proxy_pass http://APP_PRIVATE_IP_ADDRESS: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; } } 

Encore une chose. Pour déboguer des problèmes comme celui-ci, vous devez utiliser telnet et tcpdump.

Sur le serveur, vous écoutez les connexions entrantes

 tcpdump -i eth0 'port 80' 

Sur le client, vous testez et émettez des requêtes avec

 telnet mysrv.com 80