Nginx 1.5+文件上传——最佳实践

55
我希望通过我的 nginx 服务器上传文件。我目前正在运行 nginx-1.4.6 ,如果必要的话,我愿意升级到最新稳定版的 nginx-1.5*
社区中最受欢迎的是 Valery Kholodkov 的 nginx-upload-module,可以在 这里找到。遗憾的是,Valery 已经不再维护这个模块了,详情请见这里。从 nginx-1.3.9 开始,该模块只能部分或完全工作。
我已经将 nginx-upload-module 编译到 nginx-1.4.6 中,并遇到了一个 bug (客户端连接关闭),该 bug 在 nginx-1.5.3变更日志中似乎已得到修复。然而,我已经应用了补丁,但没有运气。
Anatoly 的略微过时的文章这里提供了多种解决方案,包括四个解决方案: 当我深入研究第二种和第四种解决方案时(我不想让 lua 成为依赖项,但我可能会),我认为向这个社区提问是合适的。

如何使用nginx-1.5+进行文件上传的最佳实践是什么?

需要说明的是,我正在使用pythonPOST命令上传文件,并尝试使用curl进行测试。我的技术堆栈中不包括PHP


客户端的clientbodyinfileonly有什么问题? - Danack
1
不确定clientbodyinfileonly有什么问题,它只是未经记录,并且不清楚人们是否在生产环境中成功使用它。而且我不清楚如何判断clientbodyinfileonly在做什么以及它是否真的在这样做,请参见此问题:http://serverfault.com/questions/635219/nginx-client-body-in-file-only-for-file-upload-performance - Jared
你需要允许更大的client_max_body_size:client_max_body_size 1024M; - Time to Travel
你有关于那个的任何更新吗? - hahn
5个回答

1

0

关于你的疑问,有一篇不错的文章。https://coderwall.com/p/swgfvw

我尝试过nginx-upload-module。这是一个不错的解决方案,但似乎对于新版本不起作用。 Lua中也有一些模块可以帮助你。在我的情况下,我有业务逻辑,然后我在我的应用程序中实现了它。

请注意,上传文件的大问题是FILER。这是瓶颈:我所做的许多负载测试都表明了这个结论。


谢谢这个。看起来很熟悉;-) 我看到我在我的问题中引用了它。然而,那些并没有起作用。 - JayInNyc
有一个使用分布式文件系统(rawdisk)策略的 Golang 解决方案,可以很好地工作。但是配置和获取文件很困难。 - Andre Fonseca

0
Nginx支持'POST'方法,您可以使用大参数。客户端可以使用php或jsp来使用post方法构建请求到nginx服务器。

0

我知道这是一个非常老的问题,但它在谷歌搜索“nginx上传模块”中排名第一页,并且是第一个Stack Overflow结果,所以如果这能帮助到其他遇到这个问题的人:

我正在使用nginx 1.10.3上的nginx-upload-module。正如原问题提到的那样,Valery Kholodkov不再维护该模块。然而,有几个不同的分支和其他人修改了它以使其与更新的nginx版本兼容。

这个拉取请求是我用来编译带有上传模块的nginx的。

https://github.com/vkholodkov/nginx-upload-module/pull/88

在我看来,如果你正在使用nginx和php-fpm,上传模块仍然是最好的解决方案。该模块允许nginx完全处理上传,直到上传完成,然后将上传处理工作传递给PHP。因此,当用户上传大量文件时,php-fpm进程不会成为瓶颈。


-8

只是一个快速的草稿,但可以试试这个...

Upload.php
if (isset($_FILES['dlc_file']) && !empty($_FILES['dlc_file'])) {
    if (empty($_FILES['dlc_file']['name']) === true) {
        echo = "Please choose a file to upload";
    } else {
        $allowed = array('zip', 'rar', 'gzip', 'tar', '7z', 'png', 'jpg');

        $file_name = $_FILES['dlc_file']['name'];
        $file_extn = strtolower(end(explode('.', $file_name)));
        $file_temp = $_FILES['dlc_file']['tmp_name'];

        if (in_array($file_extn, $allowed) === true) {
            $file_path = 'dlc/' . substr(md5(time()), 0, 10) . '.' . $file_extn;
            move_uploaded_file($file_temp, $file_path);
            echo = "Successfully uploaded $file_name";
        } else {
            $file_types = implode(', ', $allowed);
            echo "File type is not allowed, Allowed file types $file_types";
        }
    }
}

index.php
<form action="upload.php" method="post" enctype="multipart/form-data>
    <input type="file" name="dlc_file">
    <input type="submit" name="submit" value="Upload">
</form>

9
这段代码有什么用处?发帖者并不是在寻找PHP解决方案(他明确表示PHP不是他的技术栈的一部分),而是询问使用Nginx 1.5+上传文件的当前最佳实践是什么。 - Manuel Meurer
1
感谢您的回答。或许其他人会发现它有用。不过 PHP 不在我的技术栈中。 - JayInNyc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接