nginx 1.5+文件上传 - 最佳实践

时间:2014-03-17 17:36:09

标签: file-upload nginx

我希望通过nginx服务器上传文件。我目前正在运行nginx-1.4.6,并愿意根据需要移动到最新的nginx-1.5*

社区最喜欢的是Valery Kholodkov的nginx-upload-module,找到here。令人遗憾的是,Valery不再维护此模块,详情为here。截至nginx-1.3.9,模块部分工作或根本不工作。

我已将nginx-upload-module编译为nginx-1.4.6并收到一个错误(客户端cxn已关闭),似乎已修复nginx-1.5.3 changeset。但是我已经应用了补丁并没有运气。

Anatoly稍微过时的帖子here提供了多种解决方案,包括四种解决方案

当我深入研究第二和第四种解决方案时(我不想让lua成为依赖,但我可能会这样做)我认为向社区提问是合适的:

目前使用nginx-1.5+上传文件的最佳做法是什么?

让我补充一点,我正在从python POST命令上传文件并尝试使用curl进行测试。 PHP不在我的技术堆栈上。

5 个答案:

答案 0 :(得分:1)

如果你不喜欢php或lua,也许你可以使用perl。

http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods

  

$ R-> has_request_body(处理程序)

但开箱即用的nginx不是保存收到的帖子请求并存储它的工具。

也许uWSGI(https://uwsgi-docs.readthedocs.io/en/latest/)是使用http-socket https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html和python应用程序的更好方法。

答案 1 :(得分:0)

这是一篇关于你怀疑的好文章。 https://coderwall.com/p/swgfvw

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

请记住,上传文件的一大问题是FILER。这是botleneck:我做了很多负载测试,向我展示了这个结论。

答案 2 :(得分:0)

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

答案 3 :(得分: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,那么上传模块IMO仍然是最好的解决方案。这个模块允许nginx完全处理上传,直到它们完成,然后处理上传的工作传递给PHP。因此,当用户上传大量文件时,php-fpm进程不会产生瓶颈。

答案 4 :(得分:-7)

快速草稿,但试试这个......

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>