设为首页 收藏本站
查看: 1122|回复: 0

[经验分享] 开源Nginx 文件上传服务器。ngx_upload_module+web.py+gevent+varnish前端缓存

[复制链接]

尚未签到

发表于 2015-7-26 12:41:17 | 显示全部楼层 |阅读模式
  最近参与公司一项目,当中需使用图片与音频的存储方案,经过多方面考虑,采用了Nginx的ngx_upload_module作为上传前端,python web.py+gevent作为后端文件处理及生成缩略图方式,配合使用Varnish作为http缓存。整体架构与性能上应该比较理想。
  前期由于考虑了分布式存储,大量地实验与尝试了fastDFS,感觉的确是小文件存储方案里面比较优秀的,但是由于对fastDFS的不熟悉与稳定性的考虑,暂时放下。
  实现时,参考了大量py-graphic-0.1.1的思路,感谢作者。
  https://code.google.com/p/py-graphic/
  
  1、实现原理
  由Nginx+nginx_upload_module实现接收http Post请求,并将用户文件保存到nginx.conf指定的位置,这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新组装好上传参数,交由upload_pass指定的段处理,从而允许处理任意上传文件。每个上传文件中的file字段值被一系列的upload_set_form_field指令值替换。每个上传文件的内容可以从$upload_tmp_path变量读取,或者可以将文件转移到目的目录下。上传的文件移除可以通过upload_cleanup指令控制。如果请求的方法不是POST,模块将返回405错误(405 Not Allowed),该错误提示可以通过error_page指令处理。
       upload_pass指定为proxy_pass地址,将上传结果转由gevent+web.py进行处理。通过web.input()获取所有参数,包括文件实际路径与大小,Md5等字段。如果是图片格式,则通过pgmagick组件对图片进能剪栽切割生成缩略图。然后将原图与缩略图保存到web目录下,最后对客户端返回JSON格式的Varnish缓存地址。
  
  2、所需用到的依赖项
      以CentOS 最小化安装为例。



yum -y install gcc gcc-c++ autoconf make python python-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
  
   单独编译安装:      



boost_1_50_0
setuptools-0.6c11-py2.6.egg
gevent-1.0rc2
GraphicsMagick-1.3.16
pcre-8.10
pgmagick-0.5.4

  安装Nginx + ngx_upload_module 2.2。
  安装过程可以参考http://blog.s135.com/nginx_php_v6/
  3、配置nginx.conf
  具体ngx_upload_module配置参数,请参考官网。



user www www;
worker_processes  4;
error_log /*自定义路径*/nginx_error.log crit;
pid        /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections  65535;
}
http {
include       mime.types;
default_type  application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 20m;
sendfile on;
tcp_nopush     on;
keepalive_timeout 60;
tcp_nodelay on;
gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types       text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server {
listen      9000;
server_name  localhost;
location / {
index  index.html index.htm;
root /自定义路径;
}

location /PicUpload {
upload_pass /PicProccess;
upload_store /*自定义路径*/ 1;
upload_store_access user:r;
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_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 "^uid$|^thumb$";  #指定用户ID与缩略图尺寸,例如100x100
upload_cleanup 400 404 499 500-505;  #遇到这些码,就清除上传内容。
}
location /VoiceUpload {
upload_pass /VoiceProccess;
upload_store /*自定义路径*/ 1;
upload_store_access user:r;
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_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 "^uid$";  #post带uid域
upload_cleanup 400 404 499 500-505;
}
location /PicProccess {
proxy_pass http://127.0.0.1:9020/PicUpload;
        }
location /VoiceProccess {
proxy_pass http://127.0.0.1:9020/VoiceUpload;
        }
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   /自定义路径;
}
log_format access '$remote_addr - $remote_user[$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"'
'$http_user_agent" $http_x_forwarded_for';
access_log /日志路径/nginx_access.log access;
}
}
  4、 创建upload_store 存储位置。
  由于ngx_upload_module是散列存储,所以子目录需要包含 0 1 2 3 4 5 6 7 8 9 十个目录。
  具体可参考http://www.grid.net.ru/nginx/upload.en.html
  5、开源Github地址
  https://github.com/vovolie/nginx_upload
  十分简单的代码,可随意修改。
  目录结构
  bin : 包括Daemon守护进程,wsgiServer.py主程序。
  conf:日志配置与程序配置文件。
  log:日志存放位置。
  test:post测试的小程序。
  6、安装varnish,如果是同一台服务器,需指定不同的端口,在conf配置文件中进行修改返回的地址。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-90797-1-1.html 上篇帖子: Nginx支持TCP负载均衡 下篇帖子: Nginx学习笔记(七) 创建子进程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表