本文介绍了Nginx作为网络服务器socket.io和node.js/ws://400错误的请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到了此错误请求.

德语的最后一句意思是"Firefox无法连接到位于ws://.......的服务器".

The last sentence in german means "Firefox cant connect to the server which is located in ws://.......".

服务器不会是我认为的问题.

The server wouldnt be the problem i think.

因为这是nginx配置,因为我认为存在问题!

Because that here is the nginx configuration, because i think there is the 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版本:nginx/1.4.7

nginx version: nginx/1.4.7

app.js(即服务器!)

app.js (thats the server!)

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)更改:-

  1. Nginx(nginx version: 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;

        }

}

注意:您需要将location ~ ^/socket更改为location ^~ /socket

节点更改:

  1. app.js:

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

  • index.ejs:

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

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

    Firefox Response:

    Chrome响应:

    仅供参考.我使用了以下版本:

    FYI. I have used below version:

    • 节点":"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

    For Quick Start With node.js go to node.js-socket.io-express-ngnix-starter

    这篇关于Nginx作为网络服务器socket.io和node.js/ws://400错误的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

    08-05 13:02