观看北京尚学堂-百战程序员笔记
一、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 sbin
,ls
,里面有个启动文件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