如何设置端点来处理nginx

时间:2017-03-21 11:15:38

标签: node.js nginx socket.io

编辑:我继续搜索,并进一步了解。现在,当调用我的端点时,我收到以下错误:

GET /?EIO=3&transport=polling&t=LhnJ9p5 404

所以现在它最终会在正确的位置结束,但它会执行轮询请求而不是ws连接。仍然,调用后端直接工作正常,但通过Nginx搞砸了我的请求。

客户端

import io from 'socket.io-client';

...

//Does work
io.connect('localhost:10007');
// Does not work
io.connect('http://localhost', {path:'/my/path'});

socket.on('connect', function(){console.log('Connected!');});
socket.on('event', function(data){console.log('Data: ', data);});
socket.on('disconnect', function(){console.log('Disconnected!');});

服务器

// Lots of initiation, middleware, routing etc.
let app = express.init('src/'); 

let server = http.createServer( app );
var io = require( "socket.io" )( server );

server.listen(10007,'127.0.0.1');

io.on('connection', function(socket){
  console.log("User Connected");
});

nginx.conf

location /my/path/ {
    proxy_pass http://127.0.0.1:10007/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

浏览互联网,我偶然发现了类似的问题,所有这些似乎只是指向nginx.conf中的配置。虽然它似乎对其他人有效,但我错过了其他的东西。

我在Nginx代理后面设置了一个后端。后端基于express,其工作方式类似于处理对GET / POST / DELETE等的不同调用的API .Nginx设置代理以将调用转发到后端服务器,一切都很顺利。

现在我需要实现到后端的websocket连接,我似乎没有做对。电话永远不会通过后端,我不知道为什么。这是我的服务器代码:

function setRoutes(app) {

...

  /**
   * Set up socket.io to the endpoint
  */
  let server = require('http').Server(app);
  let io = require('socket.io')(server);
  io.on('connection', (socket) => {
    console.log('Client is connected: ', socket);
  });
  // If I uncomment this, I am able to connect to localhost:80 on the client
  //server.listen(80);
}

如上面的评论中所述,如果我忽略服务器后端设置,并通过直接侦听localhost上的端口80来绕过它,则websocket连接可以正常工作。但是所有其他端点都从Nginx中的代理地址中删除。我希望websocket连接到服务器其余部分使用的相同端点地址。

稍微阅读一下,我注意到这个here上有一个走路槽,但这似乎设置了websocket的整个端点,而我想在我的快速代码中定义我的路由,而不是我的Nginx设置。例如,如果我想将几个不同的websocket端点设置到同一代理,我将不得不在两个不同的地方管理路由。如果可能的话,我想远离这个。

1 个答案:

答案 0 :(得分:3)

我在尝试调试socket.io问题时偶然发现了你的问题...我在AWS上使用nginx进行设置,所以希望这些都有帮助。

我认为让websocket在nginx中工作的关键是上游配置:

upstream ws_NodeAppName {
    ip_hash;
    server 127.0.0.1:3000;
}


   location ~ ^/(NodeAppName|NodeAppName\/socket.io) {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://ws_NodeAppName;
}

我的方法的一个警告是,客户端收到的页面不是从节点应用程序提供的,因此节点应用程序只是设置套接字。

如果以这种方式设置,则需要明确指定套接字的路径。

客户端:

var socket = io.connect(window.location.origin,
{
    path: '/NodeAppName/socket.io'
});

SERVER:

var io = require('socket.io')(http, {
    path: '/NodeAppName/socket.io'
});

我希望有所帮助!它可能是卑鄙地试图让这个正确配置..我正在翻滚兔子洞试图确定是什么导致我的零星504错误。