我正在使用Node(express),socket.io和Nginx制作高度可扩展的聊天应用程序。
我通过充当负载平衡器/反向代理来理解Nginx的工作方式。这是我的Nginx配置:
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 80;
root /public/;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://io_nodes;
#enable websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_update;
proxy_set_header Connection "upgrade";
}
}
#load balancing socket io
upstream io_nodes {
# enable sticky sessions
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
}
我到达端口80上的nginx端口,但是我没有分发到其他服务器。我可以告诉你,因为pid是相同的。我有一种感觉是因为socket.io和名称空间?我不太了解它,也找不到很好的文章或视频来解释它。
这是服务器:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 8080;
const ENV = process.env.ENV || 'development';
const server = require('http') .createServer(app);
const io = require('socket.io')(server);
const redis = require('socket.io-redis');
server.listen(PORT, (err) => {
if (err) console.error('❌ Unable to connect the server: ', err);
console.log(` Chat server listening on port ${PORT} - ${ENV} environment`);
});
io.on('connection', socket => {
console.log(`made socket connections, socket ID: ${socket.id} and pid ${process.pid}`);
});
最后是前端部分:
socket.emit('new message', {
message: message.value,
author: author.value
});
所以我的问题是这个
一如既往,我们将提供所有帮助!
编辑:进一步阅读here显示他使用上游作为:
upstream socket_nodes {
ip_hash;
server srv1.app.com:5000 weight=5;
server srv2.app.com:5000;
server srv3.app.com:5000;
server srv4.app.com:5000;
}
这是否意味着您不能真正在localhost /不同端口上测试,而是在不同地址上进行测试(有意义)