• Nginx Upload Module 上传模块


    传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java、PHP、Python、Ruby等。今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面

    GitHub: https://github.com/vkholodkov/nginx-upload-module/tree/2.2

    Site: http://wiki.nginx.org/HttpUploadModule

    一、安装模块

    从GitHub上下载源码解压,进入nginx源码目录,重新./configure并且添加如下参数:

    // 添加此参数
    --add-module=path/to/nginx_upload_module
    
    // 如果你的Upload Module路径为:/home/nginx_upload_module
    --add-module=/home/nginx_upload_module

    如果你想获知此前nginx安装参数可以这样获取:

    [root@lee uploadtmp]# /usr/local/nginx/sbin/nginx -V
    nginx version: nginx/1.5.10
    built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 
    TLS SNI support enabled
    configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/home/nginx-upload-module-2.2

    配置过程中,注意查看过程是否出错

    configuring additional modules
    adding module in /home/nginx-upload-module-2.2
     + ngx_http_upload_module was configured

    如果没有什么错直接就make && make install完事

    二、配置

    直接来个样例:

    # 上传大小限制(包括所有内容)
    client_max_body_size 100m;
    
    # 上传path配置
    location /upload {
        # 转到后台处理URL
        upload_pass   /uploadHandle;
    
        # 临时保存路径
        # 可以使用散列
        upload_store /tmp/nginx_upload;
        
        # 上传文件的权限,rw表示读写 r只读
        upload_store_access user:rw;
    
        # 这里写入http报头,pass到后台页面后能获取这里set的报头字段
        upload_set_form_field "${upload_field_name}_name" $upload_file_name;
        upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;
        upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;
    
        # Upload模块自动生成的一些信息,如文件大小与文件md5值
        upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;
        upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;
    
        # 允许的字段,允许全部可以 "^.*$"
        upload_pass_form_field "^submit$|^description$";
    
        # 每秒字节速度控制,0表示不受控制,默认0
        upload_limit_rate 0;
    
        # 如果pass页面是以下状态码,就删除此次上传的临时文件
        upload_cleanup 400 404 499 500-505;
    }

    以上配置中,仅是一些常用配置,更全的配置请看Nginx Upload Module的site

    三、测试

    我利用实例中的example.php测试处理结果:

    连中文名都被识别set过来了

    四、一些建议

    效率对比,此模块是由C语言写的,效率自然不成问题,另外一个有点是不会过多占用后台语言的线程。相比之下,Nginx利用负债均衡的能力处理文件上传上,效率更高。

    权限控制,这个确实蛋疼,因为业务代码在nginx.conf里写太多反倒不好维护,但如果不考虑权限的情况下,并且file size 控制的小一点,结合upload_cleanup不会有太大压力。

    上传进程,可以结合Nginx的nginx_uploadprogress_module使用

    存储位置,甚至可以把临时文件保存到tmpfs中(不过这会有丢失的可能性)

  • 相关阅读:
    第二节. SignalR开篇以及如何指定传输协议
    第一节:.Net版基于WebSocket的聊天室样例
    Maven常用dependency记录
    Linux学习笔记
    Maven 学习笔记
    SQL脚本去重分组统计
    版本号定义
    C# Random循环生成随机数重复问题解决方案
    C#通过Oracle.ManagedDataAccess无法访问Oralce
    Java注解的使用,类似于C#的Attribute
  • 原文地址:https://www.cnblogs.com/lidabo/p/4169721.html
Copyright © 2020-2023  润新知