VSFTPD+Nginx

VSFTPD简介(主要是文件上传和下载的功能)

1.linux的组件(一款软件),安装到linux后通过java代码(FtpClient)实现文件上传
2.VSFTPD基于FTP协议
3.为什么要使用VSFTPD?
	3.1 之前实现文件上传
		客户端浏览器 向一个 集群(文件上传功能) 上传文件时,存储到了当前这个tomcat(A),而下次访问到了tomcat(B)时,这个文件就不存在
	3.2 使用VSFTPD优化后
		客户端浏览器 依旧是向 一个 集群(文件上传功能)上传文件,此时会有一个 文件服务器(安装了VSFTPD组件的服务器), 当前tomcat(A)就会使用 ftpClient 把上传过来的文件 存储到 文件服务器上	当下次访问到tomcat(B)时,就可以到文件服务器取到该文件。
		3.2.1 如果希望在客户端直接访问文件服务器中的文件,由于 VSFTPD 是基于 FTP 协议的,客户端浏览器是需要通过 HTTP 协议访问图片的
			3.2.1.1 解决办法使用 Nginx 进行反向代理

安装VSFTPD

1.安装 vsftpd 组件
	# yum -y install vsftpd
	
	yum install 安装(从centos中心库下载)
	-y 表示遇到所有需要确定的地方 yes
	vsftpd 下载的文件名

	安装完成后,有/etc/vsftpd/vsftpd.conf文件,是vsftpd的配置文件

2.添加一个 ftp 用户
	此用户就是用来登录ftp服务器用的
	# useradd ftpuser
	这样一个用户建完,可以用这个登录,记得用普通登录不要用匿名了,登录后的默认路径为 /home/ftpuser

3.给 ftp 用户添加密码
	# passwd ftpuser
	输入两次密码后修改密码

4.防火墙开启21端口
	因为 ftp 协议默认的端口为21,而centos中默认是没有开启的,所以要修改 iptables 文件
		# vim /etc/sysconfig/iptables
	在上面有 22 端口的,复制一行改成 21 ,然后保存并退出

	重启iptables
		# service iptables restart

5.修改selinux(系统服务)
	外网是可以访问上去了,可是发现没法返回目录(使用 ftp 的主动模式、被动模式还是无法访问),也上传不了。是selinux的问题
	修改 selinux:
	# getsebool -a|grep ftp
	
	开启
		allow_ftpd_full_access-->off
			外界是否能够通过 ftp 协议来访问自己
		ftp_home_dir-->off
			我们是否可以访问 ftp 对应的文件夹
	
	执行上面的命令,在返回结果中可以看到,这两行都是 off ,表示没有开启 外网的访问

	(P是大写的P)
	
	# setsebool -P allow_ftpd_full_access on
	# setsebool -P ftp_home_dir on

6.关闭匿名访问
	
	修改 /etc/vsftpd/vsftpd.conf 文件
	
	修改成
		anonymous_enables=NO
	
	重启 ftp 服务:
		# service vsftpd restart
		
	如果之前没开过这个服务,执行会出问题,在执行一次就ok了

7.开启被动模式
	默认是开启的,但是要指定一个端口范围,打开 vsftpd.conf 文件,在后面加上
		
		pasv_min_port=30000
		pasv_max_port=30999

	表示端口范围为 30000~30999,这个可以随意更改,改完之后重启一下 vsftpd
	由于指定这段端口的范围,iptables 中也要相应的开启这个范围,所以需要打开 iptables 文件
	在21下面 再起一行 ,将 21 端口所在行 复制一份 将 21 改为 30000:30999 然后保存,重启iptables

8.设置开机启动 vsftpd ftp 服务
	# chkconfig vsftpd on


使用浏览器访问 ftp 服务器 资源
ftp://192.168.160.131/	需要输入用户名和密码
ftp://用户名:密码@192.168.160.131		不需要输入用户名和密码

可以使用上面两种格式在浏览器访问到对应的图片(不推荐使用)
	在ie中访问的是linux的根目录
	在谷歌(火狐)中访问的是 ftpuser 目录

FtpClient

1.java 技术,使用 ftpclient ,实现使用java代码上传文件到 vsftpd 服务端
	不依赖容器,纯java项目即可使用

