springboot项目通过nginx访问ftp服务器文件

前文

本来准备记录一下。项目中遇到的springboot项目访问ftp服务器图片、视频问题的,想在我自己服务器上重新部署一遍,然后发现,执行docker的时候报错了。具体报错原因如下:
原因是我重启了一下服务器

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

这个问题,解决方案自然很多了。百度一下解析的更全面,我这里只是因为docker没启动。
解决方案: 1、执行 systemctl status docker 查看docker状态。2、执行 service docker start 启动docker。3、然后docker ps即可。
在这里插入图片描述

项目场景

当前需求是,图片或者视频,保存到一个地方,然后通过本地项目在web上可以展示。基本这种场景都是把图片视频部署到文件服务器上,比如阿里云等。因需求没那么严格。从简,所以就决定把文件保存到ftp服务器上。

环境介绍:
1、springboot项目。前后分离。
2、ftp部署在linux系统。
3、docker管理ftp。

环境安装

docker安装,可自行百度

docker安装ftp

1) docker拉取ftp镜像
docker pull fauria/vsftpd
2) 启动ftp镜像
docker run -p 20:20 -p 21:21 -p 2000:2000 --name vsftpd --restart=always -v /home/app/ftp/:/home/vsftpd -v /home/app/ftp/log/:/var/log/vsftpd -e FTP_USER=ftpuser -e FTP_PASS=ftpuser -e PASV_MIN_PORT=20000 -e PASV_MAX_PORT=20000 -e PASV_ADDRESS=你的ip -e LOG_STDOUT=1 -d fauria/vsftpd

启动之后发现21端口被占用。因为是之前在宝塔里面创建了一个ftp。
在这里插入图片描述
解决:使用 netstat -ant|grep 21、或者 lsof -i :21查看21端口使用情况,kill -9 843 关闭进程。重新启动运行ftp。

验证:
打开我的电脑在文件栏输入:ftp://你的ip/,输入密码就可以登录linux服务器的ftp
在这里插入图片描述

上传下载图片

ftp maven引入pom
<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.8.0</version>
        </dependency>
FtpUtil



import lombok.extern.slf4j.Slf4j;
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;

import java.io.*;

/**
 * ftp工具类
 */
@Slf4j
public class FtpUtil {



    /**
     * Description: 向FTP服务器上传文件
     *
     * @param host     FTP服务器hostname
     * @param port     FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param basePath FTP服务器基础目录
     * @param filePath FTP服务器文件存放路径。文件的路径为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) {
        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();
                log.error("ftp connect failed");
                return false;
            }
            //切换到上传目录
            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)) { //创建目录
                            //如果创建文件目录失败,则返回
                            log.error("创建文件目录" + tempPath + "失败");
                            log.error("dir creat failed");
                            return false;
                        } else {
                            //目录存在,则直接进入该目录
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            // 设置被动模式
//            ftp.enterLocalPassiveMode();
            // 设置主动模式
            ftp.enterLocalActiveMode();
            ftp.setRemoteVerificationEnabled(false);

            //上传文件
            if (!ftp.storeFile(filename, input)) {
                log.error("upload failed");
                return false;
            } else {
                log.info("文件:" + filename + " 上传成功");
            }
            input.close();
            ftp.logout();
        } catch (IOException e) {
            log.error("失败,服务器返回:" + ftp.getReplyString());//获取上传失败的原因
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    log.error("ftp.isConnected() fail!");
                    ioe.printStackTrace();
                }
            }
        }
        return true;
    }


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

    /**
     * 连接ftp服务器
     * @param hostName ip
     * @param port 端口
     * @param userName 用户名
     * @param password 密码
     * @return
     * @throws IOException
     */
    public static FTPClient connectFtp(String hostName, int port, String userName, String password) throws IOException {
        FTPClient ftpClient = new FTPClient();
        //设置编码格式,FTP Server 协议里规定文件名编码是iso-8859-1
        ftpClient.setControlEncoding("GBK");
        //设置传输命令的超时
        ftpClient.setDefaultTimeout(20000);//毫秒
        //设置两个服务连接超时时间
        ftpClient.setConnectTimeout(10000);//毫秒
        //被动模式下设置数据传输的超时时间
        ftpClient.setDataTimeout(15000);//毫秒
        //连接FTP
        ftpClient.connect(hostName, port);
        //更加账户密码登录服务
        ftpClient.login(userName, password);
        //被动模式
        ftpClient.enterLocalPassiveMode();

        return ftpClient;
    }

    /**
     * 关闭ftp
     */
    public static void close(FTPClient ftpClient) {
        try {
            if (ftpClient != null && ftpClient.isConnected()) {
                ftpClient.disconnect();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

nginx访问ftp服务文件

springboot项目部署到linux服务器上运行之后。前端需要通过nginx转发到ftp服务,直接访问图片视频文件。

docker安装nginx。

之前装过了,所以改一下nginx配置重启一下就行了。修改配置如下。

user  root;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
    server {
	listen 80;
	server_name xxx.xx.x.xx;
	location / {
		root   /usr/share/nginx/html/dist;
		index  index.html index.htm;
		try_files $uri $uri/ /index.html;
	}
	location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://xxx.xx.x.xx:8080/;
        }
    }
   server {
   	listen 81;
	server_name xxx.xx.x.xx;
	location / {
                root /usr/share/nginx/ftproot/testftpuser;
        } 
    }

}

docker 启动nginx指令:

docker run -p 80:80 -p 81:81 --name nginx -v /home/app-data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /app-data/ftp_home:/usr/share/nginx/ftproot -v /home/app-data/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/app-data/nginx/log:/var/log/nginx -v /home/app-data/nginx/html:/usr/share/nginx/html -d nginx:latest

注意: -v /app-data/ftp_home:/usr/share/nginx/ftproot 这个就是挂载ftp服务地方。

然后启动nginx之后,直接访问:你的ip + ftp文件路径,就可以访问了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你好!要将Spring Boot项目部署到服务器上,可以按照以下步骤操作: 1. 将Spring Boot应用程序打包成可执行的Jar文件或WAR文件; 2. 将Jar或WAR文件上传到服务器上,可以使用FTP或其他文件传输工具; 3. 安装Java运行环境(JRE或JDK); 4. 在服务器上运行Java命令来启动Spring Boot应用程序; 5. 如果需要在生产环境中使用Spring Boot应用程序,可以考虑使用反向代理服务器(如Nginx)或负载平衡器(如HAProxy)来管理流量和安全性。 希望以上信息能够对您有所帮助,如有任何问题或需要进一步帮助,请随时联系我。 ### 回答2: 在部署springboot项目之前,我们需要先了解服务器的一些基本概念及相关技术。 服务器的基本概念包括: 1. 操作系统:服务器的核心组成部分,比如常用的Linux、Windows Server等。 2. Web服务器:如Apache、Nginx等,用来接收用户的HTTP请求并将请求交给处理程序。 3. 应用服务器:如Tomcat、Jetty等,用来运行Java或其他主流语言的Web应用程序。 4. 数据库服务器:如MySQL、Oracle等,负责存储和管理数据。 在部署springboot项目时,我们需要先编写好项目代码,并将其打包成一个可直接运行的jar包。然后按照以下步骤进行部署: 1. 在服务器上安装Java环境; 2. 上传jar包到服务器上,可以使用FTP、SFTP等工具进行上传; 3. 使用命令行或者脚本方式运行该jar包,可以使用以下命令: ``` java -jar xxx.jar ``` 其中,"xxx.jar"为jar包的名称,需要根据实际情况进行修改。 4. 如果需要配置更多的参数,可以在运行命令中添加参数,例如: ``` java -jar xxx.jar --server.port=8080 ``` 以上命令可以设置应用程序监听的端口号为8080。 5. 检查应用程序是否正常运行,可以通过浏览器访问服务器IP地址和端口号来进行检查,如果应用启动成功会看到该应用的默认页面。 6. 如果需要进行生产环境部署,可以使用各种负载均衡技术和高可用技术,如Nginx、HAProxy、Eureka等。 以上就是springboot项目部署到服务器的基本流程,需要一定的Linux、Java以及服务器管理的基本知识。在实践中不断总结经验并不断优化配置参数才能更好地保证项目的可用性和可维护性。 ### 回答3: Spring Boot 是一个用于构建独立的、基于Spring的Java应用程序的开源框架。部署 Spring Boot 项目服务器是关键的一步,下面就介绍 Spring Boot 项目部署到服务器的具体步骤。 第一步:将项目打包成jar文件 使用 Maven 工具,执行以下命令编译项目:`mvn clean package`,就可以将项目打包成一个可执行的 jar 文件,存放在 target 目录下。 第二步:将jar文件上传到服务器 将 jar 文件通过 FTP 或者 SCP 的方式上传到服务器中的目标文件夹。 第三步:安装Java环境并启动项目 确保服务器上已经安装了 JDK 环境,使用以下命令启动项目: ``` java -jar your-project.jar ``` 在命令行中执行,通过访问 http://localhost:8080 访问应用程序。 第四步:配置Nginx 使用 Nginx 配置反向代理,将访问的请求转发到 Spring Boot 的应用程序上。具体配置可参考 Nginx 官方文档。 总结: Spring Boot 项目的部署需要一定的技术水平,但只要按照上述步骤操作,即可成功将项目部署到服务器上,实现在线访问。同时如果需要更好的管理,可以考虑使用Docker容器部署。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值