一、需要的组件
图片服务器两个服务:
Nginx(图片访问):
1、http服务:可以使用nginx做静态资源服务器。也可以使用apache。推荐使用nginx,效率更高。
2、反向代理 实现 负载均衡
ftp服务(图片上传):
使用linux做服务器,在linux中有个ftp组件vsftpd。
二、Nginx服务器搭建
1.安装Nginx
要求安装vmware虚拟机。
Linux:CentOS6.4(32)
Nginx:1.8.0
Vsftpd:需要在线安装。
虚拟机以及Linux安装很简单此处略。
Linux的局域网IP为:192.168.1.110
修改Linux的IP并立即生效的命令:
[java] view plain copy
1. #切换root管理员用户
2. [root@localhost ~]# su
3. password
4. #设置本机IP并立即生效
5. [root@localhost ~]# ifconfig eth0 192.168.1.110 netmask 255.255.255.0
1.1、nginx安装环境
nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境。
n gcc
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++
n PCRE
PCRE(PerlCompatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
[java] view plain copy
1. [root@localhost ~]#yum install -y pcre pcre-devel
注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
n zlib
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
[java] view plain copy
1. [root@localhost ~]#yum install -y zlib zlib-devel
n openssl
OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
[java] view plain copy
1. [root@localhost ~]#yum install -y openssl openssl-devel
1.2、把nginx安装包nginx-1.8.0.tar.gz上传到服务器。
在secureCRT打开sftp会话框,上传文件
使用put/get命令 或者直接拖拽文件
1.3、解压缩(在安装包所在目录执行)
[java] view plain copy
1. [root@localhost ~]# tar -zxvf nginx-1.8.0.tar.gz
在root@bogon nginx-1.8.0目录下
./configure && make && make install //在这里吃过亏
1.5、编译安装
编译:
[java] view plain copy
1. [root@localhost nginx-1.8.0]# make
安装:
[java] view plain copy
1. [root@localhost nginx-1.8.0]# make install
安装成功以后进入安装目录(创建makedir时指定的”--prefix=/usr/local/nginx \“)
[java] view plain copy
1. [root@localhost nginx-1.8.0]# cd /usr/local/nginx/
2、nginx运行
2.1、启动nginx
[java] view plain copy
1. [root@localhost nginx]# cd sbin
2. [root@localhost sbin]# ./nginx
2.2、关闭
[java] view plain copy
1. [root@localhost sbin]# ./nginx -s stop
2.3、重新加载配置文件
[java] view plain copy
1. [root@localhost sbin]# ./nginx -s reload
2.4、关闭防火墙
[java] view plain copy
1. [root@localhost ]# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
2. [root@localhost ]# /etc/init.d/iptables save
3. [root@localhost ]# /etc/init.d/iptables restart
2.5、访问nginx服务
顺便给新手推荐一个无意中发现的Java网站,感觉超级适合入门级的Java开发,
基础知识写的挺好,练手项目也很丰富很,基本都是文档形式指导,简明易懂,不像视频一样费时间。
地址是http://how2j.cn?p=24192
3、关于图片服务器配置
进入配置文件目录
[java] view plain copy
1. cd /usr/local/nginx/conf/
nginx的默认配置文件nginx.config
[java] view plain copy
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.
11. events {
12. 1024;
13. }
14.
15.
16. http {
17. include mime.types;
18. default_type application/octet-stream;
19.
20. '$remote_addr - $remote_user [$time_local] "$request" '
21. '$status $body_bytes_sent "$http_referer" '
22. '"$http_user_agent" "$http_x_forwarded_for"';
23.
24. #access_log logs/access.log main;
25.
26. sendfile on;
27. #tcp_nopush on;
28.
29. 0;
30. 65;
31.
32. #gzip on;
33.
34. server {
35. 80;
36. server_name localhost;
37.
38. #charset koi8-r;
39.
40. #access_log logs/host.access.log main;
41.
42. location / {
43. root html;
44. index index.html index.htm;
45. }
46.
47. 404 /404.html;
48.
49. static page /50x.html
50. #
51. 500 502 503 504 /50x.html;
52. location = /50x.html {
53. root html;
54. }
55.
56. 127.0.0.1:80
57. #
58. #location ~ \.php$ {
59. //127.0.0.1;
60. #}
61.
62. 127.0.0.1:9000
63. #
64. #location ~ \.php$ {
65. # root html;
66. 127.0.0.1:9000;
67. # fastcgi_index index.php;
68. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
69. # include fastcgi_params;
70. #}
71.
72. if Apache's document root
73. # concurs with nginx's one
74. #
75. #location ~ /\.ht {
76. # deny all;
77. #}
78. }
79.
80.
81. # another virtual host using mix of IP-, name-, and port-based configuration
82. #
83. #server {
84. 8000;
85. 8080;
86. # server_name somename alias another.alias;
87.
88. # location / {
89. # root html;
90. # index index.html index.htm;
91. # }
92. #}
93.
94.
95. # HTTPS server
96. #
97. #server {
98. 443 ssl;
99. # server_name localhost;
100.
101. # ssl_certificate cert.pem;
102. # ssl_certificate_key cert.key;
103.
104. # ssl_session_cache shared:SSL:1m;
105. # ssl_session_timeout 5m;
106.
107. # ssl_ciphers HIGH:!aNULL:!MD5;
108. # ssl_prefer_server_ciphers on;
109.
110. # location / {
111. # root html;
112. # index index.html index.htm;
113. # }
114. #}
115.
116. }
配置图片服务器
方法一、在配置文件server{}中location /{} 修改配置:
[java] view plain copy
1. #默认请求
2. location / {
3. root /home/ftpuser/www;#定义服务器的默认网站根目录位置
4. index index.html index.php index.htm;#定义首页索引文件的名称
5. }
其中:/home/ftpuser/www;为创建FTP服务账户ftpuser的根目录下的www目录
方法二、在http{}内配置新服务
[java] view plain copy
1. server {
2. 8080;
3. server_name localhost;
4.
5. 8;
6.
7. #access_log logs/host.access.log main;
8.
9. #默认请求
10. location / {
11. root /home/ftpuser/www;#定义服务器的默认网站根目录位置
12. index index.html index.php index.htm;#定义首页索引文件的名称
13. }
14. }
因为需要开始端口号8080,所以要在防火墙中开启8080端口
[java] view plain copy
1. [root@localhost ]# /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
2. [root@localhost ]# /etc/init.d/iptables save
3. [root@localhost ]# /etc/init.d/iptables restart
三、FTP服务的安装与启动
1、安装vsftpd组件
vsftpd组件为Linux的FTP服务组件,安装方式为在线安装。
[root@localhost ~]# yum -y install vsftpd
安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件。
2、添加一个ftp用户
此用户就是用来登录ftp服务器用的。
[java] view plain copy
1. [root@localhost ~]# useradd ftpuser
这样一个用户建完,可以用这个登录,记得用普通登录不要用匿名了。登录后默认的路径为 /home/ftpuser.
为这个ftp账户添加密码
[java] view plain copy
1. [root@localhost ~]# passwd ftpuser
输入两次密码后修改密码。
3、 防火墙开启21端口
因为ftp默认的端口为21,而centos默认是没有开启的,所以要修改iptables文件
[root@localhost ~]# vim /etc/sysconfig/iptables
在行上面有22 -j ACCEPT 下面另起一行输入跟那行差不多的,只是把22换成21,然后:wq保存。
还要运行下,重启iptables
[java] view plain copy
1. [root@localhost ~]# service iptables restart
4、 修改selinux
外网是可以访问上去了,可是发现没法返回目录(使用ftp的主动模式,被动模式还是无法访问),也上传不了,因为selinux作怪了。
修改selinux:
执行以下命令查看状态:
[root@localhost ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
执行上面命令,再返回的结果看到两行都是off,代表,没有开启外网的访问
1. @localhost ~]
# setsebool -P allow_ftpd_full_access on
2.
1. @localhost ~]
# setsebool -P ftp_home_dir on
这样应该没问题了(如果,还是不行,看看是不是用了ftp客户端工具用了passive模式访问了,如提示Entering Passive mode,就代表是passive模式,默认是不行的,因为ftp passive模式被iptables挡住了,下面会讲怎么开启,如果懒得开的话,就看看你客户端ftp是否有port模式的选项,或者把passive模式的选项去掉。如果客户端还是不行,看看客户端上的主机的电脑是否开了防火墙,关吧)
FileZilla的主动、被动模式修改:
菜单:编辑→设置
5、关闭匿名访问
修改/etc/vsftpd/vsftpd.conf文件:
重启ftp服务:
[root@localhost ~]# service vsftpd restart
6、 开启被动模式
默认是开启的,但是要指定一个端口范围,打开vsftpd.conf文件,在后面加上
1.
2.
pasv_max_port=
30999
表示端口范围为30000~30999,这个可以随意改。改完重启一下vsftpd
由于指定这段端口范围,iptables也要相应的开启这个范围,所以像上面那样打开iptables文件。
也是在21上下面另起一行,更那行差不多,只是把21 改为30000:30999,然后:wq保存,重启下iptables。这样就搞定了。
7、设置开机启动vsftpd ftp服务
[root@localhost ~]# chkconfig vsftpd on
四、部署验证
在www下新建文件夹images,下面放一张图片001.jpg
测试访问:http://192.168.1.110/images/001.jpg
楼主搭建过程遇到的问题:
1:ftp上传的文件,不在指定目录内?
原因:可能指定的目录文件夹权限不够,通过chmod 进行权限的分配
2:通过nginx访问不到图片?
需要修改nginx.conf 的第一行 user nobody 修改为root或者ftp的用户名;
文章为转载,通过这篇文章,成功搭建起来,java后台测试通过,如有哪里不对,请指正!
Java测试代码:
public class TextFtpIamge {
private final static Log logger = LogFactory.getLog(TextFtpIamge.class);
public static void main(String[] args) throws Exception {
String ftpHost= "192.168.81.53"; //ftp服务器地址
int ftpPort = 21;//ftp服务员器端口号
String ftpUserName = "ftpuser";//anonymous匿名用户登录,不需要密码。administrator指定用户登录
String ftpPassword = "ftpuser";//指定用户密码
String ftpPath = "/home/ftpuser/images/aa"; //ftp文件存放物理路径
String filePath=""; //文件路径
String fileName="";//文件名称
// filePath="E:\\";
// fileName="1.jpg";
// downloadFile(ftpHost, ftpUserName, ftpPassword, ftpPort,
// ftpPath, filePath, fileName);
filePath="C:\\Users\\admin\\Desktop";
fileName="1.jpg";
FileInputStream input=new FileInputStream(new File(filePath+File.separatorChar+fileName));
uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName, input);
}
/**
* 获取FTPClient对象
*
* @param ftpHost
* FTP主机服务器
* @param ftpPassword
* FTP 登录密码
* @param ftpUserName
* FTP登录用户名
* @param ftpPort
* FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
} catch (SocketException e) {
e.printStackTrace();
logger.info("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
logger.info("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 下载文件
*
* @param ftpHost ftp服务器地址
* @param ftpUserName anonymous匿名用户登录,不需要密码。administrator指定用户登录
* @param ftpPassword 指定用户密码
* @param ftpPort ftp服务员器端口号
* @param ftpPath ftp文件存放物理路径
* @param fileName 文件路径
* @param input 文件输入流,即从本地服务器读取文件的IO输入流
*/
public static void downloadFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath, String localPath,
String fileName) {
FTPClient ftpClient = null;
try {
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath);
File localFile = new File(localPath + File.separatorChar + fileName);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(fileName, os);
os.close();
ftpClient.logout();
} catch (FileNotFoundException e) {
logger.error("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
logger.error("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
logger.error("文件读取错误。");
e.printStackTrace();
}
}
/**
* 上传文件
*
* @param ftpHost ftp服务器地址
* @param ftpUserName anonymous匿名用户登录,不需要密码。administrator指定用户登录
* @param ftpPassword 指定用户密码
* @param ftpPort ftp服务员器端口号
* @param ftpPath ftp文件存放物理路径
* @param fileName 文件路径
* @param input 文件输入流,即从本地服务器读取文件的IO输入流
*/
public static void uploadFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath,
String fileName,InputStream input){
FTPClient ftp=null;
try {
ftp=getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftp.makeDirectory(ftpPath);//如果路径不存在,就创建
ftp.changeWorkingDirectory(ftpPath);//转到指定上传路径
//ftp 默认是iso-8859-1编码,防止中文乱码
fileName=new String(fileName.getBytes("GBK"),"iso-8859-1");
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//fileName 上传到服务器文件名称
ftp.storeFile(fileName, input);
input.close();
ftp.logout();
System.out.println("upload succes!");
} catch (Exception e) {
e.printStackTrace();
}
}
}