2014-08-29 4 views
9

Ich habe diese Fehleranfragen.nginx als Webserver inkl. socket.io und node.js/ws: // 400 Ungültige Anfrage

Errors from FireBug

Der letzte Satz in Deutsch bedeutet "kippt Firefox mit dem Server verbinden, die in ws befinden: // .......".

Der Server wäre nicht das Problem, denke ich.

Weil das hier ist die Nginx-Konfiguration, weil ich denke, da ist das Problem!

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; 
} 

nginx Version: 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.'); 

Antwort

10
  1. Nginx (das ist der Server!) (Nginx Version: nginx/1.4.6) ändern : -

    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; 
    
         } 
    
    } 
    

Hinweis: Sie müssen location ~ ^/socket zu location ^~ /socket

Knoten Änderungen ändern:

  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 Antwort:

Firefox websocket response

Chrome Antwort:

Chrome Websocket Response

FYI. Ich habe unten Version verwendet:

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

Für Schnellstart Mit node.js zu node.js-socket.io-express-ngnix-starter gehen

+0

xhr Polling funktioniert, denke ich. Schau dir den obigen Screenshot an. Das Problem ist, dass ws: // nicht funktioniert. Wenn das System xhr polling verwendet, könnte ich Ajax-Anfragen an den Hintergrundserver verwenden, anstatt einen zusätzlichen Server zu verwenden. Aber danke für deine Antwort. – PatrickB

+0

@PatrickB Ich habe die Antwort geändert. Getestet auf Google Chrome Version 37.0.2062.94 (64-Bit) und Mozilla Firefox Version 32.0. –

+0

Wtf ... es funktioniert nicht für mich :(Ich weiß nicht, warum der Server nicht 101 Switching-Protokolle sendet ... – PatrickB

1

Kann ich den Servercode sehen?

Haben Sie überprüft, dass der Websocket-Port nicht von einer Firewall blockiert wird?

Ich denke, du hast schon this blog post gelesen, oder?

+0

Ja, ich hatte. Der einzige Port, auf den von entfernten Hosts aus zugegriffen werden kann, ist der Port 80. Der Serverport 8080 ist lokal erreichbar vom nginx-Server. In Ihrem Blogpost, den ich zuvor gelesen habe, verwende nur Port 8020 aus dem Internet (für jeden erreichbar) und den Port 8010 für den internen Gebrauch. Ich füge oben den Servercode für Sie hinzu. Warte eine Minute ^^ – PatrickB

Verwandte Themen