一、需要的组件

图片服务器两个服务:



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上传到服务器。

        nginx传输文件和ftp传输文件 nginx ftp服务器_nginx传输文件和ftp传输文件

        在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/

        nginx传输文件和ftp传输文件 nginx ftp服务器_nginx传输文件和ftp传输文件_02


        2、nginx运行



        2.1、启动nginx


        [java]  view plain  copy




        1. [root@localhost nginx]# cd sbin  
        2. [root@localhost sbin]# ./nginx

        nginx传输文件和ftp传输文件 nginx ftp服务器_nginx_03


        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服务

        nginx传输文件和ftp传输文件 nginx ftp服务器_nginx_04

        顺便给新手推荐一个无意中发现的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的主动、被动模式修改:

            菜单:编辑→设置


            nginx传输文件和ftp传输文件 nginx ftp服务器_java_05


            5、关闭匿名访问

            修改/etc/vsftpd/vsftpd.conf文件:

            nginx传输文件和ftp传输文件 nginx ftp服务器_java_06

            重启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();
                    }
                }
            }