使用 Nginx 代理 Socket.io/WebSocket 及 負載均衡配置

轉自: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>
相關文章
相關標籤/搜索