图片上传请求由Node处理,图片访问请求由Nginx处理。

1、Nginx配置

  1. #user nobody;
  2. worker_processes 1;
  3.  
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7.  
  8. #pid logs/nginx.pid;
  9.  
  10. events {
  11. worker_connections 1024;
  12. }
  13.  
  14. http {
  15. include mime.types;
  16. default_type application/octet-stream;
  17.  
  18. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  19. # '$status $body_bytes_sent "$http_referer" '
  20. # '"$http_user_agent" "$http_x_forwarded_for"';
  21.  
  22. #access_log logs/access.log main;
  23.  
  24. sendfile on;
  25. tcp_nopush on;
  26. sendfile_max_chunk 256K;
  27.  
  28. #keepalive_timeout 0;
  29. keepalive_timeout 65;
  30.  
  31. #gzip on;
  32.  
  33. upstream localhost {
  34. server localhost:3000;#node服务器
  35. }
  36.  
  37. server {
  38. listen 80;
  39. server_name localhost;
  40.  
  41. #开启索引功能
  42. autoindex on;
  43.  
  44. #关闭计算文件确切大小
  45. autoindex_exact_size off;
  46.  
  47. #charset koi8-r;
  48.  
  49. #access_log logs/host.access.log main;
  50.  
  51. #上传操作由node服务器处理
  52. location / {
  53. proxy_pass http://localhost;
  54. index index.html;
  55. }
  56.  
  57. #映射图片访问url
  58. location /image/ {
  59. expires 30d;#缓存时间
  60. root E:/Study/nginx/nginx-1.7.6/files;
  61. }
  62.  
  63. #error_page 404 /404.html;
  64.  
  65. # redirect server error pages to the static page /50x.html
  66. #
  67. error_page 500 502 503 504 /50x.html;
  68. location = /50x.html {
  69. root html;
  70. }
  71.  
  72. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  73. #
  74. #location ~ \.php$ {
  75. # proxy_pass http://127.0.0.1;
  76. #}
  77.  
  78. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  79. #
  80. #location ~ \.php$ {
  81. # root html;
  82. # fastcgi_pass 127.0.0.1:9000;
  83. # fastcgi_index index.php;
  84. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  85. # include fastcgi_params;
  86. #}
  87.  
  88. # deny access to .htaccess files, if Apache's document root
  89. # concurs with nginx's one
  90. #
  91. #location ~ /\.ht {
  92. # deny all;
  93. #}
  94. }
  95.  
  96. # another virtual host using mix of IP-, name-, and port-based configuration
  97. #
  98. #server {
  99. # listen 8000;
  100. # listen somename:8080;
  101. # server_name somename alias another.alias;
  102.  
  103. # location / {
  104. # root html;
  105. # index index.html index.htm;
  106. # }
  107. #}
  108.  
  109. # HTTPS server
  110. #
  111. #server {
  112. # listen 443 ssl;
  113. # server_name localhost;
  114.  
  115. # ssl_certificate cert.pem;
  116. # ssl_certificate_key cert.key;
  117.  
  118. # ssl_session_cache shared:SSL:1m;
  119. # ssl_session_timeout 5m;
  120.  
  121. # ssl_ciphers HIGH:!aNULL:!MD5;
  122. # ssl_prefer_server_ciphers on;
  123.  
  124. # location / {
  125. # root html;
  126. # index index.html index.htm;
  127. # }
  128. #}
  129.  
  130. }

