簡體   English   中英

nginx,node.js和socket.io-是否有正常的婚姻?

[英]nginx, node.js and socket.io - is there a working marriage?

nginx是一個殺手級靜態文件服務器。

本例中所示 ,它可以服務於node.js ,但方式有限。

但是nginx 顯然無法代理websockets

我唯一發現可能的工作是使用HAProxy的前端按照這篇文章 -但它從2011年10月6日,是。

必須是一個常見的問題,但我沒有找到一個非常普遍的解決方案。


(有關完整的解決方案和詳細信息,請參見https://github.com/bangkok-maco/barebone-node

ip測試架構:

  • 127.0.0.12-www.chat.nit-在/ etc / hosts和haproxy中公開
  • 127.0.1.12-內部Nginx Web服務器
  • 127.0.2.12-內部聊天服務node.js socket.io

/etc/haproxy/haproxy.cfg:

global
 maxconn 4096
 nbproc 2
 daemon
 # user nobody
 log             127.0.0.1       local1 notice

defaults
 mode http

# listen on 127.0.0.12:80
frontend app
 bind 127.0.0.12:80
 mode tcp
 timeout client 86400000
 default_backend www_backend
 acl is_chat hdr_dom(Host) chat
 acl is_websocket path_beg /socket.io

 use_backend chat_socket_backend if is_websocket is_chat
 tcp-request inspect-delay 500ms
 tcp-request content accept if HTTP

# ngnix on 127.0.1.12:80
backend www_backend
 balance roundrobin
 option forwardfor
 mode http
 option httplog
 option httpclose
 timeout server 30000
 timeout connect 4000
 server w1 127.0.1.12:80 weight 1 maxconn 1024 check

# node (socket.io) on 127.0.2.12:80
backend chat_socket_backend
 balance roundrobin
 mode http
 option httplog
 option forwardfor
 timeout queue 5000
 timeout server 86400000
 timeout connect 86400000
 timeout check 1s
 no option httpclose
 option http-server-close
 option forceclose
 server s14 127.0.2.12:8000 weight 1 maxconn 1024 check

/etc/nginx/sites-enabled/www.chat.nit

server {
    listen   127.0.1.12:80;

    root /data/node/chat;
    index client.html;

    server_name www.chat.nit;

    # favicon.ico is in /images
    location = /favicon.ico$ { rewrite /(.*) /images/$1 last; }

    # standard includes
    location ^~ /(css|images|scripts)/ {
            try_files $uri =404;
    }

    # html page (only in root dir)
    location ~ ^/([-_a-z]+).html$ {
            try_files $uri =404;
    }

    error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
            root /usr/share/nginx/www;
    }
}

聊天(node.js):server.js

var app = require('http').createServer()
   , io = require('socket.io').listen(app);    
app.listen(8000,'127.0.2.12');

io.sockets.on('connection', function(socket) {
  ...
};

聊天:client.html

<head>
  <script src="/scripts/socket.io/socket.io.js"></script>
  <script>
    var socket = io.connect('http://www.chat.nit:80'); 
    ...
  </script>
</head>

筆記:

  1. 將socket.io客戶端js鏈接到scripts/目錄

    /.../腳本$ ln -s ../node_modules/socket.io/node_modules/socket.io-client/dist/ socket.io

  2. 在/ etc /默認/ HAProxy的(與文本,必須設置為工作在所有

    已啟用= 1

  3. 此版本haproxy不記錄。 找到了kvz關於如何通過127.0.0.1使用rsyslogd ,但是無法使其運行。

  4. 此解決方案有效 -不能確定sysadmin的質量。 (增強功能不只是歡迎功能。)

自v1.3.13以來,您似乎可以通過nginx代理WebSockets

有關更多詳細信息,請參見http://nginx.org/en/docs/http/websocket.html

這是我的(用於測試目的的舊版本)HAProxy配置,用於代理WebSocket和常規HTTP請求。

global
    maxconn 4096
    nbproc 2
    daemon
    user nobody

defaults
    mode http

frontend app
    bind 0.0.0.0:8000
    mode tcp
    timeout client 86400000
    default_backend www_backend
    acl is_websocket path_beg /sockets

    use_backend socket_backend if is_websocket
    tcp-request inspect-delay 500ms
    tcp-request content accept if HTTP

backend www_backend
    balance roundrobin
    option forwardfor
    mode http
    option httplog
    option httpclose
    timeout server 30000
    timeout connect 4000
    server w1 localhost:8080 weight 1 maxconn 1024 check

backend socket_backend
    balance roundrobin
    mode http
    option httplog
    option forwardfor
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    timeout check 1s
    no option httpclose
    option http-server-close
    option forceclose
    server s1 localhost:8081 weight 1 maxconn 1024 check

請注意,我通過查看路徑( acl is_websocket path_beg /sockets行)來識別請求是否為WS。 可以替換為例如:

acl is_websocket hdr(Upgrade) -i WebSocket

或這個:

acl is_websocket hdr_beg(Host) -i ws

或兩者。 使用此配置代理到nginx應該可以立即使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM