转自:http://naux.me/using-nginx-with-socketio/php
0,介绍html
Socket.io 一套是基于 WebSocket 协议的实时通信 API,能够很轻松的开发相似于实时聊天,实时游戏之类的 Web 应用。node
Nginx 从 1.3 版本开始支持 WebSocket 代理,咱们也能将其应用于 Socket.io,实现如 Socket.io 的负载均衡,和 Web 共用 80(HTTP) 或 443(HTTPS) 端口处理握手请求等需求。nginx
1,配置代理web
在 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
shell
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>