Nginx在一个请求中提供多个文件

时间:2015-11-09 16:55:33

标签: nginx

我有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吗?

1 个答案:

答案 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命令的说明和示例。

为了获得更好的效果,将sendfileaiotcp_nopush结合使用也是一个好主意。这可以通过将这些指令与ssi_min_file_chunk一起设置来完成。 Here您可以阅读有关sendfile及其用途的内容。

然而,即使没有这些设置,Nginx也能快速工作,不会耗尽你的记忆。