(只需挨个复制粘贴命令即可部署)在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.jpgInputStream 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.jpgInputStream 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("上传成功");elseSystem.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 0nginx="/usr/local/nginx/sbin/nginx"prog=$(basename $nginx)NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"lockfile=/var/lock/subsys/nginxstart() {[ -x $nginx ] || exit 5[ -f $NGINX_CONF_FILE ] || exit 6echo -n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval}stop() {echo -n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval}restart() {configtest || return $?stopstart}reload() {configtest || return $?echo -n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?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" instart)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 2esac

⑥、设置文件的访问权限

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 vsftpdrpm -e vsftpd 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ 2421 Constructing Roads MST kruskal

最近刚学的并查集所以用kruskal来试试最小生成树~ kruskal其实用几句话就能说完~ 1.贪心所有边的权值,从小到大取值 2.取值时~将边权非0的两个顶点~进行并查操作~如果两个点的祖先不同...边权加入最小生成树...并且将两个点纳入同一个集合中 3.判断是否所有点都在同一个集合中…

c# 声明类的时候初始化类_使用C#初始化的列表声明

c# 声明类的时候初始化类The task is to create/declare a list with an initializer list in C#. 任务是在C&#xff03;中使用初始化列表创建/声明一个列表 。 C&#xff03;清单 (C# List) A list is used to represent the list of the objects, it is represented as Lis…

编写程序计算所输日期是当年的第几天

/* 1.输入年月日&#xff0c;编写程序计算所输日期是当年的第几天 *//* 2.已知列车隔日发车&#xff0c;且1/1/2006不发车(无ticket),如果所输入数据在此日期之后&#xff0c;则输出有没有车票&#xff0c;否则仅输出上一步结果。*/ /* month/date/year is which day of the ye…

汇编语言-005(XCHG、标志位操作、算术操作、比例因子的变址寻址、多个常用运算符运用、大端转小端、数组操作)

1: 用不超过3条XCHG指令对4个8位寄存器的值重新排序&#xff0c;A,B,C,D调整为D,C,B,A .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data.code main PROCmov al,Amov bl,Bmov cl,Cmov dl,Dxchg al,dlxchg bl,clINVOKE ExitProcess,0 main ENDP E…

bcd码二进制转十进制_二进制编码的十进制(BCD码)及其加法

bcd码二进制转十进制Prerequisite: Number systems 先决条件&#xff1a; 数字系统 BCD Code (8421 Code): In BCD 8421 code, each decimal digit is represented using a 4-bit binary number. The 4-bit binary numbers have their weights attached as 8, 4, 2, 1 from MS…

SVN服务器部署

一、SVN版本控制器 Subversion就是一款实现版本控制的工具软件&#xff0c;通常也成为版本控制器&#xff0c;简称SVN。 Subversion是Apache软件基金会组织下的一个项目 SVN基本操作&#xff1a; checkout&#xff08;检出&#xff09;&#xff1a;将一个服务端创建好的项目…

rtmp流\http流测试地址

测试方式&#xff1a;ffplay rtmp://58.200.131.2:1935/livetv/cctv1 rtmp&#xff1a; CCTV-1综合:rtmp://58.200.131.2:1935/livetv/cctv1 CCTV-2财经:rtmp://58.200.131.2:1935/livetv/cctv2 CCTV-3综艺:rtmp://58.200.131.2:1935/livetv/cctv3 CCTV-4中文国际:rtmp://58.2…

LINQ to XML:如何读写XCData

using System;using System.Xml.Linq;namespace ConsoleApplication1 {class Program{static void Main(string[] args){//写入CDATA元素块var doc new XElement("Test",new XElement("User",new XAttribute("name", "chenxizhang"),…

C#中的结构和类之间的区别

C&#xff03;类和结构 (C# class and structure) In C# and other programming languages, structure and classes are used to define a custom data type, that we can organize according to our need with different types of variables, methods etc. 在C&#xff03;和其…

[转载]SQL Plus 一些使用技巧

原文地址&#xff1a;SQL Plus 一些使用技巧作者&#xff1a;☆水『若寒Sql*plus的使用 Sql*plus介绍 Sql*plus是oracle提供的一个工具程序&#xff0c;既可以在oracle服务器使用&#xff0c;也可以在oracle客户端使用。在windows下分两种&#xff0c;sqlplus.exe是命令行程序&…

云服务器(Centos)部署SVN

1&#xff0c;安装svn yum install subversion 2&#xff0c;查看版本号 svnserve --version 3&#xff0c;创建SVN版本库&#xff08;在var/svn 文件夹下&#xff09; 新建文件夹 mkdir -p /var/svn/svnrepos 创建版本库 svnadmin create /var/svn/svnrepos 4&#xff0c;修改…

ffmpeg命令提取像素格式

1&#xff1a; 提取yuv格式&#xff1a;不修改宽高 取3秒 ffmpeg -i test_1920x1080.mp4 -t 3 yuv420p_orig.yuv ffmpeg -i test_1920x1080.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv 可以使用ffplay播放&#xff1a;ffplay -video_size 1920x1080 yuv420p_orig.yuv 提取y…

Javascript(js)使用function定义构造函数

Javascript并不像Java、C#等语言那样支持真正的类。但是在js中可以定义伪类。做到这一点的工具就是构造函数和原型对象。首先介绍js中的构造函数。 Javascript中创建对象的语法是在new运算符的后面跟着一个函数的调用。如 1 varobj newObject();2 vardate newDate();运算符new首…

错误:将字符串分配给C中的char变量| 常见的C程序错误

If you assign a string to the character variable, it may cause a warning or error (in some of the compilers) or segmentation fault error occurs. 如果将字符串分配给字符变量&#xff0c;则可能会导致警告或错误(在某些编译器中)或发生分段错误。 Consider the code…

【转】用BibTeX 写 Reference

BibTeX 是一种格式和一个程序&#xff0c; 用于协调LaTeX的参考文献处理&#xff0c;BibTeX 使用数据库的的方式来管理参考文献.&#xff0c;BibTeX 文件的后缀名为 .bib。 例子&#xff1a; article{name1, author {作者, 多个作者用 and 连接}, title {标题}, journal {期…

计算机二级C语言易混淆的区别

1&#xff0c;if(a1)与if(a1)的区别 首先&#xff0c;if(a1) 等价于 a1;if(a); 而a 1&#xff0c;是判断a是不是为1&#xff1b; if(sq)里面的分为两种情况&#xff0c;一种是sq为0&#xff0c;不执行if里面的代码内容&#xff1b;另一种是sq不为0&#xff0c;执行里面的代码内…

ffmpeg命令mp3中提取pcm格式

原mp3文件: ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm &#xff08;这可能是pcm原格式查不到什么信息但是可以播放的&#xff1a;ffplay -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm&#xff09; ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -samp…

C++ STL map的使用

1、map简介 map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小&#xff0c;除了那个操作节点&#xff0c;对其他的节点都没有什么影响。对于迭代器来说&#xff0c;可以修改实值&#xff0c;而不能修改key。 2、map的功能 自动建立Key &#xff0d; value的…

bfs广度优先搜索算法_图的广度优先搜索(BFS)

bfs广度优先搜索算法What you will learn? 您将学到什么&#xff1f; How to implement Breath first search of a graph? 如何实现图的呼吸优先搜索&#xff1f; Breadth First Search is a level-wise vertex traversal process. Like a tree all the graphs have verte…

考研C++必刷题(一)

【程序1】 题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 解题思路&#xff1a; 利用三层循环&#xff0c;分别控制百位十位个位&#xff0c;若百位十位个位有重复的&#xff0c;则不输出即可。 代…