2.代码示例
	FTPClient ftp = new FTPClient();
    //设置ip和端口,写在用户名和密码前
    ftp.connect("192.168.160.131",21);
    //设置登录时的用户名和密码
    ftp.login("ftpuser","ftpuser");

    //设置上传文件类型
    //设置上传文件类型为二进制文件类型
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

    //设置上传文件流
    InputStream is = new FileInputStream("E:/2.jpg");
    //第一个参数是 存储时名称  第二个参数是:上传的文件流
    ftp.storeFile("abc.jpg",is);//第一参数是存储是的名字 第二个参数是流对象

    //退出
    ftp.logout();

3.使用 web 项目结合 FTPClient完成
	
	使用浏览器进行文件上传-->将文件上传到Tomcat中(通过MultipartFile 获取上传文件流,使用FtpClient上传到Linux中VSFTPD)

反向代理和正向代理(客户端是否知道最终访问的真实地址)

1.正向代理服务器(类似翻墙软件)	
	1.1 客户端知道最终要访问的服务器地址
	
2.反向代理服务器
	2.1 服务器只知道代理服务器地址,而不知道真实访问的服务器地址
	
	客户端输入代理服务器地址-->访问反向代理服务器-->真实访问地址不知道

nginx 和 VSFTPD 要安装在一台服务器上

客户端访问 nginx(http协议) ,nginx帮我们去 VSFTPD(图片服务器)访问图片
把ftpuser的权限赋给nginx ,这样就可以通过 nginx 访问到图片

安装 nginx(俄罗斯人发明的)

1.nginx安装环境
	nginx是c语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境

	gcc:(c语言库)
		安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要进行安装
			yum install gcc-c++ -y

	PCRE:
		PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库
			yum install -y pcre pcre-devel
		注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

	zlib:
		zlib库提供了很多中亚索和解压缩的方式,nginx使用zlib对http包的内容进行gzip(解压),所以需要在linux安装zlib库
			yum install -y zlib zlib-devel

	openssl:
		openssl 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的秘钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
		nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
			yum install -y openssl openssl-devel

