【转】nginx+ftp搭建图片服务器(Windows Server服务器环境下)


几种图片服务器的对比
1、直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg
不采用这种方式,不安全容易暴露ftp账户信息
2、直接使用IIS或Tomcat等服务器在项目中访问,图片少的情况可以考虑。商城网站则不行,图片访问处理需搭建图片服务器
3、ftp+nginx服务器,ftp负责上传图片,nginx负责图片的访问
 
一、需要的组件
1、ftp服务器(图片上传,本文选用IIS为容器)
ps Linux操作系统  可安装 vsftpd作为服务器
2、nginx服务器
a、http服务:可以使用nginx做静态资源服务器。也可以使用apache。推荐使用nginx,效率更高。
b 、反向代理 实现 负载均衡
 
二、nginx服务器的部署
nginx下载地址  http://nginx.org/en/download.html
 解压安装包,免安装运行
 
nginx cmd命令
start nginx //启动nginx
nginx -s stop // 停止nginx
nginx -s reload // 重新加载配置文件
nginx -s quit // 退出nginx
nginx -t //检查配置文件是否正确
         nginx -v //查看nginx版本号
 
1、配置端口号和访问路径
conf目录下的   nginx.conf 配置文件
 
修改端口号 为9090 
启动nginx   回到nginx文件夹根目录,按住shift键点击鼠标右键,选择右键菜单中的在此处打开命令窗口,输入start nginx 命令
 成功访问
 
 
2、添加图片服务访问配置
1
2
3
4
location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {
             #默认的图片路径,也是ftp上传文件存放的路径,只要后缀是以上的都会到这个路径下搜索
         root         C:/imgextra;    
}

  

 
 
添加完成以后在cmd中执行  nginx -s reload 重新加载配置使其生效
图片文件所在路径 

 访问成功
 
3、图片存放路径分析
先来看看大型商城的图片路径
天猫图片存储
https://gdp.alicdn.com/imgextra/i2/1856815898/TB2QxuMuHBnpuFjSZFGXXX51pXa_!!1856815898.jpg
京东图片存储
https://img30.360buyimg.com/sku/jfs/t4816/236/2599170601/86961/b24bbc4/5902ff58Nc4ceea7c.jpg
当当图片存储
http://img3x5.ddimg.cn/19/20/1206933175-1_x_6.jpg
 
分析发现几乎都采用CDN和单独的域名来作为独立的图片服务器,目的是为了减少业务服务器的并发访问量。
关于图片服务器架构介绍戳这里   
http://blog.csdn.net/dinglang_2009/article/details/31450731
 
 
三、FTP服务的安装与使用介绍
1、windows中安装使用FTP服务器请参考
http://blog.csdn.net/w1014074794/article/details/52075285
 
2、java上传文件到FTP服务器工具类
所需jar包     commons-net-1.4.1.jar
http://files.cnblogs.com/files/cczheng-666/commons-net-1.4.1.zip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileNotFoundException;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.OutputStream;
 
import  org.apache.commons.net.ftp.FTP;
import  org.apache.commons.net.ftp.FTPClient;
import  org.apache.commons.net.ftp.FTPFile;
import  org.apache.commons.net.ftp.FTPReply;
 
public  class  FtpUtil {
 
     /**
      * Description: 向FTP服务器上传文件
      * @param host FTP服务器hostname
      * @param port FTP服务器端口
      * @param username FTP登录账号
      * @param password FTP登录密码
      * @param basePath FTP服务器基础目录,需要绝对路径 比如:/home/ftpuser/www/images
      * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
      * @param filename 上传到FTP服务器上的文件名
      * @param input 输入流
      * @return 成功返回true,否则返回false
      */ 
     public  static  boolean  uploadFile(String host,  int  port, String username, String password, String basePath,
             String filePath, String filename, InputStream input) {
         boolean  result =  false ;
         FTPClient ftp =  new  FTPClient();
         try  {
             int  reply;
             ftp.connect(host, port); // 连接FTP服务器
             // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
             ftp.login(username, password); // 登录
             reply = ftp.getReplyCode();
             if  (!FTPReply.isPositiveCompletion(reply)) {
                 ftp.disconnect();
                 return  result;
             }
             //切换到上传目录
             if  (!ftp.changeWorkingDirectory(basePath+filePath)) {
                 //如果目录不存在创建目录
                 String[] dirs = filePath.split( "/" );
                 String tempPath = basePath;
                 for  (String dir : dirs) {
                     if  ( null  == dir ||  "" .equals(dir))  continue ;
                     tempPath +=  "/"  + dir;
                     if  (!ftp.changeWorkingDirectory(tempPath)) {
                         if  (!ftp.makeDirectory(tempPath)) {
                             return  result;
                         else  {
                             ftp.changeWorkingDirectory(tempPath);
                         }
                     }
                 }
             }
             //设置上传文件的类型为二进制类型
             ftp.setFileType(FTP.BINARY_FILE_TYPE);
             //上传文件
             if  (!ftp.storeFile(filename, input)) {
                 return  result;
             }
             input.close();
             ftp.logout();
             result =  true ;
         catch  (IOException e) {
             e.printStackTrace();
         finally  {
             if  (ftp.isConnected()) {
                 try  {
                     ftp.disconnect();
                 catch  (IOException ioe) {
                 }
             }
         }
         return  result;
     }
     
     /**
      * Description: 从FTP服务器下载文件
      * @param host FTP服务器hostname
      * @param port FTP服务器端口
      * @param username FTP登录账号
      * @param password FTP登录密码
      * @param remotePath FTP服务器上的相对路径
      * @param fileName 要下载的文件名
      * @param localPath 下载后保存到本地的路径
      * @return
      */ 
     public  static  boolean  downloadFile(String host,  int  port, String username, String password, String remotePath,
             String fileName, String localPath) {
         boolean  result =  false ;
         FTPClient ftp =  new  FTPClient();
         try  {
             int  reply;
             ftp.connect(host, port);
             // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
             ftp.login(username, password); // 登录
             reply = ftp.getReplyCode();
             if  (!FTPReply.isPositiveCompletion(reply)) {
                 ftp.disconnect();
                 return  result;
             }
             ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录
             FTPFile[] fs = ftp.listFiles();
             for  (FTPFile ff : fs) {
                 if  (ff.getName().equals(fileName)) {
                     File localFile =  new  File(localPath +  "/"  + ff.getName());
 
                     OutputStream is =  new  FileOutputStream(localFile);
                     ftp.retrieveFile(ff.getName(), is);
                     is.close();
                 }
             }
 
             ftp.logout();
             result =  true ;
         catch  (IOException e) {
             e.printStackTrace();
         finally  {
             if  (ftp.isConnected()) {
                 try  {
                     ftp.disconnect();
                 catch  (IOException ioe) {
                 }
             }
         }
         return  result;
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值