2014-08-29 86 views
9

我有這個錯誤請求。nginx as webserver incl。 socket.io和node.js/ws:// 400錯誤請求

Errors from FireBug

在德國手段的最後一句「火狐無法連接到位於WS服務器:// ......」。

服務器不會是我想的問題。

因爲這裏是nginx配置,因爲我覺得有問題!

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的版本: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.'); 

回答

10
  1. Nginx的(那服務器!)(nginx的版本:nginx的/ 1.4.6)改變: -

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

注:您需要更改location ~ ^/socketlocation ^~ /socket

節點的變化:

  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 websocket response

鉻響應:

Chrome Websocket Response

僅供參考。我用下面的版本:

  • 「節點」: 「v0.10.31」
  • 「EJS」: 「〜0.8.5」
  • 「明示」: 「〜4.8.6」,
  • 「socket.io」: 「^ 1.0.6」
  • 「nginx的」: 「1.4.6」

對於快速入門使用的是Node.js去node.js-socket.io-express-ngnix-starter

+0

xhr民意測驗工程,我認爲。看看上面的截圖。問題是,ws://不起作用。如果使用xhr輪詢的系統可以使用ajax請求到後臺服務器,而不是使用額外的服務器。但謝謝你的回答。 – PatrickB 2014-09-02 07:45:34

+0

@PatrickB我已更改答案。已在谷歌瀏覽器版本37.0.2062.94(64位)和Mozilla Firefox版本32.0上進行了測試。 – 2014-09-03 10:06:36

+0

Wtf ...它不適用於我:(我不知道爲什麼服務器不發送101切換協議... – PatrickB 2014-09-08 10:10:33

1

我可以看到服務器代碼嗎?

您是否仔細檢查了websocket端口未被任何防火牆阻止?

我想你已經讀過this blog post吧?

+0

是的,我有。唯一可從遠程主機訪問的端口是端口80.服務器端口8080可從nginx服務器本地訪問。在您之前撰寫的博文中,僅使用了來自互聯網的端口8020(每個人都可訪問)和端口8010以供內部使用。我爲你添加上面的服務器代碼。等一下^^ – PatrickB 2014-09-03 06:46:22