nginx 作为网络服务器,包括.socket.io 和 node.js/ws://400 错误请求 [英] nginx as webserver incl. socket.io and node.js / ws:// 400 Bad Request

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

问题描述

我收到了这个错误请求.

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

我认为服务器不是问题.

因为这里是nginx配置,因为我觉得有问题!

服务器{server_name example.org;听 80 default_server;根/var/www/web;位置/# 用于 symfony2{try_files $uri @rewriteapp;}位置 @rewriteapp # 用于 symfony2{最后重写^(.*)$/app.php/$1;}位置 ~ ^/app.php(/|$){fastcgi_pass unix:/var/run/php5-fpm.sock;fastcgi_split_path_info ^(.+.php)(/.*)$;包括 fastcgi_params;fastcgi_param HTTPS 关闭;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}位置 ~ ^/socket{proxy_pass http://127.0.0.1:8080;proxy_redirect 关闭;proxy_http_version 1.1;proxy_set_header 升级 $http_upgrade;proxy_set_header 连接升级";proxy_set_header 主机 $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();服务器.听(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('服务器运行在 8080 端口.');

解决方案

  1. Nginx(nginx 版本:nginx/1.4.6)变化:-

    服务器{听80;服务器名称 255717070.com;根/var/www/stack/25571070;index index.html index.htm;地点/{}位置 ^~/socket {重写 ^/socket/(.*)/$1 中断;#用于向基本url发送请求proxy_pass http://127.0.0.1:3000;proxy_redirect 关闭;proxy_pass_request_headers 开启;proxy_set_header X-Real-IP $remote_addr;proxy_set_header 主机 $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 升级 $http_upgrade;proxy_set_header 连接升级";proxy_set_header 主机 $host;}}

注意:你需要把location ~ ^/socket改为location ^~/socket

节点变化:

  1. app.js:

    app.enable('信任代理');app.set('port', process.env.PORT || 3000);var server = app.listen(app.get('port'), function() {debug('Express 服务器监听端口 ' + server.address().port);});var sockets = require('socket.io')({'transsports': ['websocket', 'flashsocket','htmlfile','xhr-polling','jsonp-polling']});var io = sockets.listen(server,{ resource: '/socket.io/','卸载时同步断开':true });io.sockets.on('connection', function (socket) {setInterval(function() {socket.emit('news', { hello: 'hello world' })}, 1000);});

  2. index.ejs:

    <头><title><%=title%></title><link rel='stylesheet' href='/socket/stylesheets/style.css'/><身体><h1><%=标题%></h1><p>欢迎使用<%=标题%></p><div id="divID">

<script src="http://www.25571070.com/socket/socket.io/socket.io.js"></script><脚本>var socket = io.connect('ws://25571070.com');//var socket = io.connect('http://www.25571070.com');变量 i = 0;socket.on('news', function(data) {var div = document.getElementById('divID');i = i + 1;div.innerHTML = div.innerHTML + '<p>'+ data.hello+'('+i+')'+'</p>';控制台日志(数据);});

package.json:

<代码>{"name": "25571070",版本":0.0.0",私人":真的,脚本":{开始":节点./bin/www"},依赖关系":{"body-parser": "~1.6.6","cookie-parser": "~1.3.2",调试":~1.0.4","ejs": "~0.8.5",快递":~4.8.6","时刻": "^2.8.2","摩根": "^1.2.3","serve-favicon": "^2.0.1","socket.io": "^1.0.6",手写笔":0.42.3"}}

火狐响应:

Chrome 响应:

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

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

i've got this error requests.

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.

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 version: nginx/1.4.7

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

Note: You need to change location ~ ^/socket to location ^~ /socket

Node Changes:

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

Chrome Response:

FYI. I have used below version:

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

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

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