转自:http://naux.me/using-nginx-with-socketio/
0,介绍
Socket.io 一套是基于 WebSocket 协议的实时通讯 API,可以很轻松的开发类似于实时聊天,实时游戏之类的 Web 应用。
Nginx 从 1.3 版本开始支持 WebSocket 代理,我们也能将其应用于 Socket.io,实现如 Socket.io 的负载均衡,和 Web 共用 80(HTTP) 或 443(HTTPS) 端口处理握手请求等需求。
1,配置代理
在 server
配置块中添加如下配置中的 location /socket.io/
配置块即可实现 WebSocket 在 80/443 端口握手。
server {
listen 80;
listen 443 ssl;
server_name example.domain;
root "/project/path";
index index.html index.htm index.php;
location /socket.io/ {
# 此处改为 socket.io 后端的 ip 和端口即可
proxy_pass http://127.0.0.1:5000;
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;
}
}
配置中的 /socket.io/
可在 Socket.io 中的 path
选项中配置, 其默认为 /socket.io
2,负载均衡
均衡算法要使用 ip_hash
, 防止使用 long-polling
通信时请求分发到了不同的服务器导致异常。
server {
listen 80;
listen 443 ssl;
server_name example.domain;
root "/project/path";
index index.html index.htm index.php; // 配置负载的后端
upstream socket_nodes {
ip_hash;
server server1.app:5000 weight=5;
server server2.app:5000;
server server3.app:5000;
server server4.app:5000;
}
location /socket.io/ {
proxy_pass http://socket_nodes;
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;
}
// 其他配置项
// ...
}
3,测试代码
写个小的 Socket.io 代码测试一下
Node端,开启一个 Socket.io 服务器,并监听 5000 端口, 通过上面的 nginx 配置使用 80 端口代理
app.js
var io = require('socket.io').listen(5000);
io.sockets.on('connection', function (socket) {
socket.on('set nickname', function (name) {
socket.set('nickname', name, function () {
socket.emit('ready');
});
});
socket.on('msg', function () {
socket.get('nickname', function (err, name) { console.log('Chat message by ', name);
});
});
});
客户端,在浏览器中连接 Socket.io 服务器
index.html
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
</script>