vsftp+rsync+notify+nginx
简介
vsftp 用作文件存储服务器
rsync+notify 用作文件实时同步工具,(rsync—文件同步工具,notify—监控文件变化)
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件
nginx用作灾备工具
使用backup功能:backup参数 ,backup不能和ip_hash一起使用,backup 参数是指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机
vsftp
安装
#yum install vsftpd
#systemctl enable vsftpd
#systemctl start vsftpd
修改配置文件
#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO ###关闭匿名用户登录
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
max_clients=1000
max_per_ip=1000
use_localtime=YES
reverse_lookup_enable=NO
#需要代理转发ftp请求加入以下配置
pasv_enable=YES ###开启被动模式
pasv_min_port=10000 ###被动模式端口(起始端口)主备两台分别设置不同端口
pasv_max_port=10009 ###被动模式端口(末至端口)主备两台分别设置不同端口
pasv_address=192.168.12.8 ###proxy代理IP(nginx主机 IP)
添加本地用户用作 ftp 登录
指定 ftp-user 的uid 1009
#useradd -u 1009 -g root -d /filesec/ftp-user ftp-user
修改用户密码
#echo "ftp-user:Hdlh@123"|chpasswd
"ftp-user:Hdlh@123":"用户名:密码"
#echo"Hdlh@123"|passwd --stdin "ftp-user"
"Hdlh@123":密码
"ftp-user":用户名
rsync+notify
单向同步(rsync):主服务器启动rsyncd后台程序,由备份服务器执行同步命令
实时同步(rsync+inotify):备份服务器启动rsyncd后台程序,由主服务器执行inotify脚本实时检测本地目录,再执行同步命令。
双向同步:两台服务器都安装rsync+inotify;两台服务器创建认证文件(secrets file = /etc/rsyncd.passwd),两台备份服务器创建单独密码文件(--password-file=/hdfs/project/rsync/rsyncd.passwd)
rsync
安装
#yum install -y rsync
配置文件
配置文件不能包含 # 注释
(主文件端
#vim /etc/rsyncd.conf
uid = ftp-user #设置运行rsync 进程的用户
gid = root
use chroot = no #使用默认根目录
max connections = 200 #最大连接数
#pid file = /var/run/rsyncd.pid #CentOS7中yum安装不需指定pid file 否则报错
lock file = /hdfs/project/rsync/rsyncd.lock #指定支持 maxconnections 参数的锁文件
log file = /hdfs/project/rsync/rsyncd.log #此文件定义完成后 系统会自动创建
transfer logging = yes #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
timeout = 180 #通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。
ignore nonreadable = yes #同步时跳过没有权限的目录
dont compress = *.gz *.tgz*.zip *.z *.Z *.rpm *.deb *.bz2 #传输时不压缩的文件
[ftp] #此名字即客户端使用rsync来同步的路径
path = /hdfs/project/ftp #实际需要同步的路径
ignore errors = yes #指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题
read only = no #表示可以pull
#write only = no #表示不可以push
hosts allow = 192.168.2.102 #客户端同步的地址多个 , 隔开
hosts deny = * #指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。
list = false #该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。
#uid = ftp-user #获取文件的身份
#gid = root
auth users = ftp-user #客户端获取文件的身份此用户并不是本机中确实存在的用户
secrets file = /etc/rsyncd.passwd #用来认证客户端的秘钥文件 格式 USERNAME:PASSWD 此文件权限一定改为600,且属主必须与运行rsync的用户一致。(需自行创建)
创建认证用户及密码文件
(对应配置文件中的参数 secrets file)
#vim /etc/rsyncd.passwd
ftp-user:Hdlh@123
#chmod 600 /etc/rsyncd.passwd
启动并后台运行
#rsync --daemon
#systemctl start rsyncd
#systemctl enable rsyncd
备份服务器配置
安装
#yum install rsync -y
认证用户及密码文件
(用来认证主服务器主机密码)
(只需要补充密码字段即可)
#echo “${passwd}” >> /hdfs/project/rsync/rsyncd.passwd
对应主服务器用户ftp-user的密码
修改权限
#chmod 600 /hdfs/project/rsync/rsyncd.passwd
文件传输
#rsync -avz --progress --password-file=/hdfs/project/rsync/rsyncd.passwdftp-user@192.168.2.122::ftp /rsync/
命令参数详解
-v,–verbose 详细模式输出
-z,–compress 对备份的文件在传输时进行压缩处理
-r,–recursive 对子目录以递归模式处理
-t,–times 保持文件时间信息
-o,–owner 保持文件属主信息
-p,–perms 保持文件权限
-g,–group 保持文件属组信息
–-progress显示传输进度
--delete删除客户端多余文件
-- password-file=/etc/rsyncd.passwd ftp-user@192.168.2.122::test
password-file=/etc/rsyncd.passwd:用来登录主服务器主机密码
ftp-user:登录主机用户
192.168.2.122:主服务器主机IP
ftp:主服务器配置文件中的模块名称
/rsync/:备份服务器本地存储目录
notify
主服务器
查看服务器内核是否支持 inotify
#ll /proc/sys/fs/inotify/
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
Inotify 可以监视的文件系统事件包括:
access,即文件被访问
modify,文件被 write
attrib,文件属性被修改,如 chmod、chown、touch 等
close_write,可写文件被 close
close_nowrite,不可写文件被 close
open,文件被 open
moved_from,文件被移走,如mv
moved_to,文件被移来,如 mv、cp
create,创建新文件
delete,文件被删除,如 rm
delete_self,自删除,即一个可执行文件在执行时删除自己
move_self,自移动,即一个可执行文件在执行时移动自己
unmount,宿主文件系统被 umount
close,文件被关闭,等同于(IN_CLOSE_WRITE |IN_CLOSE_NOWRITE)
move,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
安装
安装包:https://pkgs.org/download/inotify-tools
#rpm -ivh inotify-tools-3.14-9.el7.x86_64.rpm
脚本
#mkdir /hdfs/project/rsync#vim /hdfs/project/rsync/inotify.sh
#vim /hdfs/project/rsync/inotify.sh
host=192.168.2.102 #备份服务器
src=/hdfs/project/ftp/ #主文件端的目录,后面一定加上/ ,只同步目录下的所有递归,不加 / ,会同步整个目录,
des=ftp #主服务器rsyncd.conf配置参数
password=/etc/rsyncd.passwd #主服务器登录验证密码
user=ftp-user #用户
inotifywait=/usr/bin/inotifywait #命令
log=/hdfs/project/rsync/inotify.log #日志文件
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib$src | while read files;do
rsync -avzP --delete --timeout=100 --password-file=${password}$src $user@$host::$des
echo "${files}was rsynced" >> ${log} 2>&1
done
--delete参数:表示rsync同步前,暴力删除目标目录中的所有文件,然后再执行同步操作。
--delete-before参数:表示rsync同步前,会先对目标目录进行一次扫描检索,删除目标目录中对比源目录多出来的文件,在执行同步
启动脚本
#nohup bash inotify.sh &
#nohupcommand & :后台运行,关掉终端程序不会停止,还会继续运行
设置开机自启
#vim /etc/rc.d/rc.local
nohup/bin/bash /hdfs/project/rsync/inotify.sh
#chmod +x /etc/rc.local
Nginx
依赖
#yum install make zlib zlib-develgcc-c++ libtool openssl openssl-develpcre
安装
#./configure --prefix=/hdfs/project/nginx--user=ftp-user --with-http_ssl_module --with-http_gzip_static_module--with-http_stub_status_module --with-http_realip_module --with-stream--with-stream_realip_module
#make && make install
配置文件
user ftp-user;
worker_processes 1;
error_log logs/error.log;
pid nginx.pid;
worker_rlimit_nofile 51200;
events {
use epoll;
worker_connections 10240;
}
#http {
# include mime.types;
# include /hdfs/project/nginx/conf/conf.d/*.conf;
# default_type application/octet-stream;
#
# log_format real_ip '$remote_addr - $remote_user [$time_local] "$request" '
# '$status$body_bytes_sent "$http_referer" '
# '"$http_user_agent""$http_x_forwarded_for"';
#
# #access_log logs/access.log main;
#
# server_tokens off;
# sendfile on;
# tcp_nopush on;
# tcp_nodelay on;
#
# client_max_body_size 500M;
# client_header_buffer_size 128K;
# large_client_header_buffers 4 32k;
#
# keepalive_timeout 300;
# send_timeout 60;
#
# gzip on;
#}
stream {
log_format proxy'$proxy_protocol_addr $remote_addr [$time_local] '
'$protocol$status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received""$upstream_connect_time"';
upstream vsftp{
server 192.168.2.122:21 weight=99 max_fails=3 fail_timeout=30s;
# server 192.168.2.102:21 weight=99;
server 192.168.2.102:21 backup;
}
#max_fails=3 fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒...以此循环,直到恢复
#backup参数,backup 不能和ip_hash一起使用,backup 参数是指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机
server {
listen 21;
access_log logs/access-test.log proxy;
proxy_pass vsftp;
# proxy_protocol on;
}
#以下为被动模式端口的转发
#注意端口的一一对应关系(vsftpd.conf配置)
server {
listen 192.168.12.8:10000;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10000;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10001;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10001;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10002;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10002;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10003;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10003;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10004;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10004;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10005;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10005;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10006;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10006;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10007;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10007;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10008;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10008;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10009;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.122:10009;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10010;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10010;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10011;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10011;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10012;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10012;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10013;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10013;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10014;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10014;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10015;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10015;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10016;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10016;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10017;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10017;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10018;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10018;
# proxy_protocol on;
}
server {
listen 192.168.12.8:10019;
access_log logs/access-test.log proxy;
proxy_pass 192.168.2.102:10019;
# proxy_protocol on;
}
}
环境变量
#vim /etc/profile.d/nginx.sh
export NGINX_HOME=/tools/nginx
export PATH=$NGINX_HOME/sbin:$PATH
#chmod +x /etc/profile.d/nginx.sh
#source /etc/profile.d/nginx.sh
启动
#nginx