2014-08-29 18 views
9

ho questa richiesta di errore.nginx come webserver incl. socket.io e node.js/ws: // 400 Bad Request

Errors from FireBug

L'ultima frase in tedesco significa "Firefox cant connettersi al server che si trova in ws: // .......".

Il server non sarebbe il problema che penso.

Perché questa è la configurazione di nginx, perché penso che ci sia il problema!

server { 
    server_name example.org; 
    listen 80 default_server; 
    root /var/www/web; 

    location/# for symfony2 
    { 
     try_files $uri @rewriteapp; 
    } 

    location @rewriteapp # for symfony2 
    { 
       rewrite ^(.*)$ /app.php/$1 last; 
    } 

    location ~ ^/app\.php(/|$) 
    { 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     fastcgi_param HTTPS off; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 

    location ~ ^/socket 
    { 
     proxy_pass http://127.0.0.1:8080; 
     proxy_redirect off; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $http_host; 
    } 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 
} 

versione nginx: nginx/1.4.7

app.js

var express = require('express'), 
    io = require('socket.io').listen(server), 
    server = require('http').createServer(app), 
    bodyParser = require('body-parser'); 

var app = express(); 
server.listen(8080); 

app.use(bodyParser.json()); 

app.post('/', function(request, response) 
{ 
    response.send('OK'); 
    io.emit('MessageForAll', request.body); 
}); 

io.on('connection', function (socket){}); 

console.log('Server running on port 8080.'); 

risposta

10
  1. Nginx (che è il server!) (Versione nginx: nginx/1.4.6) Change : -

    server { 
         listen 80; 
         server_name 255717070.com; 
         root /var/www/stack/25571070; 
         index index.html index.htm; 
    
         location/{ 
         } 
    
         location ^~ /socket { 
          rewrite ^/socket/(.*) /$1 break; #used to send request to base url 
          proxy_pass http://127.0.0.1:3000; 
          proxy_redirect off; 
          proxy_pass_request_headers on; 
          proxy_set_header X-Real-IP $remote_addr; 
          proxy_set_header Host $http_host; 
          proxy_set_header X-NginX-Proxy true; 
          proxy_set_header X-Forwarded-Host $host; 
          proxy_set_header X-Forwarded-Server $host; 
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
          proxy_http_version 1.1; 
          proxy_set_header Upgrade $http_upgrade; 
          proxy_set_header Connection "upgrade"; 
          proxy_set_header Host $host; 
    
         } 
    
    } 
    

Nota: È necessario modificare location ~ ^/socket a location ^~ /socket

Modifiche Nodo:

  1. app.js:

    app.enable('trust proxy'); 
    app.set('port', process.env.PORT || 3000); 
    var server = app.listen(app.get('port'), function() { 
        debug('Express server listening on port ' + server.address().port); 
    }); 
    
    
    var sockets = require('socket.io')({ 
        'transports': ['websocket', 'flashsocket','htmlfile','xhr-polling','jsonp-polling'] 
    }); 
    
    var io = sockets.listen(server,{ resource: '/socket.io/','sync disconnect on unload':true }); 
    
    io.sockets.on('connection', function (socket) { 
        setInterval(function() {socket.emit('news', { hello: 'hello world' })}, 1000); 
    }); 
    
  2. index.ejs:

    <!DOCTYPE html> 
    <html> 
        <head> 
        <title><%= title %></title> 
        <link rel='stylesheet' href='/socket/stylesheets/style.css' /> 
        </head> 
        <body> 
        <h1><%= title %></h1> 
        <p>Welcome to <%= title %></p> 
        <div id="divID"> 
    
        </div> 
        <script src="http://www.25571070.com/socket/socket.io/socket.io.js"></script> 
         <script> 
          var socket = io.connect('ws://25571070.com'); 
          //var socket = io.connect('http://www.25571070.com'); 
          var i = 0; 
          socket.on('news', function(data) { 
           var div = document.getElementById('divID'); 
           i = i + 1; 
           div.innerHTML = div.innerHTML + '<p>'+ data.hello+'('+i+')'+'</p>'; 
           console.log(data); 
          }); 
         </script> 
        </body> 
    </html> 
    

package.json:

{ 
    "name": "25571070", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "node ./bin/www" 
    }, 
    "dependencies": { 
    "body-parser": "~1.6.6", 
    "cookie-parser": "~1.3.2", 
    "debug": "~1.0.4", 
    "ejs": "~0.8.5", 
    "express": "~4.8.6", 
    "moment": "^2.8.2", 
    "morgan": "^1.2.3", 
    "serve-favicon": "^2.0.1", 
    "socket.io": "^1.0.6", 
    "stylus": "0.42.3" 
    } 
} 

Firefox Risposta:

Firefox websocket response

Chrome Risposta:

Chrome Websocket Response

FYI. Ho usato qui di seguito la versione:

  • "nodo": "v0.10.31"
  • "ejs": "~ 0.8.5"
  • "Express": "~ 4.8.6",
  • "socket.io": "^ 1.0.6"
  • "nginx": "1.4.6"

per Quick Start Con node.js vanno a node.js-socket.io-express-ngnix-starter

+0

xhr polling funziona, penso. Guarda lo screenshot qui sopra. Il problema è che ws: // non funziona. Se il sistema che utilizza il polling xhr potrei usare le richieste ajax al server in background, usando invece un server extra. Ma grazie per la tua risposta. – PatrickB

+0

@PatrickB Ho cambiato la risposta.Prova su Google Chrome versione 37.0.2062.94 (64-bit) e Mozilla Firefox versione 32.0. –

+0

Wtf ... non funziona per me :(Non so perché il server non invia 101 protocolli di commutazione ... – PatrickB

1

Posso vedere il codice del server?

Hai controllato che la porta websocket non sia bloccata da nessun firewall?

Penso che tu abbia già letto this blog post, giusto?

+0

Sì, ho avuto. L'unica porta accessibile dagli host remoti è la porta 80. La porta server 8080 è raggiungibile dal server nginx. Nel tuo post del blog, che ho letto prima, utilizza solo la porta 8020 da internet (raggiungibile per tutti) e la porta 8010 per uso interno. Aggiungo il codice del server per te sopra. Aspetta un minuto ^^ – PatrickB

Problemi correlati