nginx 作为网络服务器,包括.socket.io 和 node.js/ws://400 错误请求 [英] nginx as webserver incl. socket.io and node.js / ws:// 400 Bad Request
本文介绍了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 端口.');
解决方案
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
节点变化:
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);});
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>';控制台日志(数据);});