VSFTPD入門學習筆記

一、VSFTPD 簡介

1.1 描述

VSFTPD 是基於FTP協議的文件服務器,可以通過FtpClient實現文件上傳


1.2 爲什麼要使用VSFTPD

傳統的文件上傳。 通過客戶端瀏覽器存到tomcat中,但是存在很多問題。例如:

在這裏插入圖片描述例如:集羣情況,上傳到tomcat1 ,去tomcat2 訪問的時候找不到圖片。

另外:重啓tomcat等情況,會出現圖片丟失等情況。


1.3 使用 VSFTPD 後優化

如果希望在客戶端直接訪問圖片服務器中的圖片,由於VSFTPD 是基於 FTP 協議的,客戶端瀏覽器是需要通過 http 協議訪問圖片。解決方案就是:使用 Nginx 進行反向代理
在這裏插入圖片描述


二、VSFTPD 安裝配置

2.1 安裝 vsftpd 組件

在 centos7 (192.168.91.111) 進行安裝

yum -y install vsftpd

#版本
vsftpd -v

安裝完後,有/etc/vsftpd/vsftpd.conf 文件,是 vsftp 的配置文件。


2.2 添加一個 ftp 用戶

此用戶就是用來登錄 ftp 服務器用的。

useradd ftpuser 

這樣一個用戶建完,可以用這個登錄,記得用普通登錄不要用匿名了。
登錄後默認的路徑爲 /home/ftpuser.


2.3 給 ftp 用戶添加密碼

passwd  ftpuser 

輸入兩次密碼後修改密碼


2.4 防火牆開啓 21 端口

查看所有打開的端口:

firewall-cmd --list-ports

查詢指定端口是否已開 firewall-cmd --query-port=21/tcp
提示 yes,表示開啓;no表示未開啓。

firewall-cmd  --add-port=21/tcp --permanent    

permanent永久生效,沒有此參數重啓後失效

開啓端口後記得重新載入才生效

firewall-cmd --reload

關閉防火牆則沒有必要去開啓某個端口


2.5 修改 selinux

外網是可以訪問上去了,可是發現沒法返回目錄(使用 ftp 的主動模式,被動模式還是無法 訪問),也上傳不了,因爲 selinux問題。 修改 selinux: 執行以下命令查看狀態

#執行以下命令查看狀態
getsebool -a | grep ftp 

在這裏插入圖片描述

setsebool -P allow_ftpd_full_access on 
setsebool -P tftp_home_dir on

在這裏插入圖片描述


2.6 配置vsftpd

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

vim /etc/vsftpd/vsftpd.conf

把anonymous_enable=YES ,改爲NO ,然後重啓vsftpd

#重啓
service vsftpd restart

# 查看vsftpd服務的狀態
systemctl status vsftpd.service

# 設置開機啓動
systemctl enable vsftpd.service

在這裏插入圖片描述> 安裝基本完成
在這裏插入圖片描述可以往ftpuser文件夾上傳文件了。


2.7 訪問

  • 在谷歌瀏覽器中直接訪問到 ftpuser 目錄:ftp://192.168.91.111
  • 在 IE 中訪問的是 linux 的根目錄

不推薦這種做法


三、java代碼操作vsftpd

3.1、FtpClient

java 技術,使用 FtpClient上傳文件到 vsftpd 服務端

<dependency>
   		<groupId>commons-net</groupId>
   		<artifactId>commons-net</artifactId>
   		<version>3.3</version>
</dependency>
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @Descirption 測試
 * @Author uzong
 * @Date 2019/3/10
 * @Version 1.0
 */
public class FTPTest {
    public static void main(String[] args) throws Exception {
        FTPClient ftp = new FTPClient();
        //設置 ip 和端口,寫在用戶名和密碼上面
        ftp.connect("192.168.91.111",21);
        //設置用戶名和密碼
        ftp.login("ftpuser","123456");
        //解決FTPClient上傳文件爲空,顯示0字節
        ftp.enterLocalPassiveMode();
        //設置文件類型
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        //文件
        InputStream is = new FileInputStream("C:/Users/Administrator/Desktop/圖片素材/abe75ded950123ed843d95c9ae2de1fb.jpg");
        //第一個參數存儲時名稱
        ftp.storeFile("d.jpg",is);
        is.close();
        ftp.logout();
    }
}

3.2 工具類抽取

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;

/**
 * ftp上傳下載工具類
 */
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
	 *            下載後保存到本地的路徑
	 * @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;
	}

	public static void main(String[] args) throws FileNotFoundException {
		InputStream is = new FileInputStream("E:/timg.jpg");
		boolean result = FtpUtil.uploadFile("192.168.91.111", 21, "ftpuser", "123456", "/home/ftpuser", "/",
				"q.jpg", is);
	}
}

四、整合Nginx

4.1 反向代理和正向代理

  • 正向代理:客戶端知道最終要訪問的服務器地址.
  • 反向代理: 客戶端只知道代理服務器地址,而不知道真實訪問的服務器地址.
    在這裏插入圖片描述

4.2 安裝Nginx

安裝Nginx略過

  • 啓動nginx命令:/usr/local/nginx/sbin/nginx
  • 關閉nginx命令:/usr/local/nginx/sbin/nginx -s stop
  • 重啓nginx命令:/usr/local/nginx/sbin/nginx -s reload

注意:需要對應nginx安裝文件的目錄


4.3 配置nginx代理ftpuser目錄


 location / {
       root   /home/ftpuser;
   }

在這裏插入圖片描述在這裏插入圖片描述

ps -aux | grep nginx 或者ps -ef | grep nginx查看用戶權限

然後重新啓動nginx, 發現沒有權限,查看nginx代理的用戶是nobody。所以需要 賦予 ftpuser 用戶權限

user ftpuser;

在這裏插入圖片描述
重啓nginx就完成了配置


參考

  • 張老師視頻教程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章