我有10个文件,log1.txt,log2.txt,log3.txt
我想有一个nginx端点,/ log会将所有3个日志返回给客户端。
所以如果log1.txt是
BASEBALL
log2.txt
BASKETBALL
log3.txt
SWIMMING
/ log将返回
BASEBALL
BASKETBALL
SWIMMING
(虽然我的用例中的顺序并不重要)
重要的是nginx服务器没有加载内存中的所有文件(连接,tar或其他),因为这些文件可能很大并占用了所有可用内存。我希望nginx将文件流式传输到客户端。
这可以用nginx吗?
答案 0 :(得分:1)
首先,我应该说这个任务看起来很奇怪,这可能表明你的问题是“XY Problem”。也许,如果您要描述原始问题,我们可以找到更好的解决方案。
现在回到你的问题。令人惊讶的是,Nginx确实提供了一些实现这一目标的方法,尽管它们并不是很明显。在我看来,最简单的选择是使用SSI模块,它几乎是Nginx的每个发行版。
这种情况下的配置看起来有点像这样:
server {
...
location /log {
# Parse the contents of the response body
# as if it were an SSI template
ssi on;
# And parse it whatever the Content-Type (MIME)
# of the response body is
ssi_types *;
# Make an internal redirect to the internal
# location in order to get an SSI template
rewrite ^/log$ /log/template;
location /log/template {
# Make sure this location is not available
# from the outside world
internal;
# You can set any mime type here
default_type text/plain;
# Combine files any way you like using
# the SSI template language
return 200 '<!--# include file="/log/log1.txt" -->
<!--# include file="/log/log2.txt" -->
<!--# include file="/log/log3.txt" -->';
}
}
...
}
您可以在官方documentation中找到SSI命令的说明和示例。
为了获得更好的效果,将sendfile与aio和tcp_nopush结合使用也是一个好主意。这可以通过将这些指令与ssi_min_file_chunk一起设置来完成。 Here您可以阅读有关sendfile及其用途的内容。
然而,即使没有这些设置,Nginx也能快速工作,不会耗尽你的记忆。