RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 763727
Accepted
NoTrust
NoTrust
Asked:2020-12-27 04:41:38 +0000 UTC2020-12-27 04:41:38 +0000 UTC 2020-12-27 04:41:38 +0000 UTC

NGINX:提供附加文件

  • 772

在我的应用程序中,有一个基本上类似于日志的文件,即 不断补充。我想使用 Range 标头作为长轮询和 websockets 的替代方法来读取补充文件,因为这些技术的实现需要时间,尤其是考虑到使用 C++。NGINX 处理这项任务的效率如何,在处理补充文件时会出现问题吗?哪些参数最适合实施这种方法?也许您需要在应用程序中使用directio 和NGINX 进行优化?还是值得完全放弃这个想法?... 基于 Linux 的服务器,ext4 文件系统。文件大小不超过100MB(同时录制到一个文件,然后创建一个新文件)。

PS:无论如何你都必须写入文件,拆分成小文件与这种方法的实现无关。

nginx
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    sanmai
    2020-01-01T21:26:24Z2020-01-01T21:26:24Z

    重新发明轮子是没有意义的,因为 nginx 已经有一个 websocket 模块来处理所有的艰苦工作。您所要做的就是将消息传递给 nginx。一次安装:

    sudo apt install libnginx-mod-nchan
    

    设置也不难。可以在多服务器配置中运行 Redis。

    如果由于某种原因您不能使用此模块,那么再次创建另一个数据库是值得的。在严重的工作负载上,磁盘上的文件永远不会取代真正的数据库,无论是 MySQL 还是其他什么。如果只是因为一个典型的数据库可以保证热数据将在 RAM 中,而磁盘缓存根本不能保证任何事情。这很容易通过一个简单的基准来检查。


    在替代方案中,您可以考虑例如websocketd。这个程序本质上与inetd非常接近,与nginx分开存在。您只需要将WS 连接重定向到它,这非常简单。

    location /mywsapp {
        proxy_pass http://mywsbackend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    

    在最简单的形式中,没有 nginx,从文件中读取新行并通过 WebSocket 传输它们的程序将如下所示: ( tail.sh)

    #!/bin/bash
    tail -q -n0 -F /tmp/websocketdata.txt
    

    读取数据的页面如下所示: ( index.html)

    <!DOCTYPE html>
    <div id="data"></div>
    <script>
    var container = document.getElementById('data');
    
    var ws = new WebSocket('ws://localhost:8080/');
    ws.onmessage = function(event) {
      var p = document.createElement("p");
      p.textContent = event.data;
      container.insertBefore(p, container.firstChild);
    };
    </script>
    

    如果两个文件在同一个目录中,则运行:

    python -m SimpleHTTPServer 8000 &
    ./websocketd --port=8080 ./tail.sh &
    

    在浏览器中打开http://127.0.0.1:8000/并写入相邻控制台中的文件:

    tee -a /tmp/websocketdata.txt
    

    我们打印文本并同时查看它在浏览器窗口中的显示方式。

    这将允许读取程序访问各种变量,就好像它正在运行 CGI 环境一样,例如QUERY_STRING其他。无需检查它们,您甚至可以通过从 bash 中删除该层来做到这一点:

    ./websocketd --port=8080 tail -q -n0 -F /tmp/websocketdata.txt
    

    为了不使读取文件的程序复杂化,您可以使用auth_request 指令在 nginx 端检查对 WebSocket 连接的访问​​。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5