将从Nginx到Socket.io的Websocketstream量(不使用SSL)

截至昨天nginx开始支持websocket连接,因此我试图让我的nginx-nodejs-socket.io应用程序没有harproxy等工作(虽然没有太多的运气)。

我想要达到的是nginx只发送websocket连接请求到支持的服务器,或websocket服务器,socket.io更确切,而在同一时间nginx将服务的PHP文件,所有的静态内容, 包括HTML文件 。我不想快递服务的静态内容(如果这是可能的话)。

这是我的nginx.conf

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; upstream backend { server 127.0.0.1:8080; } server { listen 80; server_name localhost; charset UTF-8; #access_log logs/host.access.log main; location / { root /website/html_public; index index.php index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /website/html_public; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ \.php$ { root /website/html_public; try_files $uri =404; fastcgi_pass unix:/tmp/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } location /connection { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root /website/html_public; # index index.php index.html index.htm; # } #} } 

这是我在节点中的server.js文件

 var express = require('express'); var app = express(); var port = 8080; /* HTTP Server*/ server = require('http').createServer(app); server.listen(port); app.use(express.logger(':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms')); app.use(express.static(__dirname + '/html_public')); app.use(express.favicon()); app.set('view engine', 'jade'); app.set('view options', { layout: false }); app.set('views', __dirname + '/views'); app.get('/', function(req, res){ res.render('index.html'); }); /* * Web Sockets */ io = require('socket.io').listen(server), io.configure('production', function(){ io.enable('browser client etag'); io.set('log level', 1); io.set('transports', [ 'websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling' ]); }); console.log('Chat Server started with Node '+ process.version +', platform '+ process.platform + 'to port %d',port); 

从我的客户端,我尝试像这样连接:

 socket = new io.connect('http://localhost/connection'); 

现在,问题是,当我尝试正常连接,键入localhost,我看到在Chrome控制台上: **GET http://localhost/socket.io/socket.io.js 404 (Not Found)** ,还当在浏览器中inputhttp://localhost/connection我收到“无法GET /连接” ,这告诉我,nginx不能正常代理websockets与我目前的configuration。

预先感谢您的答案。

让我猜你想要:

 location /connection { proxy_pass http://backend/; ... } 

但是你有:

 location /connection { proxy_pass http://backend; ... } 

http://nginx.org/r/proxy_pass

只是为了确定,你有Nginx版本1.3.13吗? (例如Nginx的PPA还没有这个版本。)