2.解压nginx安装包
	tar -zxvf nginx-1.8.0.tar.gz
	cd nginx-1.8.0
	
	2.1 configure
		./configure-help 查询详细参数	
	
		参数设置:
			./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\
			--http-svgi-temp-path=/var/temp/nginx/scgi
		注意上面将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录

	2.2 编译安装
		make
		make instal

	2.3 启动nginx
		cd /usr/local/nginx/sbin
		./nginx
		
		同时开启80端口

	2.4 停止nginx
		方式1:快速停止
			cd /usr/local/nginx/sbin
			./nginx -s stop 
		此方式相当于先查出nginx进程id在使用kill命令强制杀掉进程

		方式2:完整停止(建议使用)
			cd /usr/local/nginx/sbin
			./nginx -s quit
		此方式停止步骤是待nginx进程处理任务完毕进行停止


	2.5 重启nginx
		方式1:先停止再启动(建议使用)
		对nginx进行重启相当于先停止nginx在启动nginx,即先执行停止命令再执行启动命令。
		如下:
			./nginx -s quit
			./nginx
		
		方式2:重新加载配置文件
			当nginx的配置文件nginx.conf修改后,要想让配置生效需要重启nginx,使用-s reload不用先停止nginx再启动nginx即可将配置信息在nginx中生效,如下:
				./nginx -s reload

	2.6 测试
		nginx安装成功,启动nginx,即可访问虚拟机上的nginx
			输入http://虚拟机ip
			出现 Welcome to nginx
			
			说明安装成功

	2.7 开机自启动nginx
		2.7.1 编写shell脚本
			这里使用的是编写shell脚本的方式来处理
			vi /etc/init.d/nginx (输入下面的代码)
		
			#!/bin/bash
			# nginx Startup script for the Nginx HTTP Server
			# it is v.0.0.2 version. # chkconfig: - 85 15
			# description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx
			# pidfile: /var/run/nginx.pid
			# config: /usr/local/nginx/conf/nginx.conf
			nginxd=/usr/local/nginx/sbin/nginx
			nginx_config=/usr/local/nginx/conf/nginx.conf
			nginx_pid=/var/run/nginx.pid
			RETVAL=0
			prog="nginx" # Source function library.
			. /etc/rc.d/init.d/functions
			# Source networking configuration.
			. /etc/sysconfig/network
			# Check that networking is up.
			[ ${NETWORKING} = "no" ] && exit 0
			[ -x $nginxd ] || exit 0
			# Start nginx daemons functions. start() {
			if [ -e $nginx_pid ];then
			echo "nginx already running...." exit 1
			fi
			echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config}
			RETVAL=$?
			echo
			[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
			return $RETVAL
			}
			# Stop nginx daemons functions. stop() {
			echo -n $"Stopping $prog: " killproc $nginxd
			RETVAL=$?
			echo
			[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
			}
			# reload nginx service functions. reload() {
			echo -n $"Reloading $prog: " #kill -HUP `cat ${nginx_pid}` killproc $nginxd -HUP
			RETVAL=$?
			echo
			}
			# See how we were called. case "$1" in
			start)
			start
			;;
			stop)
			stop
			;;
			reload)
			reload
			;;
			restart)
			stop
			start
			;;
			status)
			status $prog
			RETVAL=$?
			;; *)
			echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1
			esac
			exit $RETVAL

			:wq 保存并退出

		7.2 设置文件的访问权限
			chmod a+x /etc/init.d/nginx (a+x ==> all user can execute 所有用户可执行)
			
			这样在控制台就很容易的操作nginx了:查看nginx当前状态、启动nginx、停止nginx、重启nginx

			#!/bin/bash
			# nginx Startup script for the Nginx HTTP Server
			# it is v.0.0.2 version.
			# chkconfig: - 85 15
			# description: Nginx is a high-performance web and proxy server.
			#              It has a lot of features, but it's not for everyone.
			# processname: nginx
			# pidfile: /var/run/nginx.pid
			# config: /usr/local/nginx/conf/nginx.conf
			nginxd=/usr/local/nginx/sbin/nginx
			nginx_config=/usr/local/nginx/conf/nginx.conf
			nginx_pid=/var/run/nginx.pid
			RETVAL=0
			prog="nginx"
			# Source function library.
			. /etc/rc.d/init.d/functions
			# Source networking configuration.
			. /etc/sysconfig/network
			# Check that networking is up.
			[ ${NETWORKING} = "no" ] && exit 0
			[ -x $nginxd ] || exit 0
			# Start nginx daemons functions.
			start() {
			if [ -e $nginx_pid ];then
			   echo "nginx already running...."
			   exit 1
			fi
			   echo -n $"Starting $prog: "
			   daemon $nginxd -c ${nginx_config}
			   RETVAL=$?
			   echo
			   [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
			   return $RETVAL
			}
			# Stop nginx daemons functions.
			stop() {
			        echo -n $"Stopping $prog: "
			        killproc $nginxd
			        RETVAL=$?
			        echo
			        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
			}
			# reload nginx service functions.
			reload() {
			    echo -n $"Reloading $prog: "
			    #kill -HUP `cat ${nginx_pid}`
			    killproc $nginxd -HUP
			    RETVAL=$?
			    echo
			}
			# See how we were called.
			case "$1" in
			start)
			        start
			        ;;
			stop)
			        stop
			        ;;
			reload)
			        reload
			        ;;
			restart)
			        stop
			        start
			        ;;
			status)
			        status $prog
			        RETVAL=$?
			        ;;
			*)
			        echo $"Usage: $prog {start|stop|restart|reload|status|help}"
			        exit 1
			esac
			exit $RETVAL

使用Nginx代理ftpuser目录

1.到 nginx的配置文件中 将位置改为 ftpuser的目录
	cd /usr/local/nginx/conf
	
	vim nginx.conf

	/代表nginx的根目录
	root 表示是那个文件夹
	index 是那个页面
	 location / {
        root   /home/ftpuser;
    }

	将location中的内容改为 root ftpuser的目录

	然后重启 nginx

	cd ../sbin
	
	./nginx -s quit 先关闭在打开
	./nginx

	使用http://192.168.160.131 报403则修改成功
	403(权限不足)nginx没有访问ftpuser目的权限
	
	进入 nginx.conf 给与权限
	在 nginx.conf 文件前添加 user ftpuser
	给 nginx ftpuser的权限

	给完权限再次访问发现还是403,这是因为没有指定显示的文件
	location / {
        root   /home/ftpuser;
		index 1.jpg
    }
	
	使用./nginx -s reload 重启
	再次访问即可

	查看应用进程号
	ps aux|grep nginx(应用名)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值