2、nodejs项目架构

  1)项目结构图

  2)bin/www 是启动脚本

  1. #!/usr/bin/env node
  2. var debug = require('debug')('file-server');
  3. var app = require('../app');
  4.  
  5. app.set('port', process.env.PORT || 3000);
  6.  
  7. var server = app.listen(app.get('port'), function() {
  8. console.log('Express server listening on port ' + server.address().port);
  9. debug('Express server listening on port ' + server.address().port);
  10. });

  3)config/setting.json 是程序中用的一些常量以json格式配置

  1. {
  2. "image_url":"http://localhost/image",
  3. "image_dir":"E:/Study/nginx/nginx-1.7.6/files/image",
  4. "tmp_dir":"E:/Study/nginx/nginx-1.7.6/tmp"
  5. }

  4)controller/file-ctrl.js 是文件上传的处理代码

  1. var fs = require('fs');
  2. var path = require('path');
  3. var formidable = require('formidable');
  4. var util = require('util');
  5. var fs = require('fs');
  6. var path = require('path');
  7.  
  8. var setting = require('../config/setting.json');
  9.  
  10. /**
  11. * 上传
  12. */
  13. exports.upload = function(req,res){
  14.  
  15. var form = new formidable.IncomingForm();
  16. form.encoding = 'utf-8';
  17.  
  18. //如果需要临时文件保持原始文件扩展名,设置为true
  19. form.keepExtensions = false;
  20.  
  21. //文件大小限制,默认2MB
  22. form.maxFieldsSize = 2 * 1024 * 1024;
  23.  
  24. //图片存放目录
  25. var imageDir = setting.image_dir;
  26.  
  27. //上传临时目录
  28. var tmpDir = setting.tmp_dir;
  29.  
  30. form.uploadDir = tmpDir;//目录需要已存在
  31. /**
  32. * fields 表单中的其他属性
  33. * files 文件集合
  34. */
  35. form.parse(req, function(err, fields, files) {
  36.  
  37. //图片完整路径
  38. var imagePath = path.resolve(imageDir, files.file.name);
  39.  
  40. //将临时目录中的图片移动到图片存放目录下
  41. fs.rename(files.file.path,imagePath,function(err){
  42. if(err) {
  43. res.json({'success':false,'msg':err});
  44. }else{
  45. var image_url = setting.image_url+'/'+files.file.name;
  46. res.json({'success':true,'msg':'上传成功!','image_url':image_url});
  47. //res.json({'success':true,'msg':'上传成功!','image_url':image_url,'fields':util.inspect({fields: fields, files: files})});
  48. }
  49. });
  50. });
  51. }
  52.  
  53. /**
  54. * 下载
  55. */
  56. exports.download = function(req,res){
  57. var filename = req.params.filename;
  58. var dir = setting.file_dir;
  59. var file_path = path.resolve(dir,filename);
  60. fs.exists(file_path,function(exists) {
  61. if(!exists) {
  62. res.json({'success':false,'msg':'文件不存在!'});
  63. }else{
  64. res.download(file_path,function(err){
  65. if(err) {
  66. res.json({'success':false,'msg':err});
  67. }
  68. });
  69.  
  70. }
  71. });
  72. }

  5)routes/route.js 是整个项目的路由控制

  1. var express = require('express');
  2. var router = express.Router();
  3.  
  4. var file_ctrl = require('../controller/file-ctrl')
  5.  
  6. /**上传文件*/
  7. router.post('/upload',file_ctrl.upload);
  8.  
  9. module.exports = router;

  6)app.js 是项目的全局配置

  1. var express = require('express');
  2. var path = require('path');
  3. var favicon = require('static-favicon');
  4. var logger = require('morgan');
  5. var cookieParser = require('cookie-parser');
  6. var bodyParser = require('body-parser');
  7.  
  8. var routes = require('./routes/route');
  9.  
  10. var app = express();
  11.  
  12. // view engine setup
  13. app.set('views', path.join(__dirname, 'views'));
  14. app.set('view engine', 'jade');
  15.  
  16. app.use(favicon());
  17. app.use(logger('dev'));
  18. app.use(bodyParser.json());
  19. app.use(bodyParser.urlencoded());
  20. app.use(cookieParser());
  21. app.use(express.static(path.join(__dirname, 'public')));
  22.  
  23. app.use('/', routes);
  24.  
  25. /// catch 404 and forward to error handler
  26. app.use(function(req, res, next) {
  27. var err = new Error('Not Found');
  28. err.status = 404;
  29. next(err);
  30. });
  31.  
  32. /// error handlers
  33.  
  34. // development error handler
  35. // will print stacktrace
  36. if (app.get('env') === 'development') {
  37. app.use(function(err, req, res, next) {
  38. res.status(err.status || 500);
  39. res.render('error', {
  40. message: err.message,
  41. error: err
  42. });
  43. });
  44. }
  45.  
  46. // production error handler
  47. // no stacktraces leaked to user
  48. app.use(function(err, req, res, next) {
  49. res.status(err.status || 500);
  50. res.render('error', {
  51. message: err.message,
  52. error: {}
  53. });
  54. });
  55.  
  56. module.exports = app;

  6)package.json  是依赖包管理

  1. {
  2. "name": "file-server",
  3. "version": "0.0.1",
  4. "private": true,
  5. "scripts": {
  6. "start": "node ./bin/www"
  7. },
  8. "dependencies": {
  9. "express": "~4.2.0",
  10. "static-favicon": "~1.0.0",
  11. "morgan": "~1.0.0",
  12. "cookie-parser": "~1.0.1",
  13. "body-parser": "~1.0.0",
  14. "debug": "~0.7.4",
  15. "jade": "~1.3.0",
  16. "formidable":"*"
  17. }
  18. }

  项目用到了expressjs框架。

3、简单写一个html上传页面

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4.  
  5. <title>upload</title>
  6. <meta http-equiv="pragma" content="no-cache">
  7. <meta http-equiv="cache-control" content="no-cache">
  8. <meta http-equiv="expires" content="0">
  9. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  10. <meta http-equiv="description" content="This is my page">
  11. <!--
  12. <link rel="stylesheet" type="text/css" href="styles.css">
  13. -->
  14. </head>
  15.  
  16. <body>
  17. <form action="http://localhost/upload" method="post" enctype="multipart/form-data">
  18. <input type="file" name="file">
  19. <p>
  20. <input type="submit" value="上传">
  21. </form>
  22. </body>
  23. </html>

