(只需挨个复制粘贴命令即可部署)在Centos7下搭建文件服务器(VSFTPD)

观看北京尚学堂-百战程序员笔记

一、VSFTPD简介

Linux的组件(一款软件),安装到Linux后可以通过java代码(FtpClient)实现文件的上传。基于FTP协议。
由于VSFTPD是基于FTP协议,客户端浏览器是需要通过http协议访问图片;如果希望客户端直接访问图片服务器中的图片,需要使用Nginx进行反向代理。
在这里插入图片描述

二、提炼核心命令

①,下载安装vsftpd,完全在线安装版

yum -y install vsftpd

yum install ftp -y

yum:代表从centos中心库去自动安装对应的组件
yum install代表安装的意思
vsftpd代表组件名
-y表示需要确认的地方全部yes

安装完后,vsftp 的配置文件在/etc/vsftpd/vsftpd.conf
②,添加ftp用户,ftpuser为用户名,可自定义

useradd ftpuser

登录后默认的路径为 /home/ftpuser
③,添加ftpuser这个用户的密码

passwd ftpuser

命名输入之后需要输入两次密码,太简单了会有提示

④,ftp 默认的端口为 21,此时需要让防火墙放开21端口

vim /etc/sysconfig/iptables

在行上面有 22 -j ACCEPT 下面另起一行输入跟那行差不多的,只是把 22 换成 21,然后: wq 保存。
如图所示:在这里插入图片描述
⑤,重启一下iptables

service iptables restart

⑥,修改selinux
此时已经外网已经可以访问了,但是没有返回路径,此时需要修改一下selinux。
先查看一下状态

getsebool -a | grep ftp

若报错

setenforce: SELinux is disabled

如果需要重新开启selinux,请按下面步骤:

vi /etc/selinux/config

更改为:SELINUX=1
必须重启linux,从云服务器管理控制台重启,快速连接Ctrl+Shift+R,不重启是没办法立刻开启selinux的

若不报错,执行下面两行命令,开启外网访问

setsebool -P ftpd_full_access on

setsebool -P tftp_home_dir on

即将allow_ftpd_full_access和ftp_home_dir的状态改成on。
在这里插入图片描述
连接服务器的时候要是出错,最直接的方法就是把防火墙给关了。
访问服务器的软件传输模式改成主动

⑦,关闭匿名访问
修改/etc/vsftpd/vsftpd.conf 文件:将anonymous_enable=NO原来是YES,需要改成NO。最后:wq保存并退出即可
步骤如下:
先切换到vsftpd的配置文件默认安装位置

cd /etc/vsftpd/

ls一下,找到vsftpd.conf配置文件
然后,编辑一下该配置文件

vim vsftpd.conf

找到配置文件里面的这行命令,改成这个状态anonymous_enable=NO,把YES改为NO

保存并退出

Esc

:wq

最后,重启一下stp服务即可

systemctl start vsftpd.service

查看一下服务状态,若为绿色表示成功

systemctl status vsftpd.service

⑧,开启被动模式,默认是开启的,但是要指定一个端口范围30000~30999,这个端口范围可以随意更改。
首先,编辑配置文件

vim /etc/vsftpd/vsftpd.conf

需要插入一些配置,insert插入一下
在配置文件vsftpd.conf最后加入下面两行指定端口范围

pasv_min_port=30000
pasv_max_port=30999

同样iptables 也要相应的开启这个范围,参考步骤④,只不过开发的不是21这个端口了,重新复制一行,将端口号改成3000:30999范围 ,之后记得重启一下iptables ,参考步骤⑤。

⑨,设置开机自启动vsftpd ftp服务

systemctl enable vsftpd.service

三、测试一下

连接服务器,在/etc/home/ftpuser上传一张随便的图片,例如为a.png。

ftp://116.62.111.4:21(自己的服务器ip)

访问成功之后需要进行输入自己设置的用户名和密码(步骤二的②,③)。
也可以这样访问:

ftp://用户名:密码@自己服务器的ip

例如:ftp://ftpuser:密码@116.62.111.4

四、通过java代码FtpClient上传图片到ftpuser

①,创建一个maven项目
②,在pom.xml配置文件中添加约束

 <dependencies>
      <dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
			<version>3.3</version>
      </dependency>
 </dependencies>

③,编写测试类Text

将E盘下的sq.jpg上传到服务器上为abc.jpg
package com.pdsu.bjsxt;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;

public class Test {
	public static void main(String[] args) throws IOException {
		FTPClient ftp = new FTPClient();
		
		ftp.connect("服务器ip", 21);//设置ip和端口
		
		ftp.login("用户名", "密码");//设置用户名和密码
		
		
		//设置文件类型
		ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//图片设置为上传成二进制类型,否则会出现乱码
		
		//选择一个文件上传,将E盘下的sq.jpg上传到服务器上为abc.jpg
		InputStream is = new FileInputStream("E:/sq.jpg");
		ftp.storeFile("abc.jpg", is);
		
		ftp.logout();//关闭流
		
		System.out.println("上传成功");
	}
}

将E盘下的sq.jpg上传到wsq文件夹下成为yy.jpg。
其中wsq文件夹不可以自动创建需要自己手动创建才行
package com.pdsu.bjsxt;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;

