Nginx+Nodejs搭建图片服务器
图片上传请求由Node处理,图片访问请求由Nginx处理。
1、Nginx配置
- #user nobody;
- worker_processes 1;
- #error_log logs/error.log;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- #pid logs/nginx.pid;
- events {
- worker_connections 1024;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"';
- #access_log logs/access.log main;
- sendfile on;
- tcp_nopush on;
- sendfile_max_chunk 256K;
- #keepalive_timeout 0;
- keepalive_timeout 65;
- #gzip on;
- upstream localhost {
- server localhost:3000;#node服务器
- }
- server {
- listen 80;
- server_name localhost;
- #开启索引功能
- autoindex on;
- #关闭计算文件确切大小
- autoindex_exact_size off;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- #上传操作由node服务器处理
- location / {
- proxy_pass http://localhost;
- index index.html;
- }
- #映射图片访问url
- location /image/ {
- expires 30d;#缓存时间
- root E:/Study/nginx/nginx-1.7.6/files;
- }
- #error_page 404 /404.html;
- # redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
- #location ~ \.php$ {
- # proxy_pass http://127.0.0.1;
- #}
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1:9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all;
- #}
- }
- # another virtual host using mix of IP-, name-, and port-based configuration
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- # HTTPS server
- #
- #server {
- # listen 443 ssl;
- # server_name localhost;
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
- # ssl_session_cache shared:SSL:1m;
- # ssl_session_timeout 5m;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- }
2、nodejs项目架构
1)项目结构图
2)bin/www 是启动脚本
- #!/usr/bin/env node
- var debug = require('debug')('file-server');
- var app = require('../app');
- app.set('port', process.env.PORT || 3000);
- var server = app.listen(app.get('port'), function() {
- console.log('Express server listening on port ' + server.address().port);
- debug('Express server listening on port ' + server.address().port);
- });
3)config/setting.json 是程序中用的一些常量以json格式配置
- {
- "image_url":"http://localhost/image",
- "image_dir":"E:/Study/nginx/nginx-1.7.6/files/image",
- "tmp_dir":"E:/Study/nginx/nginx-1.7.6/tmp"
- }
4)controller/file-ctrl.js 是文件上传的处理代码
- var fs = require('fs');
- var path = require('path');
- var formidable = require('formidable');
- var util = require('util');
- var fs = require('fs');
- var path = require('path');
- var setting = require('../config/setting.json');
- /**
- * 上传
- */
- exports.upload = function(req,res){
- var form = new formidable.IncomingForm();
- form.encoding = 'utf-8';
- //如果需要临时文件保持原始文件扩展名,设置为true
- form.keepExtensions = false;
- //文件大小限制,默认2MB
- form.maxFieldsSize = 2 * 1024 * 1024;
- //图片存放目录
- var imageDir = setting.image_dir;
- //上传临时目录
- var tmpDir = setting.tmp_dir;
- form.uploadDir = tmpDir;//目录需要已存在
- /**
- * fields 表单中的其他属性
- * files 文件集合
- */
- form.parse(req, function(err, fields, files) {
- //图片完整路径
- var imagePath = path.resolve(imageDir, files.file.name);
- //将临时目录中的图片移动到图片存放目录下
- fs.rename(files.file.path,imagePath,function(err){
- if(err) {
- res.json({'success':false,'msg':err});
- }else{
- var image_url = setting.image_url+'/'+files.file.name;
- res.json({'success':true,'msg':'上传成功!','image_url':image_url});
- //res.json({'success':true,'msg':'上传成功!','image_url':image_url,'fields':util.inspect({fields: fields, files: files})});
- }
- });
- });
- }
- /**
- * 下载
- */
- exports.download = function(req,res){
- var filename = req.params.filename;
- var dir = setting.file_dir;
- var file_path = path.resolve(dir,filename);
- fs.exists(file_path,function(exists) {
- if(!exists) {
- res.json({'success':false,'msg':'文件不存在!'});
- }else{
- res.download(file_path,function(err){
- if(err) {
- res.json({'success':false,'msg':err});
- }
- });
- }
- });
- }
5)routes/route.js 是整个项目的路由控制
- var express = require('express');
- var router = express.Router();
- var file_ctrl = require('../controller/file-ctrl')
- /**上传文件*/
- router.post('/upload',file_ctrl.upload);
- module.exports = router;
6)app.js 是项目的全局配置
- var express = require('express');
- var path = require('path');
- var favicon = require('static-favicon');
- var logger = require('morgan');
- var cookieParser = require('cookie-parser');
- var bodyParser = require('body-parser');
- var routes = require('./routes/route');
- var app = express();
- // view engine setup
- app.set('views', path.join(__dirname, 'views'));
- app.set('view engine', 'jade');
- app.use(favicon());
- app.use(logger('dev'));
- app.use(bodyParser.json());
- app.use(bodyParser.urlencoded());
- app.use(cookieParser());
- app.use(express.static(path.join(__dirname, 'public')));
- app.use('/', routes);
- /// catch 404 and forward to error handler
- app.use(function(req, res, next) {
- var err = new Error('Not Found');
- err.status = 404;
- next(err);
- });
- /// error handlers
- // development error handler
- // will print stacktrace
- if (app.get('env') === 'development') {
- app.use(function(err, req, res, next) {
- res.status(err.status || 500);
- res.render('error', {
- message: err.message,
- error: err
- });
- });
- }
- // production error handler
- // no stacktraces leaked to user
- app.use(function(err, req, res, next) {
- res.status(err.status || 500);
- res.render('error', {
- message: err.message,
- error: {}
- });
- });
- module.exports = app;
6)package.json 是依赖包管理
- {
- "name": "file-server",
- "version": "0.0.1",
- "private": true,
- "scripts": {
- "start": "node ./bin/www"
- },
- "dependencies": {
- "express": "~4.2.0",
- "static-favicon": "~1.0.0",
- "morgan": "~1.0.0",
- "cookie-parser": "~1.0.1",
- "body-parser": "~1.0.0",
- "debug": "~0.7.4",
- "jade": "~1.3.0",
- "formidable":"*"
- }
- }
项目用到了expressjs框架。
3、简单写一个html上传页面
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>upload</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- <form action="http://localhost/upload" method="post" enctype="multipart/form-data">
- <input type="file" name="file">
- <p>
- <input type="submit" value="上传">
- </form>
- </body>
- </html>
4、启动node服务器和Nginx服务器
进入项目根目录,执行 node bin\www 或 npm start (这个是在package.json中配置的脚本命令"scripts")
5、测试
1)上传图片
2)上传成功
3)直接访问image_url就可以看到图片了
Nginx+Nodejs搭建图片服务器的更多相关文章
- nginx+ftp搭建图片服务器(Windows Server服务器环境下)
几种图片服务器的对比 1.直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg 不采用这种方式,不安全容易暴露ftp账户信息 2.直接使 ...
- 使用nodejs搭建图片服务器(一)
背景 当我们开发一个Web项目的时候,为了将图片管理与web服务分离开,通常都会搭建一个图片服务器. 之所以选择nodejs是因为使用nodejs来搭建web项目相当简单而且快速,虽然这个图片服务器很 ...
- Nginx+vsftpd搭建图片服务器
安装Nginx 参考:http://www.cnblogs.com/idefav2010/p/nginx-concat.html Nginx配置文件 location ~ .*\.(gif|jpg|j ...
- Nginx 搭建图片服务器
Nginx 搭建图片服务器 本章内容通过Nginx 和 FTP 搭建图片服务器.在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd. Nginx 安装:http://www ...
- Nginx搭建图片服务器
Nginx搭建图片服务器 标签(空格分隔): linux,nginx Nginx常用命令 ./nginx 启动 ./nginx -s reload 重载配置文件 ./nginx -s stop|sta ...
- nginx 搭建图片服务器(windows 下,linux 下原理应该一样)
作者的心声:很多知道的.用过的东西,不写下来,下次还要百度查询,浪费时间和精力,故本次写下学习笔记,方便下次查阅. 题外话:如有读者通过我这篇博客解决了工作上的难题,可以给个评论,让我一起分享你的喜悦 ...
- Nginx,Nginx 搭建图片服务器
Nginx Nginx 概述 反向代理 工作流程 优点 1:保护了真实的web服务器,保证了web服务器的资源安全 2:节约了有限的IP地址资源 3:减少WEB服务器压力,提高响应速度 4:其他优点 ...
- 二、nginx搭建图片服务器
接上篇:Nginx安装手册 cd /usr/local/nginx/conf/ 配置图片服务器 方法一.在配置文件server{}中location /{} 修改配置: #默认请求 location ...
- web前端效率提升-nginx+nodejs搭建本地生态
1.起因 编写的项目是一个偏向于后台管理的web系统,使用了angular框架,在绑定数据的时候就依赖于后台的接口格式. 以前是后台写好接口后,我在绑定,在这之前一些逻辑是没法做的,有时候后台接口给的 ...
随机推荐
- minicom的安装与配置
分类: LINUX 如果项目中使用的bootloader为 u-boot,那么在用minicom向目标板传送kernel时 会发生一些错误.故若您使用的是u-boot,建议您使用kermit, ...
- WIN7安装及配置JDK
1:什么是JDK? JDK是Java Development Kit 的简称,即Java开发工具包.JDK是ORACLE公司针对Java开发者的产品,提供了Java的开发环境和运行环境. 更多信息参看 ...
- vbs常用代码
在网上查找资料的时候发现好多经典的vbs代码收集起来也为了以后学习. VBS播放音乐 Dim wmp Set wmp = CreateObject("WMPlayer.OCX") ...
- php大力力 [045节] 兄弟连高洛峰 PHP教程 2014年[已发布,点击下载]
http://www.verycd.com/topics/2843130/ 第1部分 WEB开发入门篇第1章LAMP网站构建1.[2014]兄弟连高洛峰 PHP教程1.1.1 新版视频形式介绍[已发布 ...
- 不能将 Null 值赋给类型为 (不可为 null 的值类型)的成员。解决方法
一般代码没有错,是对应的数据库里有的字段是NULL,不是主键,主键肯定不会是NULL的.是其他字段. 把这些列的NULL赋值.
- asp.net 动态添加自定义控件
前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...
- js 实现继承相关
☊ [要求]:实现一个Animal类, 和一个继承它的Dog类 ☛ [实现]: function Animal(name) { this.name = name; } Animal.prototype ...
- Linux TC流量控制HOWTO中文版
<本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...
- PAT (Basic Level) Practise:1032. 挖掘机技术哪家强
[题目链接] 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行 ...
- python数据结构与算法——图的最短路径(Floyd-Warshall算法)
使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...