轉自: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>