4、启动node服务器和Nginx服务器

  进入项目根目录,执行 node bin\www  或 npm start (这个是在package.json中配置的脚本命令"scripts")

5、测试

  1)上传图片

  2)上传成功

  

  3)直接访问image_url就可以看到图片了

Nginx+Nodejs搭建图片服务器的更多相关文章

  1. nginx+ftp搭建图片服务器(Windows Server服务器环境下)

    几种图片服务器的对比 1.直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg 不采用这种方式,不安全容易暴露ftp账户信息 2.直接使 ...

  2. 使用nodejs搭建图片服务器(一)

    背景 当我们开发一个Web项目的时候,为了将图片管理与web服务分离开,通常都会搭建一个图片服务器. 之所以选择nodejs是因为使用nodejs来搭建web项目相当简单而且快速,虽然这个图片服务器很 ...

  3. Nginx+vsftpd搭建图片服务器

    安装Nginx 参考:http://www.cnblogs.com/idefav2010/p/nginx-concat.html Nginx配置文件 location ~ .*\.(gif|jpg|j ...

  4. Nginx 搭建图片服务器

    Nginx 搭建图片服务器 本章内容通过Nginx 和 FTP 搭建图片服务器.在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd. Nginx 安装:http://www ...

  5. Nginx搭建图片服务器

    Nginx搭建图片服务器 标签(空格分隔): linux,nginx Nginx常用命令 ./nginx 启动 ./nginx -s reload 重载配置文件 ./nginx -s stop|sta ...

  6. nginx 搭建图片服务器(windows 下,linux 下原理应该一样)

    作者的心声:很多知道的.用过的东西,不写下来,下次还要百度查询,浪费时间和精力,故本次写下学习笔记,方便下次查阅. 题外话:如有读者通过我这篇博客解决了工作上的难题,可以给个评论,让我一起分享你的喜悦 ...

  7. Nginx,Nginx 搭建图片服务器

    Nginx Nginx 概述 反向代理 工作流程 优点 1:保护了真实的web服务器,保证了web服务器的资源安全 2:节约了有限的IP地址资源 3:减少WEB服务器压力,提高响应速度 4:其他优点 ...

  8. 二、nginx搭建图片服务器

    接上篇:Nginx安装手册 cd /usr/local/nginx/conf/ 配置图片服务器 方法一.在配置文件server{}中location /{} 修改配置: #默认请求 location ...

  9. web前端效率提升-nginx+nodejs搭建本地生态

    1.起因 编写的项目是一个偏向于后台管理的web系统,使用了angular框架,在绑定数据的时候就依赖于后台的接口格式. 以前是后台写好接口后,我在绑定,在这之前一些逻辑是没法做的,有时候后台接口给的 ...

随机推荐

  1. minicom的安装与配置

    分类: LINUX     如果项目中使用的bootloader为 u-boot,那么在用minicom向目标板传送kernel时 会发生一些错误.故若您使用的是u-boot,建议您使用kermit, ...

  2. WIN7安装及配置JDK

    1:什么是JDK? JDK是Java Development Kit 的简称,即Java开发工具包.JDK是ORACLE公司针对Java开发者的产品,提供了Java的开发环境和运行环境. 更多信息参看 ...

  3. vbs常用代码

    在网上查找资料的时候发现好多经典的vbs代码收集起来也为了以后学习. VBS播放音乐 Dim wmp Set wmp = CreateObject("WMPlayer.OCX") ...

  4. php大力力 [045节] 兄弟连高洛峰 PHP教程 2014年[已发布,点击下载]

    http://www.verycd.com/topics/2843130/ 第1部分 WEB开发入门篇第1章LAMP网站构建1.[2014]兄弟连高洛峰 PHP教程1.1.1 新版视频形式介绍[已发布 ...

  5. 不能将 Null 值赋给类型为 (不可为 null 的值类型)的成员。解决方法

    一般代码没有错,是对应的数据库里有的字段是NULL,不是主键,主键肯定不会是NULL的.是其他字段. 把这些列的NULL赋值.

  6. asp.net 动态添加自定义控件

    前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...

  7. js 实现继承相关

    ☊ [要求]:实现一个Animal类, 和一个继承它的Dog类 ☛ [实现]: function Animal(name) { this.name = name; } Animal.prototype ...

  8. Linux TC流量控制HOWTO中文版

    <本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...

  9. PAT (Basic Level) Practise:1032. 挖掘机技术哪家强

    [题目链接] 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行 ...

  10. python数据结构与算法——图的最短路径(Floyd-Warshall算法)

    使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...