当前位置: 首页 > 知识库问答 >
问题:

nginx,节点。js和套接字。io-有工作婚姻吗?

章哲茂
2023-03-14

nginx是一个杀手级静态文件服务器。

它可以服务于< code>node.js,如本例所示,但方式有限。

nginx显然无法代理websockets

我发现唯一可行的是按照这篇文章使用HAProxy前端——但这是2011年10月6日的文章。

这肯定是一个普遍的问题,但我没有找到一个非常普遍的解决方案。

(有关完整的解决方案和详细信息,请参见https://github.com/bangkok-maco/barebone-node)

ip测试架构:

    < Li > 127 . 0 . 0 . 12-www . chat . nit-public,在/etc/hosts和haproxy中 < li>127.0.1.12 -内部nginx web服务器 127.0.2.12 -内部聊天服务node.js socket.io
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
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;
    }
}
var app = require('http').createServer()
   , io = require('socket.io').listen(app);    
app.listen(8000,'127.0.2.12');

io.sockets.on('connection', function(socket) {
  ...
};
<head>
  <script src="/scripts/socket.io/socket.io.js"></script>
  <script>
    var socket = io.connect('http://www.chat.nit:80'); 
    ...
  </script>
</head>

注意事项:

> < li>

将socket.io客户端js链接到< code>scripts/目录

/…/scripts$ln-s../node_modules/socket.io/node_modules/socket。io客户端/dist/socket.io

/etc/default/haproxy(与文本相反,必须设置为工作)

启用=1

这个版本可能没有记录。通过127.0.0.1找到了kvz关于如何使用<code>rsyslogd</code>的文章,但无法使其实现。

这个解决方案是可行的——当然不是系统管理员的质量。(非常欢迎增强功能。)

共有2个答案

容阳焱
2023-03-14

这是我的(旧的和用于测试目的的)HAProxy配置,用于代理WebSockets和普通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

注意,我是通过查看路径(< code > ACL is _ web socket path _ beg/sockets 行)来识别请求是否是WS的。例如,这可以替换为:

acl is_websocket hdr(Upgrade) -i WebSocket

或者这个:

acl is_websocket hdr_beg(Host) -i ws

或者两者都有。使用这个配置代理到nginx应该是现成的。

万嘉石
2023-03-14

看起来您可以从v1.3.13开始通过nginx代理WebSocket

有关更多详细信息,请参阅 http://nginx.org/en/docs/http/websocket.html

 类似资料:
  • 如果有人对WebSocket/Socket IO有经验,希望你能给我指出正确的方向。 我制作了一个不和谐的克隆,我正试图优化它以更好地扩展。现在,当一个用户发送一条消息时,我向数据库查询该服务器的所有用户部分,并向他们的特定套接字发送一条消息。这显然不能很好地扩展,因为每条消息都需要在客户机列表中进行昂贵的查询和查找 然而,为每台服务器使用房间将消除我查询数据库的需要。我知道我可以在套接字服务器首

  • 我有一个节点。js服务器使用socket。io和Android应用程序。我希望我的应用程序连接到服务器。(我在当地工作) 首先我启动服务器:命令提示符 以下是代码: 然后我试着从这里的活动中联系起来: 我的问题是,我从来没有在服务器上看到“一个用户连接”的日志,但我总是在android日志上看到“尝试连接”和“连接成功”。 有人能帮我解开这个谜团吗? 使现代化 我的代码工作正常,但我遇到了一些Wi

  • 在我的系统更新之后,我在Nginx上运行的PHP应用程序遇到了一个坏的网关错误。 1连接()到unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock失败(13:权限被拒绝),同时连接到上游,客户端:xx.xxx.xx.xx,服务器:localhost,请求:"GET/HTTP/1.1",上游:"快速cgi://unix:/var/运行/php-fcgi-v

  • 我试图使用任何NodeJS或NPM命令,但我总是得到以下错误: 套接字:(10106)无法加载或初始化请求的服务提供程序。 我正在运行Windows 10,我尝试再次重新安装nodejs,但仍然没有改变。

  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 我尝试用laravel echo服务器和套接字创建实时应用程序。io,但客户端未成为消息 这是我的代码: .环境 配置/queue.php config/database.php 路线/频道。php src/echo。js 活动/MessagePosted.php 消息控制器。php 在Redis cli PING命令return PONG中安装了Redis服务器。我使用php artisan q