django通过lighttpd + mod_proxy + gunicorn:X-Sendfile返回空响应

时间:2018-08-14 09:44:27

标签: django lighttpd x-sendfile

我在DjangoGunicorn后面使用lighttpd。从Gunicorn文档开始,我将Lighttpd配置为对Gunicorn的反向代理:

$SERVER["socket"] == "0.0.0.0:80" {
    server.document-root = "/home/user/app"
    server.errorlog = "/var/log/lighttpd/app-error.log"
    accesslog.filename = "/var/log/lighttpd/app-access.log"

    $HTTP["url"] !~ "^/static/" {
        proxy.server = (
            "" => (
                (
                    "host" => "127.0.0.1",
                    "port" => 8888,
                    "allow-x-send-file" => "enable"
                )
            )
        )
    }
}

到目前为止,一切正常,即使静态文件也可以正确提供。

现在,我正在尝试使用标题X-Sendfile。在我的Django代码中:

response['Content-Type'] = 'application/force-download'
response['Content-Disposition'] = f'attachment; filename={smart_str(send_name)}'
response['X-Sendfile'] = '/tmp/big-file.txt'

/tmp/big-file.txt存在并且可以通过Lighttpd进程访问。

每次我尝试以这种方式提供文件时,浏览器都会得到一个空响应。没有有效载荷和Content-Length: 0

我发现Lighttpd哪里出了什么错(我认为Django + Gunicorn部分都没错)。

我该怎么办?我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

在尝试设置X-Sendfile之前,请检查脚本是否尚未发送响应头。

您可以在lighttpd进程上使用strace来查看从后端收到的内容,以及lighttpd是否正在尝试打开'/tmp/big-file.txt'