nginx, node.js и socket.io - есть ли рабочий брак?

nginx— отличный статический файловый сервер.

он может обслуживать node.js, как в этом примере, но ограниченным образом.

но nginxявно не можетпроксировать веб-сокеты.

единственное, что, как я обнаружил, может работать, это использование интерфейса HAProxyв соответствии с этой статьей— но это от 6 октября 2011 года.

этот имеетявляется распространенной проблемой, но я не нашел очень распространенного решения.


Решение

(полное решение и подробности см. в https://github.com/bangkok-maco/barebone-node)

Схема тестирования ip:

  • 127.0.0.12 - www.chat.nit — общедоступный, в /etc/hosts и haproxy
  • 127.0.1.12 — внутренний веб-сервер nginx
  • 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) {
  ...
};

чат: клиент.html


  
  

примечания:

  1. ссылка js-клиента socket.io в каталог scripts/

    /.../scripts$ ln -s ../node_modules/socket.io/node_modules/socket .io-client/dist/ socket.io

  2. /etc/default/haproxy (вопреки тексту, должен работать вообще)

    ENABLED=1

  3. эта версия haproxy не Ведение журнала. нашел запись kvzо том, как использовать rsyslogdчерез 127.0.0.1, но не смог запустить.

  4. это решение работает— конечно, не качество системного администратора. (улучшения более чем приветствуются.)

5
задан Community 23 May 2017 в 10:28
поделиться