nginx和vsftpd搭建图片服务器。

10 篇文章 0 订阅

前面已经安装了vsftpd服务:Vsftpd的安装和配置。现在再安装一个nginx服务器,配合起来就能够完成一个简易的图片服务器。nginx服务器之前也研究过,但是没有做什么笔记也都全忘了,事实证明不能太相信自己的记忆,好记性不如烂笔头。


nginx的安装。

本人使用的ubuntu系统,安装nginx比较简单,但是nginx需要依赖几个额外的库,首先因为nginx编译2环境需要依赖gcc环境,所以需要首先安装gcc。

安装gcc:

sudo apt-get  build-dep  gcc  

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库,pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

安装pcre:

sudo apt-get install libpcre3 libpcre3-dev

zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

安装zlib:

sudo apt-get install zlib1g-dev

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

安装openssl:

sudo apt-get install openssl libssl-dev

同时这几个库都可以将其下载下来,然后手动编译安装,除了gcc之外的库下载地址如下:

下载prce:https://ftp.pcre.org/pub/pcre/
prce:https://ftp.pcre.org/pub/pcre/pcre2-10.30.tar.gz
zlib:http://www.zlib.net/zlib-1.2.11.tar.gz
openssl:https://www.openssl.org/source/openssl-1.1.1-pre1.tar.gz

安装完上面的几个库之后就可以安装nginx了,首先需要将nginx的源码包下载下来,下载地址为:

nginx:http://nginx.org/download/nginx-1.13.6.tar.gz

下载完成之后将其解压,解压完成进入目录,可以直接执行./configure进行编译,也可以在编译的时候指定一些参数,其他的参数可以参考:linux ./configure 的参数详解。默认的安装目录为/usr/local/nginx。

如果上述的几个库没有安装好的话,在编译的过程中可能会提示没有找到这个依赖库。

编译完成之后就可以使用make&make install进行安装。

然后进入nginx下的sbin目录,执行./nginx即可启动,默认使用80端口,在浏览器中输入ip地址,当出现如下界面,说明安装成功。

这里写图片描述


修改nginx配置。

当成功安装nginx之后,所看到的界面时在nginx目录下的html中,nginx相关的配置文件在conf下,主要时修改nginx.conf这个文件。

假如想将上传的图片放入/opt/images这个目录下,需要在nginx.conf中在配置一个location:

这里写图片描述

添加这个配置之后,当有url为/images/的时候就会前去/opt这个目录下查找,这里需要注意的是root对应的目录不要写错了,如果写成/opt/iamges,那么当url为/iamges/时就会查找/opt/iamges/images/这个目录,显然是不正确的;所以正确的就是/opt/,与url中的images组合起来就是/opt/images/,这才是正确的。

上传一张图片到/opt/iamges/目录下,取名为1.jpg。当尝试在访问该图片的时候可能会出现403错误:

这里写图片描述

这一般就是访问资源的权限问题了,由于本人使用的是root用户,可以在nginx.conf中将第一行的注释去掉,然后修改为如下:

这里写图片描述

修改完配置之后,重新加载配置文件:

./nginx -s reload

此时再次访问应该就可以了:

这里写图片描述


通过java代码访问服务器。

如果搭建完了nginx和vsftpd,就可以通过代码来上传和下载图片了。

在apache.commons.net下提供了访问ftp服务器的一些对象,或者在网上有一个封装类FtpUtil,使用这个更为方便。

FtpUtil.java :封装ftp服务进行上传下载。

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服务器基础目录
     * @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 下载后保存到本地的路径
     * @param localName 本地文件名
     * @return 
     */  
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
            String fileName, String localPath, String localName) {
        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)) {
                    String name = localName.equals("") ? ff.getName() : localName;
                    File localFile = new File(localPath + "/" + name);

                    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;
    }
}

FTPTest.java 测试ftp服务。

import com.taotao.common.utils.FtpUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Ftp服务器测试
 * @Author Leafage
 * @Date 2018/2/23 22:49
 **/
public class FTPTest {
    @Test
    public void testFtpClient() throws IOException {
        // 创建一个FtpClient对象
        FTPClient ftpClient = new FTPClient();
        // 创建ftp连接
        ftpClient.connect("192.168.136.128", 21);
        // 登陆ftp服务器,使用用户名和密码
        ftpClient.login("root","123456");
        // 上传文件
        // 读取本地文件
        FileInputStream fileInputStream = new FileInputStream("G:\\file\\test_ftpclient.jpg");
        // 设置上传路径
        ftpClient.changeWorkingDirectory("/opt/images");
        // 修改上传文件的格式,将其修改为二进制,默认使用文本格式
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        // 参数:服务端名称和文件流
        ftpClient.storeFile("ftpclient.jpg", fileInputStream);
        // 关闭连接
        ftpClient.logout();
    }

    @Test
    public void testFtpUtils() throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("G:\\file\\test_ftputils.jpg");
        FtpUtil.uploadFile("192.168.136.128", 21, "root", "leafage", "/opt/images", "", "testutils.jpg", fileInputStream);
    }

    @Test
    public void testFtpUtilsDowonload() {
        FtpUtil.downloadFile("192.168.136.128", 21, "root", "leafage", "/opt/images","1.jpg", "G:\\file\\","dowonload.jpg");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值