【发布时间】:2021-02-22 20:11:41
【问题描述】:
我想制作一个启动程序并在网络浏览器中实时显示输出的 CGI。这里的实时是指程序一旦产生一行输出,它就应该显示在浏览器页面上。
我选择用 bash 编写来包装程序执行,以便处理请求参数。
webbrowser -> nginx+fastcgi -> bash -> program
我有一个测试程序,每半秒输出一行,10 次。
我想我可以在响应头中声明一个纯文本上下文类型,然后执行程序。
不幸的是,输出只在执行结束时才出现在浏览器中。我在 Firefox 和 curl 中测试过。
我已经测试了许多选项以及它们的任意组合来解决这个问题:
- 在 nginx 中使用
fastcgi_buffering off指令禁用缓冲 - 添加
X-Accel-Buffering标头 - 使用
stdbuf -oL program - 使用 xml http 请求 (XHR) + 服务器端事件 (SSE) 而不是纯文本。
没有任何作用。
我猜是 nginx 和 bash 之间的缓冲问题,但我找不到禁用它的方法。
我可以尝试什么?
【问题讨论】:
-
我不确定它是否有帮助,最近我回答了一个与此相关的问题,nginx 输出是通过 XHR 接收的。检查this的答案,也许它有帮助?
标签: bash nginx fastcgi server-sent-events buffering