public class Test {
	public static void main(String[] args) throws IOException {
		FTPClient ftp = new FTPClient();
	
		ftp.connect("服务器ip", 21);//设置ip和端口
		ftp.login("用户名", "密码");//设置用户名和密码	

		//设置文件类型
		ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//图片设置为上传成二进制类型,否则会出现乱码
		
		//选择一个文件上传,将E盘下的sq.jpg上传到服务器上为abc.jpg
		InputStream is = new FileInputStream("E:/sq.jpg");
		ftp.changeWorkingDirectory("/home/ftpuser/wsq");//将文件上传到wsq文件夹下的yy.jps,其中wsq文件夹不可以自动创建需要自己手动创建
		ftp.storeFile("yy.jpg", is);
		
		ftp.logout();//关闭流
		
		System.out.println("上传成功");
	}
}

模板工具类(直接复制修改main函数即可)

package com.pdsu.utils;

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 {
		//将E盘下的sq.jpg图片上传到服务器的/home/ftpuser为下,上传成为qqq.jpg这个图片
		InputStream is = new FileInputStream("E:/sq.jpg");
		boolean result = FtpUtil.uploadFile("192.168.139.131", 21, "用户名", "密码", "/home/ftpuser", "/",
				"qqq.jpg", is);
		if (result)
			System.out.println("上传成功");
		else
			System.out.println("上传失败");
	}
}

五、反向代理安装Nginx

Nginx是C语言开发,需要有C语言的环境,需要安装一些组件
①,将压缩包上传到/usr/local/tmp
切换一下目录

cd /etc/vsftpd

安装组件gcc

yum install gcc-c++ -y

安装组件pcre

yum install -y pcre pcre-devel

安装组件zlib

yum install -y zlib zlib-devel

安装组件openssl

yum install -y openssl openssl-devel

②、准备创建一些文件夹,这几个文件夹需要手动创建
进去var文件夹下面

cd /var

查看一下目录结构

ls

里面没有temp文件夹,此时需要创建一个temp文件夹

mkdir temp

进去文件夹里面

cd temp

在temp文件夹下创建一个nginx文件夹

mkdir nginx

③、进入到压缩包所在的目录

cd /usr/local/tmp

ls

解压压缩包

tar zxvf nginx-1.8.0.tar.gz

ls

进入到解压后的目录

cd nginx-1.8.0

ls

目录里面会有个configure文件
其中\代表换行操作

./configure \

> --prefix=/usr/local/nginx \
> --pid-path=/var/run/nginx/nginx.pid \
> --lock-path=/var/lock/nginx.lock \
> --error-log-path=/var/log/nginx/error.log \
> --http-log-path=/var/log/nginx/access.log \
> --with-http_gzip_static_module \
> --http-client-body-temp-path=/var/temp/nginx/client \
> --http-proxy-temp-path=/var/temp/nginx/proxy \
> --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
> --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

复制粘贴(此时的目录必须在nginx-1.8.0目录下)!!!!

进行编译

make

安装

make install

返回到安装nginx的目录下

cd /usr/local/nginx

ls

会发现有三个文件夹conf html sbin
conf :里面有所有nginx配置文件都在这个文件夹里面,其中nginx.conf是主配置文件
html:里面有两个页面,50x.html访问出错的页面,和一个index.html访问服务器默认的欢迎页
sbin:启动文件目录,进去sbin目录里面,cd sbinls,里面有个启动文件nginx,然后启动一下nginx,./nginx默认的是80端口
需要使防火墙放行8端口,参考二、④

然后,浏览器输入http:你的ip回来到nginx自带的index.html欢迎页面

④、停止nginx服务
首先需要进入到sbin目录下

cd /usr/local/nginx/sbin

启动:

./nginx

快速停止:相当与eclipse从控制台点红方块

./nginx -s stop

完整停止(推荐使用):相当与eclipse将服务stop

./nginx -s quit

⑤、设置nginx开机自启动–使用编写shell脚本

cd /etc/init.d

创建nginx文件编辑

vim nginx

#!/bin/sh
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server

# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}


stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}



restart() {

    configtest || return $?

    stop

    start

}


reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

force_reload() {

    restart

}


configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}



rh_status() {

    status $prog

}


rh_status_q() {

    rh_status >/dev/null 2>&1

}

case "$1" in

    start)

        rh_status_q && exit 0
        $1
        ;;

    stop)


        rh_status_q || exit 0
        $1
        ;;

    restart|configtest)
        $1
        ;;

    reload)
        rh_status_q || exit 7
        $1
        ;;


    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;


    condrestart|try-restart)

        rh_status_q || exit 0
            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2

esac

⑥、设置文件的访问权限

cd /etc/init.d

chmod 755 /etc/init.d/nginx

chkconfig --add nginx

(a+x ==> all user can execute 所有用户可执行)
此时ls 会发现nginx变成了绿色的可执行文件了
⑦、在rc.local文件中加入一行配置

vi /etc/rc.local

加入这一行代码,表示开机自启动

/etc/init.d/nginx start

Esc

:wq

测试一下

cd /etc/init.d

service nginx start

/etc/init.d/nginx status

全报绿即安装成功

⑧,加权限
进入到nginx的目录下

cd /usr/local/nginx

ls

cd conf

ps aux|grep nginx

可以看见这里是nobody用户权限

vim nginx.conf

在第一行中将user用户打开并且改成你的用户名

用户权限必须给,这一步很重要

user ftpuser

若报错

cd /usr/local/nginx/sbin

查看进程

ps aux|grep nginx

杀死进程(若删不掉,是因为有守护进程,将root也给删掉)

kill -7 -进程ID

然后在重启nginx

./ nginx

此时要是在报错需要添加欢迎页面

加载欢迎页面

cd /usr/local/nginx/conf

vim nginx.conf
在这里插入图片描述

VSFTPD卸载
rpm -qa | grep vsftpd

rpm -e vsftpd 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond谚语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值