node.js - nginx 作为网络服务器,包括。 socket.io 和 node.js/ws ://400 Bad Request

标签 node.js web-services sockets nginx socket.io

我收到了这个错误请求。

Errors from FireBug

德语最后一句的意思是“Firefox 无法连接到位于 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.');

最佳答案

  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 ~ ^/socket改为location ^~/socket

Node 变化:

  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 响应:

Chrome Websocket Response

仅供引用。我用过以下版本:

  • “Node ”:“v0.10.31”
  • “ejs”:“~0.8.5”
  • “ express ”:“~4.8.6”,
  • “socket.io”:“^1.0.6”
  • “nginx”:“1.4.6”

对于 node.js 的快速入门,请转到 node.js-socket.io-express-ngnix-starter

关于node.js - nginx 作为网络服务器,包括。 socket.io 和 node.js/ws ://400 Bad Request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571070/

相关文章:

node.js - 定义文件目录时 **/* 是什么意思?

node.js - 使用 Restify 解析 url 编码的主体

asp.net - SiteMinder背后如何调用WCF Http服务

java - 通过Web服务在android应用程序(java)与windows应用程序(vb.net)之间进行通信

Java套接字等待超过1分钟才能尝试与服务器连接

c# - 如何优化 SSL session ,以便以后(如果需要)重用它来提高客户端服务器性能

javascript - Socketio 配置错误,无法连接/登录连接

javascript - 链接这个 promise

javascript - Parcel 错误 - 找不到模块 @parcel\fs-search\fs-search.win32-x64-msvc.node

java - 从 Web 服务解析日出和日落值