Category: CentOS

CentOS上如何把Web服务器从Apache换到Nginx

阿里云服务器上, 1G内存的配置,但用了一段时间,感觉Apache有些撑不出,想了想,还是换到目前最热门的Nginx吧。 这里把整个过程记录下来,与大家共享。

Nginx简介:

Nginx是一个高性能的HTTP服务器和反向代理服务器, 最大的优点是节省资源,适用于处理高并发的请求。

1. Nginx最初是按照反向代理设计的,和Apache不同, nginx关心如何处理url,而不是文件!

2. Apache 是个基于进程处理的web服务器,如果同时有多个请求,必须要启动多个进程来处理。 这样在高负载的情况下,资源的消耗和响应的速度都会有很大的问题。 而Nginx是个基于事件(event)的异步处理模式, 下面是Nginx的一个简单的示意图,有一个Master进程,Maste进程负责系统配置,管理socket,以及管理一个或是多个Worker进程。 而Worker进程接收和处理来自用户(浏览器)的请求。一般来讲,一个worker进程可以同时处理上千个用户的连接请求。每个worker进程采用异步的,基于event的方式来处理用户的请求。对于HTML的静态页面,Nginx会自行来处理,但对于PHP,JSP, Python等动态页面,Nginx是通过FastCGI(或者SCGI,UWSGI)来把动态页面的请求交给相应的处理程序来处理。

nginx

安装Nginx

需要注意的是,在CentOS的YUM的基础的容器中,并没有nginx和php-fpm的RPM包。这两个RMP包在epel的容器中, 虽然你可以从官网下载RPM包来安装,但我个人建议,如果你的CentOS/Redhat中没有加入YUM的epel容器,还是先把这个yum容器加上去比较好,以后可以省无数的折腾。epel具体的安装方法,我在 Redhat/CentOS 软件安装之RPM和YUM 这篇文章中有介绍。

yum的容器库中加入了epel容器后,在CentOS上安装Nginx就非常简单,运行下面的命令就可以了。

yum install nginx
安装玩以后,会发现Nginx的配置文件放在 /etc/nginx目录下, 一般在缺省的情况下,web的root目录会在/usr/share/ngxin/html中。

安装完nginx以后,我们要测试一下是否安装成功了.

如果之前已经安装过Apache的话,先要把Apache的服务停掉。

/etc/init.d/httpd stop #停掉apache服务
chkconfig httpd off #开机重启后,apache服务不再启动
这时候你在浏览器上输入 http://主机ip, 如果能出现nginx的测试页面 “Test page for the nginx http server on EPEL”就说明nginx已经正常运行了。

安装php-fpm

PHP-FPM (PHP-FastCGI Process Manager) 是目前最常用的一个PHP FastCGI的实现。通俗的讲,这个模块在Nginx和PHP之间桥梁,使之可以互相通信和交换。

安装及启动过程如下:

yum install php-fpm
/etc/init.d/php-fpm start
chkconfig php-fpm on
下一步是确认一下,nginx和php-fpm是否已经正常运行. 执行 netstat -tunlp 命令,会看到大约如下的一个界面。

可以看到nginx在监听80端口,而php-fpm在监听9000端口。

Screenshot

设置Nginx 和 PHP-FPM

我们假定这个主机上有两个网站,一个是aaa.com, 普通的PHP站点, 一个是bbb.com,为wordpress的博客。 我们就讨论一下在这种情况下,如何设置nginx.

首先为站点建立相应的目录

mkdir -p /var/www/aaa/html
mkdir -p /var/www/bbb/html
mkdir -p /var/log/nginx/aaa
mkdir -p /var/log/nginx/bbb
chown -R nginx:adm /var/www/aaa/html
chown -R nginx:adm /var/wwww/bbb/html
chown -R nginx:adm /var/log/nginx/aaa
chown -R nginx:adm /var/log/nginx/bbb
为两个网站分别设置虚拟目录(virtual directory)

为了保证整个配置更加清晰,我们尽量不修改主配置文件/etc/nginx/nginx.conf , 而是在在/etc/nginx/conf.d目录下建立两个文件,一个是aaa.conf, 一个是bbb.conf

其中aaa.conf的内容如下 (aaa是一个普通的php网站): 参考于: http://wiki.nginx.org/PHPFcgiExample

server {
listen 80 default_server; #当输入ip时,会访问aaa.com
server_name www.aaa.com aaa.com *.aaa.com; #这个应该是最好的写法了
access_log /var/log/nginx/aaa/access.log; #access_log属于ngx_http_log_module的设置, 缺省level为info
error_log /var/log/nginx/aaa/error.log; #error_log属于core module, 缺省的level是error
location / {
root /var/www/aaa/html;
index index.php index.html index.htm; #由于是PHP类型的动态页面为主,所以把index.php放在前面效率会更高些
# try_files $uri $uri/ /index.php?$args; #普通php网站因为没有rewrite的话,这个不需要
}
error_page 404 /404.html; #error_page errcode uri (也就是说出现了404错误,会请求/404.html)
location = /404.html { #这是一个典型的location
root /var/www/aaa/html;
}
#redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/aaa/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# 因为我们不用Nginx做Apache的反向代理,所以不需要这个
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 这种写法可以防止把恶意程序伪装成.jpg之类的攻击,(其实有个更简单的方法,就是把php.ini中的cgi.fix_pathinfo=0,但有时候简单的修改cgi.fix_pathinfo会造成有的php脚本出错)
location ~ [^/]\.php(/|$) {
root /var/www/aaa/html;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
#try_files $uri =404; #这个try_files说明:对于.php文件,直接执行$uri, 如果找不到这个$uri,直接给出404错误,(和 location / 定义不同!),主要是为了防止 伪装成图片的攻击 (目前看,最安全的方式,是用上面那一句话,官方推荐的)
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
#
location ~ /\.ht {
deny all;
}
设置完aaa.com的环境后,还需要设置bbb.com的 nginx的配置,因为bbb.com是wordpress的站点, 除了和aaa.com相同的设置外,还有些特殊的设置,具体设置请参考 http://codex.wordpress.org/Nginx

至此,从Apache向Nginx的移植基本完成。

SSH/SSL 源码编译安装详解

环境:CentOS 6.7
安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复;
解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过)。
当前版本:OpenSSH_5.3p1, OpenSSL 1.0.1e-fips
当前最新版本:OpenSSH_7.3p1, OpenSSL 1.0.2h

1.查看SSH/SSL当前版本
2.下载最新的SSH/SSL
3.源码编译安装SSL
4.源码编译安装SSH
5.删除SSL旧版本
6.写在后面
1.查看SSH/SSL当前版本

查看SSH/SSL当前版本:
ssh -V
openssl version

[root@test0823 ~]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

[root@test0823 ssh]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
备份ssh配置文件:
tar zcvf /etc/ssh.tar.gz /etc/ssh/

[root@test0823 ~]# tar zcvf /etc/ssh.tar.gz /etc/ssh/
ssh/
ssh/ssh_host_dsa_key.pub
ssh/ssh_host_rsa_key.pub
ssh/ssh_host_rsa_key
ssh/sshd_config
ssh/ssh_config
ssh/moduli
ssh/ssh_host_dsa_key
ssh/ssh_host_key.pub
ssh/ssh_host_key
2.下载最新的SSH/SSL

目前最新版本:
OpenSSH_7.3p1, OpenSSL 1.0.2h
本次安装介质:
链接: http://pan.baidu.com/s/1eRW3ytc 密码: 46sy
SSH/SSL安装配置参考:
SSL安装:
参考 http://www.linuxfromscratch.org/blfs/view/svn/postlfs/openssl.html
SSH安装:
参考 http://www.linuxfromscratch.org/blfs/view/svn/postlfs/openssh.html

3.源码编译安装SSL

本次测试所有源码包均默认上传到服务器的/root目录下。
需要先安装SSL,再安装SSH

3.1 解压SSL源码包

[root@test0823 ~]# tar -zxvf openssl-1.0.2h.tar.gz
[root@test0823 ~]# cd openssl-1.0.2h
3.2 配置并编译

复制下面的命令执行:

./config –prefix=/usr \
–openssldir=/etc/ssl \
–libdir=lib \
shared \
zlib-dynamic &&
make depend &&
make
操作如下:

[root@test0823 openssl-1.0.2h]# ./config –prefix=/usr \
> –openssldir=/etc/ssl \
> –libdir=lib \
> shared \
> zlib-dynamic &&
> make depend &&
> make
3.3 安装SSL

复制下面的命令执行:

make MANDIR=/usr/share/man MANSUFFIX=ssl install &&
install -dv -m755 /usr/share/doc/openssl-1.0.2h &&
cp -vfr doc/* /usr/share/doc/openssl-1.0.2h
操作如下:

[root@test0823 openssl-1.0.2h]# make MANDIR=/usr/share/man MANSUFFIX=ssl install &&
> install -dv -m755 /usr/share/doc/openssl-1.0.2h &&
> cp -vfr doc/* /usr/share/doc/openssl-1.0.2h
3.4 验证SSL版本

openssl version

操作如下:

[root@test0823 openssl-1.0.2h]# openssl version
OpenSSL 1.0.2h 3 May 2016
[root@test0823 openssl-1.0.2h]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
4.源码编译安装SSH

4.1 解压SSH源码包

[root@test0823 ~]# tar -zxvf openssh-7.3p1.tar.gz
[root@test0823 ~]# cd openssh-7.3p1
4.2 配置

4.2.1 配置前准备

复制下面的命令执行:

install -v -m700 -d /var/lib/sshd &&
chown -v root:sys /var/lib/sshd &&

groupadd -g 50 sshd &&
useradd -c ‘sshd PrivSep’ \
-d /var/lib/sshd \
-g sshd \
-s /bin/false \
-u 50 sshd
操作如下:

[root@test0823 openssh-7.3p1]# install -v -m700 -d /var/lib/sshd &&
> chown -v root:sys /var/lib/sshd &&
>
> groupadd -g 50 sshd &&
> useradd -c ‘sshd PrivSep’ \
> -d /var/lib/sshd \
> -g sshd \
> -s /bin/false \
> -u 50 sshd
4.2.2 配置并编译

复制下面的命令执行:

./configure –prefix=/usr \
–sysconfdir=/etc/ssh \
–with-md5-passwords \
–with-privsep-path=/var/lib/sshd &&
make
操作如下:

[root@test0823 openssh-7.3p1]# ./configure –prefix=/usr \
> –sysconfdir=/etc/ssh \
> –with-md5-passwords \
> –with-privsep-path=/var/lib/sshd &&
> make
4.3 安装SSH

复制下面的命令执行:

make install &&
install -v -m755 contrib/ssh-copy-id /usr/bin &&

install -v -m644 contrib/ssh-copy-id.1 \
/usr/share/man/man1 &&
install -v -m755 -d /usr/share/doc/openssh-7.3p1 &&
install -v -m644 INSTALL LICENCE OVERVIEW README* \
/usr/share/doc/openssh-7.3p1
操作如下:

[root@test0823 openssh-7.3p1]# make install &&
> install -v -m755 contrib/ssh-copy-id /usr/bin &&
>
> install -v -m644 contrib/ssh-copy-id.1 \
> /usr/share/man/man1 &&
> install -v -m755 -d /usr/share/doc/openssh-7.3p1 &&
> install -v -m644 INSTALL LICENCE OVERVIEW README* \
> /usr/share/doc/openssh-7.3p1
4.4 验证SSH版本

[root@test0823 openssh-7.3p1]# ssh -V
OpenSSH_7.3p1, OpenSSL 1.0.2h 3 May 2016
4.5 重启sshd服务

将之前的sshd重命名备份,做一个sshd的软连接:

mv /usr/sbin/sshd /usr/sbin/sshd.OFF
ln -s /root/openssh-7.3p1/sshd /usr/sbin/sshd
使用 service sshd restart 重启一下服务

[root@test0823 openssh-7.3p1]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: /etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
/etc/ssh/sshd_config line 97: Unsupported option UsePAM
[ OK ]
上面的报错并不影响sshd正常启动,为了不再显示上述提示,可以注释掉相关配置行:
vi /etc/ssh/sshd_config
注释掉 81,83,97 三行。

再次重启sshd服务就不会有那三行的提示报错。

允许root用户ssh登录(默认可能就是允许,如果不允许,可以在文件末尾追加下面的一行配置到配置文件,或者直接vi编辑修改)

echo “PermitRootLogin yes” >> /etc/ssh/sshd_config
5.删除SSL旧版本

之前没有删除旧版本的SSL,SSH是因为不了解相关联的程序,
但是最后扫描发现如果不删除旧版本的SSL,某盟的扫描依然会扫出SSL的系列漏洞。

查看rpm安装的openssl相关包:

rpm -qa|grep openssl
对旧版本的SSL(这里是openssl-1.0.1e-42.el6.x86_64)进行删除:
rpm -e openssl-1.0.1e-42.el6.x86_64
直接尝试删除会提示如下库文件的依赖:

[root@test0823 ~]# rpm -e openssl-1.0.1e-42.el6.x86_64
error: Failed dependencies:
libcrypto.so.10()(64bit) is needed by (installed) qt-1:4.6.2-28.el6_5.x86_64
libcrypto.so.10()(64bit) is needed by (installed) libarchive-2.8.3-4.el6_2.x86_64
libcrypto.so.10()(64bit) is needed by (installed) libssh2-1.4.2-1.el6_6.1.x86_64
libcrypto.so.10()(64bit) is needed by (installed) wget-1.12-5.el6_6.1.x86_64
libcrypto.so.10()(64bit) is needed by (installed) wpa_supplicant-1:0.7.3-6.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) bind-libs-32:9.8.2-0.37.rc1.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) bind-utils-32:9.8.2-0.37.rc1.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) mysql-libs-5.1.73-5.el6_6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) fipscheck-1.2.0-7.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) httpd-tools-2.2.15-45.el6.centos.x86_64
libcrypto.so.10()(64bit) is needed by (installed) cyrus-sasl-md5-2.1.23-15.el6_6.2.x86_64
libcrypto.so.10()(64bit) is needed by (installed) gnome-vfs2-2.24.2-6.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) ptlib-2.6.5-3.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) opal-3.6.6-4.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) python-libs-2.6.6-64.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) python-ldap-0:2.3.10-1.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) pyOpenSSL-0.13.1-2.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) net-snmp-libs-1:5.5-54.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) evolution-data-server-2.32.3-23.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) gstreamer-plugins-bad-free-0.10.19-3.el6_5.x86_64
libcrypto.so.10()(64bit) is needed by (installed) xorg-x11-server-Xorg-1.15.0-36.el6.centos.x86_64
libcrypto.so.10()(64bit) is needed by (installed) hplip-libs-3.14.6-3.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) ntpdate-4.2.6p5-5.el6.centos.x86_64
libcrypto.so.10()(64bit) is needed by (installed) ntp-4.2.6p5-5.el6.centos.x86_64
libcrypto.so.10()(64bit) is needed by (installed) certmonger-0.77.5-1.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) cyrus-sasl-2.1.23-15.el6_6.2.x86_64
libcrypto.so.10()(64bit) is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
libcrypto.so.10()(64bit) is needed by (installed) hpijs-1:3.14.6-3.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) ekiga-3.2.6-4.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) gnome-vfs2-smb-2.24.2-6.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) tcpdump-14:4.0.0-5.20090921gitdf3cb4.2.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) vsftpd-2.2.2-14.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) openssh-5.3p1-111.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) openssh-server-5.3p1-111.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) openssh-clients-5.3p1-111.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) pyOpenSSL-0.13.1-2.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) net-snmp-libs-1:5.5-54.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) ntpdate-4.2.6p5-5.el6.centos.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) ntp-4.2.6p5-5.el6.centos.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) openssh-5.3p1-111.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) openssh-server-5.3p1-111.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1)(64bit) is needed by (installed) openssh-clients-5.3p1-111.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) is needed by (installed) certmonger-0.77.5-1.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) is needed by (installed) openssh-5.3p1-111.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) is needed by (installed) openssh-server-5.3p1-111.el6.x86_64
libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) is needed by (installed) openssh-clients-5.3p1-111.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) qt-1:4.6.2-28.el6_5.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) libssh2-1.4.2-1.el6_6.1.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) wget-1.12-5.el6_6.1.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) wpa_supplicant-1:0.7.3-6.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) bind-libs-32:9.8.2-0.37.rc1.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) mysql-libs-5.1.73-5.el6_6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) httpd-tools-2.2.15-45.el6.centos.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) cyrus-sasl-md5-2.1.23-15.el6_6.2.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) python-libs-2.6.6-64.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) pyOpenSSL-0.13.1-2.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) net-snmp-libs-1:5.5-54.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) gstreamer-plugins-bad-free-0.10.19-3.el6_5.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) xorg-x11-server-Xorg-1.15.0-36.el6.centos.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) ntpdate-4.2.6p5-5.el6.centos.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) ntp-4.2.6p5-5.el6.centos.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) certmonger-0.77.5-1.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) cyrus-sasl-2.1.23-15.el6_6.2.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) tcpdump-14:4.0.0-5.20090921gitdf3cb4.2.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) vsftpd-2.2.2-14.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) openssh-5.3p1-111.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) openssh-server-5.3p1-111.el6.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by (installed) openssh-clients-5.3p1-111.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) qt-1:4.6.2-28.el6_5.x86_64
libssl.so.10()(64bit) is needed by (installed) libssh2-1.4.2-1.el6_6.1.x86_64
libssl.so.10()(64bit) is needed by (installed) wget-1.12-5.el6_6.1.x86_64
libssl.so.10()(64bit) is needed by (installed) wpa_supplicant-1:0.7.3-6.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) mysql-libs-5.1.73-5.el6_6.x86_64
libssl.so.10()(64bit) is needed by (installed) httpd-tools-2.2.15-45.el6.centos.x86_64
libssl.so.10()(64bit) is needed by (installed) gnome-vfs2-2.24.2-6.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) ptlib-2.6.5-3.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) opal-3.6.6-4.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) python-libs-2.6.6-64.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) python-ldap-0:2.3.10-1.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) pyOpenSSL-0.13.1-2.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) evolution-data-server-2.32.3-23.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) gstreamer-plugins-bad-free-0.10.19-3.el6_5.x86_64
libssl.so.10()(64bit) is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
libssl.so.10()(64bit) is needed by (installed) ekiga-3.2.6-4.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) gnome-vfs2-smb-2.24.2-6.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) vsftpd-2.2.2-14.el6.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) qt-1:4.6.2-28.el6_5.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) wget-1.12-5.el6_6.1.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) wpa_supplicant-1:0.7.3-6.el6.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) mysql-libs-5.1.73-5.el6_6.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) httpd-tools-2.2.15-45.el6.centos.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) python-libs-2.6.6-64.el6.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) pyOpenSSL-0.13.1-2.el6.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by (installed) vsftpd-2.2.2-14.el6.x86_64
openssl is needed by (installed) postfix-2:2.6.6-6.el6_5.x86_64
记录好依赖的这两个库文件

libcrypto.so.10
libssl.so.10
然后忽略依赖删除:

rpm -e –nodeps openssl-1.0.1e-42.el6.x86_64
做新的软连接映射:

[root@test0823 openssl-1.0.2h]# ln -s /root/openssl-1.0.2h/libssl.so.1.0.0 /usr/lib64/libssl.so.10
[root@test0823 openssl-1.0.2h]# ln -s /root/openssl-1.0.2h/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.10
如果是最后删除的openssl,那么还需要注意openssl软连接的情况,如下:

[root@test0823 apps]# ln -s /root/openssl-1.0.2h/apps/openssl /usr/bin/openssl
然后再次扫描已经没有SSL相关漏洞了。

阿里云APACHE部署ssl配置详解

阿里云后台申请免费SSL
上传文件后审核通过!下载apache ssl文件
解压

阿里云SSL证书文件
阿里云SSL证书文件

2.3安装SSL证书 
1、找到apache安装目录下conf.d目录中的ssl.conf文件,若没有,则apache没有编译SSL
2、打开apache安装目录下conf.d目录中的ssl.conf文件
在配置文件中查找以下配置语句:
# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol TLSv1 TLSv1.1 TLSv1.2
# 证书公钥配置
SSLCertificateFile cert/public.pem
# 证书私钥配置
SSLCertificateKeyFile cert/214015281090324.key
# 证书链配置,如果该属性开头有 ‘#’字符,请删除掉
SSLCertificateChainFile cert/chain.pem
配置conf.d/ssl.conf
DocumentRoot “/var/www/html”
ServerName www.domain.com

在httpd.cond 里面添加跳转
RedirectMatch permanent ^/(.*) https://www.domain.com/$1

到此重启 service httpd restart 完成跳转

apache部署ssl证书启用https

Apache 2.x 证书部署
1.1 获取证书
Apache文件夹内获得证书文件 1_root_bundle.crt,2_www.domain.com_cert.crt 和私钥文件 3_www.domain.com.key,
1_root_bundle.crt 文件包括一段证书代码 “—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”,
2_www.domain.com_cert.crt 文件包括一段证书代码 “—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”,
3_www.domain.com.key 文件包括一段私钥代码“—–BEGIN RSA PRIVATE KEY—–”和“—–END RSA PRIVATE KEY—–”。
1.2 证书安装
编辑Apache根目录下 conf/httpd.conf 文件,
找到 #LoadModule ssl_module modules/mod_ssl.so 和 #Include conf/extra/httpd-ssl.conf,去掉前面的#号注释;
编辑Apache根目录下 conf/extra/httpd-ssl.conf 文件,修改如下内容:

DocumentRoot “/var/www/html”
ServerName www.domain.com
SSLEngine on
SSLCertificateFile /usr/local/apache/conf/2_www.domain.com_cert.crt
SSLCertificateKeyFile /usr/local/apache/conf/3_www.domain.com.key
SSLCertificateChainFile /usr/local/apache/conf/1_root_bundle.crt

配置完成后,重新启动 Apache 就可以使用https://www.domain.com来访问了。
注:
配置文件参数 说明
SSLEngine on 启用SSL功能
SSLCertificateFile 证书文件
SSLCertificateKeyFile 私钥文件
SSLCertificateChainFile 证书链文件

RSync实现文件备份同步

rsync实现网站的备份,文件的同步,不同系统的文件的同步,如果是windows的话,需要windows版本cwrsync]

一、什么是rsync

  rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
  rsync 包括如下的一些特性:

  能更新整个目录和树和文件系统;
  有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  对于安装来说,无任何特殊权限要求;
  对于多个文件来说,内部流水线减少文件等待的延时;
  能用rsh、ssh 或直接端口做为传输入端口;
  支持匿名rsync 同步文件,是理想的镜像工具;

二、架设rsync服务器

  架设rsync 服务器比较简单,写一个配置文件rsyncd.conf 。文件的书写也是有规则的,我们可以参照rsync.samba.org 上的文档来做。当然我们首先要安装好rsync这个软件才行;

A、rsync的安装;

  获取rsync

  rysnc的官方网站:http://rsync.samba.org/可以从上面得到最新的版本。目前最新版是3.05。当然,因为rsync是一款如此有用的软件,所以很多Linux的发行版本都将它收录在内了。

  软件包安装

  # sudo apt-get install rsync 注:在debian、ubuntu 等在线安装方法;
  # yum install rsync 注:Fedora、Redhat 等在线安装方法;
  # rpm -ivh rsync 注:Fedora、Redhat 等rpm包安装方法;

  其它Linux发行版,请用相应的软件包管理方法来安装。

  源码包安装

  tar xvf rsync-xxx.tar.gz
  cd rsync-xxx
  ./configure –prefix=/usr ;make ;make install 注:在用源码包编译安装之前,您得安装gcc等编译开具才行;
    
B、配置文件

  rsync的主要有以下三个配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息)

  服务器配置文件(/etc/rsyncd.conf),该文件默认不存在,请创建它。

  具体步骤如下:

  #touch /etc/rsyncd.conf #创建rsyncd.conf,这是rsync服务器的配置文件。
  #touch /etc/rsyncd.secrets #创建rsyncd.secrets ,这是用户密码文件。
  #chmod 600 /etc/rsyncd/rsyncd.secrets #将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!
  #touch /etc/rsyncd.motd

  下一就是我们修改rsyncd.conf和rsyncd.secrets和rsyncd.motd文件的时候了。

  设定/etc/rsyncd.conf

  rsyncd.conf是rsync服务器主要配置文件。我们先来个简单的示例,后面在详细说明各项作用。

  比如我们要备份服务器上的/home和/opt,在/home中我想把easylife和samba目录排除在外;

  # Distributed under the terms of the GNU General Public License v2
  # Minimal configuration file for rsync daemon
  # See rsync(1) and rsyncd.conf(5) man pages for help

  # This line is required by the /etc/init.d/rsyncd script
  pid file = /var/run/rsyncd.pid
  port = 873
  address = 192.168.1.171
  #uid = nobody
  #gid = nobody
  uid = root
  gid = root

  use chroot = yes
  read only = yes

  #limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
  hosts deny=*

  max connections = 5
  motd file = /etc/rsyncd.motd

  #This will give you a separate log file
  #log file = /var/log/rsync.log

  #This will log every file transferred – up to 85,000+ per user, per sync
  #transfer logging = yes

  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300

  [rhel4home]
  path = /home
  list=yes
  ignore errors
  auth users = root
  secrets file = /etc/rsyncd.secrets
  comment = This is RHEL 4 data
  exclude = easylife/ samba/

  [rhel4opt]
  path = /opt
  list=no
  ignore errors
  comment = This is RHEL 4 opt
  auth users = easylife
  secrets file = /etc/rsyncd/rsyncd.secrets

  注:关于auth users是必须在服务器上存在的真实的系统用户,如果你想用多个用户以,号隔开,比如auth users = easylife,root

  设定密码文件

  密码文件格式很简单,rsyncd.secrets的内容格式为:

  用户名:密码

  我们在例子中rsyncd.secrets的内容如下类似的;在文档中说,有些系统不支持长密码,自己尝试着设置一下吧。

  easylife:keer
  root:mike

  chown root.root rsyncd.secrets  #修改属主
  chmod 600 rsyncd.secrets #修改权限

  注:1、将rsyncd.secrets这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功! 出于安全目的,文件的属性必需是只有属主可读。
    2、这里的密码值得注意,为了安全你不能把系统用户的密码写在这里。比如你的系统用户easylife密码是000000,为了安全你可以让rsync中的easylife为keer。这和samba的用户认证的密码原理是差不多的。

  设定rsyncd.motd 文件;

   它是定义rysnc服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等;类似ftp服务器登录时,我们所看到的 linuxsir.org ftp ……。 当然这在全局定义变量时,并不是必须的,你可以用#号注掉,或删除;我在这里写了一个 rsyncd.motd的内容为:

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002——2009
  ++++++++++++++++++++++++++++++++++++++++++++++

三、rsyncd.conf服务器的配置详解

A、全局定义

  在rsync 服务器中,全局定义有几个比较关健的,根据我们前面所给的配置文件 rsyncd.conf 文件;

  pid file = /var/run/rsyncd.pid 注:告诉进程写到 /var/run/rsyncd.pid 文件中;
  port = 873 注:指定运行端口,默认是873,您可以自己指定;
  address = 192.168.1.171 注:指定服务器IP地址
  uid = nobody
  gid = nobdoy

   注:服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。

  use chroot = yes

   注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容;这个需要自己来尝 试

  read only = yes

  注:read only 是只读选择,也就是说,不让客户端上传文件到服务器上。还有一个 write only选项,自己尝试是做什么用的吧;

  #limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0

  注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开;

  max connections = 5

  注:客户端最多连接数

  motd file = /etc/rsyncd/rsyncd.motd

  注:motd file 是定义服务器信息的,要自己写 rsyncd.motd 文件内容。当用户登录时会看到这个信息。比如我写的是:

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
2002——2009
  ++++++++++++++++++++++++++++++++++++++++++++++

  log file = /var/log/rsync.log

  注:rsync 服务器的日志;

  transfer logging = yes

  注:这是传输文件的日志

  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300

B、模块定义

   模块定义什么呢?主要是定义服务器哪个目录要被同步。每个模块都要以[name]形式。这个名字就是在rsync 客户端看到的名字,其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过path 指定的。我们可以根据自己的需要,来指定多个模块。每个模块要指定认证用户,密码文件、但排除并不是必须的

  下面是前面配置文件模块的例子:

  [rhel4home] #模块它为我们提供了一个链接的名字,在本模块中链接到了/home目录;要用[name] 形式

  path = /home #指定文件目录所在位置,这是必须指定的
  auth users = root #认证用户是root ,是必须在服务器上存在的用户
  list=yes #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了;
  ignore errors #忽略IO错误
  secrets file = /etc/rsyncd.secrets #密码存在哪个文件
  comment = linuxsir home data #注释可以自己定义
  exclude = beinan/ samba/

  注:exclude是排除的意思,也就是说,要把/home目录下的easylife和samba排除在外; easylife/和samba/目录之间有空格分开

  [rhel4opt]
  path = /opt
  list=no
  comment = optdir
  auth users = beinan
  secrets file = /etc/rsyncd/rsyncd.secrets
  ignore errors

四、启动rsync服务器及防火墙的设置

  启动rsync服务器相当简单,有以下几种方法

  A、–daemon参数方式,是让rsync以服务器模式运行

  #/usr/bin/rsync –daemon –config=/etc/rsyncd/rsyncd.conf  #–config用于指定rsyncd.conf的位置,如果在/etc下可以不写

  B、xinetd方式

  修改services加入如下内容
  # nano -w /etc/services

  rsync  873/tcp  # rsync
  rsync  873/udp  # rsync

  这一步一般可以不做,通常都有这两行(我的RHEL4和GENTOO默认都有)。修改的目的是让系统知道873端口对应的服务名为rsync。如没有的话就自行加入。

  设定 /etc/xinetd.d/rsync, 简单例子如下:

  # default: off
  # description: The rsync server is a good addition to am ftp server, as it \
  # allows crc checksumming etc.
  service rsync
  {
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = –daemon
log_on_failure += USERID
  }

  上述, 主要是要打开rsync這個daemon, 一旦有rsync client要连接時, xinetd会把它转介給 rsyncd(port 873)。然后service xinetd restart, 使上述设定生效.

  rsync服务器和防火墙

  Linux 防火墙是用iptables,所以我们至少在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。

  #iptables -A INPUT -p tcp -m state –state NEW -m tcp –dport 873 -j ACCEPT
  #iptables -L 查看一下防火墙是不是打开了 873端口

  如果你不太懂防火墙的配置,可以先service iptables stop 将防火墙关掉。当然在生产环境这是很危险的,做实验才可以这么做哟!
五、通过rsync客户端来同步数据

A、语法详解
 
  在配置完rsync服务器后,就可以从客户端发出rsync命令来实现各种同步的操作。rsync有很多功能选项,下面就对介绍一下常用的选项:

  rsync的命令格式可以为:
  
  1. rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST
  2. rsync [OPTION]… [USER@]HOST:SRC DEST
  3. rsync [OPTION]… SRC [SRC]… DEST
  4. rsync [OPTION]… [USER@]HOST::SRC [DEST]
  5. rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST
  6. rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]

  rsync有六种不同的工作模式:

  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。
  2.使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。
  3.使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
  -a 以archive模式操作、复制目录、符号连接 相当于-rlptgoD

  rsync中的参数

  -r 是递归
  -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
  -z 传输时压缩;
  -P 传输进度;
  -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;
  -e ssh的参数建立起加密的连接。
  -u只进行更新,防止本地新文件被重写,注意两者机器的时钟的同时
  –progress是指显示出详细的进度情况
  –delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
  –password-file=/password/path/file来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读。

B、一些实例

  B1、列出rsync 服务器上的所提供的同步内容;

  首先:我们看看rsync服务器上提供了哪些可用的数据源

  # rsync –list-only root@192.168.145.5::
  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
   2002——2009
  ++++++++++++++++++++++++++++++++++++++++++++++

  rhel4home This is RHEL 4 data

   注:前面是rsync所提供的数据源,也就是我们在rsyncd.conf中所写的[rhel4home]模块。而“This is RHEL 4 data”是由[rhel4home]模块中的 comment = This is RHEL 4 data 提供的;为什么没有把rhel4opt数据源列出来呢?因为我们在[rhel4opt]中已经把list=no了。

  $ rsync –list-only root@192.168.145.5::::rhel4home

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
   2002——2009
  ++++++++++++++++++++++++++++++++++++++++++++++

  Password:
  drwxr-xr-x 4096 2009/03/15 21:33:13 .
  -rw-r–r– 1018 2009/03/02 02:33:41 ks.cfg
  -rwxr-xr-x 21288 2009/03/15 21:33:13 wgetpaste
  drwxrwxr-x 4096 2008/10/28 21:04:05 cvsroot
  drwx—— 4096 2008/11/30 16:30:58 easylife
  drwsr-sr-x 4096 2008/09/20 22:18:05 giddir
  drwx—— 4096 2008/09/29 14:18:46 quser1
  drwx—— 4096 2008/09/27 14:38:12 quser2
  drwx—— 4096 2008/11/14 06:10:19 test
  drwx—— 4096 2008/09/22 16:50:37 vbird1
  drwx—— 4096 2008/09/19 15:28:45 vbird2

  后面的root@ip中,root是指定密码文件中的用户名,之后的::rhel4home这是rhel4home模块名
  B2、rsync客户端同步数据;

  #rsync -avzP root@192.168.145.5::rhel4home rhel4home
  Password: 这里要输入root的密码,是服务器端rsyncd.secrets提供的。在前面的例子中我们用的是mike,输入的密码并不回显,输好就回车。

   注: 这个命令的意思就是说,用root用户登录到服务器上,把rhel4home数据,同步到本地当前目录rhel4home上。当然本地的目录是可以你自己 定义的。如果当你在客户端上当前操作的目录下没有rhel4home这个目录时,系统会自动为你创建一个;当存在rhel4home这个目录中,你要注意 它的写权限。

  #rsync -avzP –delete linuxsir@linuxsir.org::rhel4home rhel4home

   这回我们引入一个–delete 选项,表示客户端上的数据要与服务器端完全一致,如果 linuxsirhome目录中有服务器上不存在的文件,则删除。最终目的是让linuxsirhome目录上的数据完全与服务器上保持一致;用的时候要 小心点,最好不要把已经有重要数所据的目录,当做本地更新目录,否则会把你的数据全部删除;

  設定 rsync client

  设定密码文件

  #rsync -avzP –delete –password-file=rsyncd.secrets root@192.168.145.5::rhel4home rhel4home

  这次我们加了一个选项 –password-file=rsyncd.secrets,这是当我们以root用户登录rsync服务器同步数据时,密码将读取rsyncd.secrets这个文件。这个文件内容只是root用户的密码。我们要如下做;

  # touch rsyncd.secrets
  # chmod 600 rsyncd.secrets
  # echo “mike”> rsyncd.secrets

  # rsync -avzP –delete –password-file=rsyncd.secrets root@192.168.145.5::rhel4home rhel4home

  注:这里需要注意的是这份密码文件权限属性要设得只有属主可读。

    这样就不需要密码了;其实这是比较重要的,因为服务器通过crond 计划任务还是有必要的;

  B3、让rsync客户端自动与服务器同步数据

   服务器是重量级应用,所以数据的网络备份还是极为重要的。我们可以在生产型服务器上配置好rsync 服务器。我们可以把一台装有rysnc机器当做是备份服务器。让这台备份服务器,每天在早上4点开始同步服务器上的数据;并且每个备份都是完整备份。有时 硬盘坏掉,或者服务器数据被删除,完整备份还是相当重要的。这种备份相当于每天为服务器的数据做一个镜像,当生产型服务器发生事故时,我们可以轻松恢复数 据,能把数据损失降到最低;是不是这么回事??

  step1:创建同步脚本和密码文件
  
  #mkdir /etc/cron.daily.rsync
  #cd /etc/cron.daily.rsync
  #touch rhel4home.sh rhel4opt.sh
  #chmod 755 /etc/cron.daily.rsync/*.sh
  #mkdir /etc/rsyncd/
  #touch /etc/rsyncd/rsyncrhel4root.secrets
  #touch /etc/rsyncd/rsyncrhel4easylife.secrets
  #chmod 600 /etc/rsyncd/rsync.*

   注: 我们在 /etc/cron.daily/中创建了两个文件rhel4home.sh和rhel4opt.sh ,并且是权限是755的。创建了两个密码文件root用户用的是rsyncrhel4root.secrets ,easylife用户用的是 rsyncrhel4easylife.secrets,权限是600;

  我们编辑rhel4home.sh,内容是如下的:

  #!/bin/sh
  #backup 192.168.145.5:/home
  /usr/bin/rsync -avzP –password-file=/etc/rsyncd/rsyncrhel4root.password root@192.168.145.5::rhel4home /home/rhel4homebak/$(date +’%m-%d-%y’)

  我们编辑 rhel4opt.sh ,内容是:

  #!/bin/sh
  #backup 192.168.145.5:/opt
  /usr/bin/rsync -avzP –password-file=/etc/rsyncd/rsyncrhel4easylife.secrets easylife@192.168.145.5::rhel4opt /home/rhel4hoptbak/$(date +’%m-%d-%y’)

  注:你可以把rhel4home.sh和rhel4opt.sh的内容合并到一个文件中,比如都写到rhel4bak.sh中;

  接着我们修改 /etc/rsyncd/rsyncrhel4root.secrets和rsyncrhel4easylife.secrets的内容;

  # echo “mike” > /etc/rsyncd/rsyncrhel4root.secrets
  # echo “keer”> /etc/rsyncd/rsyncrhel4easylife.secrets

   然后我们再/home目录下创建rhel4homebak 和rhel4optbak两个目录,意思是服务器端的rhel4home数据同步到备份服务器上的/home/rhel4homebak 下,rhel4opt数据同步到 /home/rhel4optbak/目录下。并按年月日归档创建目录;每天备份都存档;

  #mkdir /home/rhel4homebak
  #mkdir /home/rhel4optbak

  step2:修改crond服务器的配置文件 加入到计划任务

  #crontab -e

  加入下面的内容:

  # Run daily cron jobs at 4:10 every day backup rhel4 data:
  10 4 * * * /usr/bin/run-parts /etc/cron.daily.rsync 1> /dev/null

  注:第一行是注释,是说明内容,这样能自己记住。
    第二行表示在每天早上4点10分的时候,运行 /etc/cron.daily.rsync 下的可执行脚本任务;
    
  配置好后,要重启crond 服务器;

  # killall crond 注:杀死crond 服务器的进程;
  # ps aux |grep crond 注:查看一下是否被杀死;
  # /usr/sbin/crond 注:启动 crond 服务器;
  # ps aux |grep crond 注:查看一下是否启动了?
  root 3815 0.0 0.0 1860 664 ? S 14:44 0:00 /usr/sbin/crond
  root 3819 0.0 0.0 2188 808 pts/1 S+ 14:45 0:00 grep crond

六、FAQ

  Q:如何通过ssh进行rsync,而且无须输入密码?

  A:可以通过以下几个步骤

  1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
  2. 在server B上的home目录建立子目录.ssh
  3. 将A的identity.pub拷贝到server B上
  4. 将identity.pub加到~[user b]/.ssh/authorized_keys
  5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了。e.g. ssh -l userB serverB。这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

  Q:如何通过在不危害安全的情况下通过防火墙使用rsync?
  
  A:解答如下:

   这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd 仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防 火墙打开TCP端口22的ssh外发连接就ok了。

  Q:我能将更改过或者删除的文件也备份上来吗?

  A:当然可 以。你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 …这样的命令来实现。这样如果源文件:/path/to/some/file.c改变了,那么旧的文件就会被移到./backup- 2000-2-13/path/to/some/file.c,这里这个目录需要自己手工建立起来

  Q:我需要在防火墙上开放哪些端口以适应rsync?
 
  A:视情况而定。rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口:
  
  rsync –port 8730 otherhost::
  或者
  rsync -e ‘ssh -p 2002’ otherhost:

  Q:我如何通过rsync只复制目录结构,忽略掉文件呢?
  
  A:rsync -av –include ‘*/’ –exclude ‘*’ source-dir dest-dir

  Q:为什么我总会出现”Read-only file system”的错误呢?

  A:看看是否忘了设”read only = no”了

  Q:为什么我会出现’@ERROR: invalid gid’的错误呢?

  A:rsync使用时默认是用uid=nobody;gid=nobody来运行的,如果你的系统不存在nobody组的话,就会出现这样的错误,可以试试gid = ogroup或者其它

  Q:绑定端口873失败是怎么回事?
  A:如果你不是以root权限运行这一守护进程的话,因为1024端口以下是特权端口,会出现这样的错误。你可以用–port参数来改变。

  Q:为什么我认证失败?
  A:从你的命令行看来:你用的是

  > bash$ rsync -a 144.16.251.213::test test
  > Password:
  > @ERROR: auth failed on module test
  >
  > I dont understand this. Can somebody explain as to how to acomplish this.
  > All suggestions are welcome.

  应该是没有以你的用户名登陆导致的问题,试试rsync -a max@144.16.251.213::test test

  Q: 出现以下这个讯息, 是怎么一回事?
  @ERROR: auth failed on module xxxxx
  rsync: connection unexpectedly closed (90 bytes read so far)
  rsync error: error in rsync protocol data stream (code 12) at io.c(150)

  A: 这是因为密码设错了, 无法登入成功, 请再检查一下 rsyncd.secrets 中的密码设定, 二端是否一致?

  Q: 出现以下这个讯息, 是怎么一回事?

  password file must not be other-accessible
  continuing without password file
  Password:

  A: 这表示 rsyncd.secrets 的档案权限属性不对, 应设为 600。请下 chmod 600 rsyncd.secrets

  Q: 出现以下这个讯息, 是怎么一回事?

  @ERROR: chroot failed
  rsync: connection unexpectedly closed (75 bytes read so far)
  rsync error: error in rsync protocol data stream (code 12) at io.c(150)

  A: 这通常是您的 rsyncd.conf 中的 path 路径所设的那个目录并不存在所致.请先用 mkdir开设好备份目录.

完!

CentOS上如何把Web服务器从Apache换到Nginx

阿里云服务器上, 1G内存的配置,但用了一段时间,感觉Apache有些撑不出,想了想,还是换到目前最热门的Nginx吧。 这里把整个过程记录下来,与大家共享。

Nginx简介:

Nginx是一个高性能的HTTP服务器和反向代理服务器, 最大的优点是节省资源,适用于处理高并发的请求。

1. Nginx最初是按照反向代理设计的,和Apache不同, nginx关心如何处理url,而不是文件!

2. Apache 是个基于进程处理的web服务器,如果同时有多个请求,必须要启动多个进程来处理。 这样在高负载的情况下,资源的消耗和响应的速度都会有很大的问题。 而Nginx是个基于事件(event)的异步处理模式, 下面是Nginx的一个简单的示意图,有一个Master进程,Maste进程负责系统配置,管理socket,以及管理一个或是多个Worker进程。 而Worker进程接收和处理来自用户(浏览器)的请求。一般来讲,一个worker进程可以同时处理上千个用户的连接请求。每个worker进程采用异步的,基于event的方式来处理用户的请求。对于HTML的静态页面,Nginx会自行来处理,但对于PHP,JSP, Python等动态页面,Nginx是通过FastCGI(或者SCGI,UWSGI)来把动态页面的请求交给相应的处理程序来处理。

nginx

安装Nginx

需要注意的是,在CentOS的YUM的基础的容器中,并没有nginx和php-fpm的RPM包。这两个RMP包在epel的容器中, 虽然你可以从官网下载RPM包来安装,但我个人建议,如果你的CentOS/Redhat中没有加入YUM的epel容器,还是先把这个yum容器加上去比较好,以后可以省无数的折腾。epel具体的安装方法,我在 Redhat/CentOS 软件安装之RPM和YUM 这篇文章中有介绍。

yum的容器库中加入了epel容器后,在CentOS上安装Nginx就非常简单,运行下面的命令就可以了。

1
1
yum install nginx

安装玩以后,会发现Nginx的配置文件放在 /etc/nginx目录下, 一般在缺省的情况下,web的root目录会在/usr/share/ngxin/html中。

安装完nginx以后,我们要测试一下是否安装成功了.

如果之前已经安装过Apache的话,先要把Apache的服务停掉。

1
2
1
/etc/init.d/httpd stop            #停掉apache服务
1
chkconfig httpd off              #开机重启后,apache服务不再启动

这时候你在浏览器上输入 http://主机ip, 如果能出现nginx的测试页面 “Test page for the nginx http server on EPEL”就说明nginx已经正常运行了。

安装php-fpm

PHP-FPM (PHP-FastCGI Process Manager) 是目前最常用的一个PHP FastCGI的实现。通俗的讲,这个模块在Nginx和PHP之间桥梁,使之可以互相通信和交换。

安装及启动过程如下:

1
2
3
4
5
1
yum install php-fpm
 
1
/etc/init.d/php-fpm start
 
1
chkconfig php-fpm on

下一步是确认一下,nginx和php-fpm是否已经正常运行. 执行 netstat -tunlp 命令,会看到大约如下的一个界面。

可以看到nginx在监听80端口,而php-fpm在监听9000端口。

Screenshot

设置Nginx 和 PHP-FPM

我们假定这个主机上有两个网站,一个是aaa.com, 普通的PHP站点, 一个是bbb.com,为wordpress的博客。 我们就讨论一下在这种情况下,如何设置nginx.

首先为站点建立相应的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
mkdir

 

1
-p  /
1
var
1
/www/aaa/html
 
1
mkdir

 

1
-p /
1
var
1
/www/bbb/html
 
1
mkdir

 

1
-p /
1
var
1
/log/nginx/aaa
 
1
mkdir

 

1
-p /
1
var
1
/log/nginx/bbb
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/www/aaa/html
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/wwww/bbb/html
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/log/nginx/aaa
 
1
chown

 

1
-R nginx:adm  /
1
var
1
/log/nginx/bbb

为了保证整个配置更加清晰,我们尽量不修改主配置文件/etc/nginx/nginx.conf , 而是在在/etc/nginx/conf.d目录下建立两个文件,一个是aaa.conf, 一个是bbb.conf

其中aaa.conf的内容如下 (aaa是一个普通的php网站): 参考于: http://wiki.nginx.org/PHPFcgiExample

查看源代码打印帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
1
server {
1
 
1
listen 80 default_server;                 #当输入ip时,会访问aaa.com
1
 
1
server_name www.aaa.com aaa.com *.aaa.com;  #这个应该是最好的写法了         
 
1
 
1
access_log /
1
var
1
/log/nginx/aaa/access.log;   #access_log属于ngx_http_log_module的设置, 缺省level为info
1
 
1
error_log

 

1
/
1
var
1
/log/nginx/aaa/error.log;     #
1
error_log
1
属于core module, 缺省的level是error 
 
1
 
1
location / {
1
    
1
root /
1
var
1
/www/aaa/html;
1
    
1
index index.php index.html index.htm;     #由于是PHP类型的动态页面为主,所以把index.php放在前面效率会更高些
1
   
1
# try_files 
1
$uri

 

1
$uri
1
/ /index.php?
1
$args
1
;   #普通php网站因为没有rewrite的话,这个不需要
1
 
1
}
 
1
 
1
error_page 404 /404.html;         #error_page errcode uri (也就是说出现了404错误,会请求/404.html)
1
 
1
location = /404.html {            #这是一个典型的location
1
   
1
root /
1
var
1
/www/aaa/html;
1
 
1
}
 
1
 
1
# redirect server error pages to the 
1
static

 

1
page /50x.html
1
 
1
#
1
 
1
error_page 500 502 503 504 /50x.html;
1
 
1
location = /50x.html {
1
 
1
root /
1
var
1
/www/aaa/html;
1
 
1
}
 
1
 
1
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
1
 
1
# 因为我们不用Nginx做Apache的反向代理,所以不需要这个
1
 
1
#location ~ \.php$ {
1
 
1
# proxy_pass http:
1
//127.0.0.1;
1
 
1
#}
 
1
 
1
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
1
 
1
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
1
 
1
# 这种写法可以防止把恶意程序伪装成.jpg之类的攻击,(其实有个更简单的方法,就是把php.ini中的cgi.fix_pathinfo=0,但有时候简单的修改cgi.fix_pathinfo会造成有的php脚本出错)
 
1
 
1
location ~ [^/]\.php(/|$) {
1
   
1
root /
1
var
1
/www/aaa/html;
1
   
1
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
1
   

 

1
   
1
if

 

1
(!-f 
1
$document_root
1
$fastcgi_script_name
1
) {
1
     
1
return

 

1
404;
1
   
1
}
1
   
1
#try_files 
1
$uri

 

1
=404;         #这个try_files说明:对于.php文件,直接执行
1
$uri
1
, 如果找不到这个
1
$uri
1
,直接给出404错误,(和 location / 定义不同!),主要是为了防止 伪装成图片的攻击  (目前看,最安全的方式,是用上面那一句话,官方推荐的)
 
1
   
1
fastcgi_pass 127.0.0.1:9000;
1
   
1
fastcgi_index index.php;
1
   
1
fastcgi_param SCRIPT_FILENAME 
1
$document_root
1
$fastcgi_script_name
1
;
1
   
1
include

 

1
fastcgi_params;
1
 
1
}
 
1
 
1
# deny access to .htaccess files, 
1
if

 

1
Apache's document root
1
 
1
# concurs with nginx's one
1
 
1
#
1
 
1
location ~ /\.ht {
1
   
1
deny all;
1
 
1
}

设置完aaa.com的环境后,还需要设置bbb.com的 nginx的配置,因为bbb.com是wordpress的站点, 除了和aaa.com相同的设置外,还有些特殊的设置,具体设置请参考 http://codex.wordpress.org/Nginx

至此,从Apache向Nginx的移植基本完成。

数据库还原xtrabackup自动还原脚本v2

xtrabackup自动还原
************************************************************************************************
应用场景:
************************************************************************************************
1.备份目录为/backup/full和/backup/incre的架构,前者保存全备,后者保存增量备份
2.如全备为/backup/full/2015-04-08_15-14-33则将全备的目录名2015-04-08_15-14-33
作为/backup/incre/下增量备份的目录名。这样设计的初衷在于只要全备不过期,那么
这个全备文件之后的增量备份也不过期.
3.还原时,脚本会自动找到最新的全备和最新全备命名的增量备份目录,并将增量备份
按照先后顺序应用日志到全备中,最后完成还原.
4.该版本增加了是否恢复所有增量备份,默认是全部增量备份.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
1
************************************************************************************************
1
脚本
1
************************************************************************************************
1
#!/bin/sh
1
#xiaohuai@xiaohuai.org
1
#xtrabackup 2.3.3
1
# 使用方法:
1
# ./restore.sh /增量备份父目录或全备的父目录名
1
#eg1:./restore.sh /data/backup/full/
1
#eg2:./restore.sh /data/backup/incre/
1
#NOTICE:增量备份还原如果指定文件,则还原到指定文件名的上一个文件末截止.
1
#即输入的增量文件名应为需要截止的增量文件名的下一个文件
1
  

 

1
  

 

1
#NOTE:恢复开始前请确保mysql服务停止以及数据和日志目录清空,如
1
# rm -rf /usr/local/mysql/innodb_data/*
1
# rm -rf /usr/local/mysql/data/*
1
# rm -rf /usr/local/mysql/innodb_log/*
1
  

 

1
  

 

1
echo 
1
"*************************************************************************"
1
echo -e 
1
'\e[32m 提示:mysql端口根据实际环境修改. \e[m'

 

1
#红色
1
echo 
1
"*************************************************************************"
1
  

 

1
  

 

1
  

 

1
INNOBACKUPEX=innobackupex
1
INNOBACKUPEX_PATH=/usr/bin/$INNOBACKUPEX
1
TMP_LOG=
1
"/var/log/restore.$$.log"
1
MY_CNF=/etc/my.cnf
1
BACKUP_DIR=/home/xtrabackup 
1
# 你的备份主目录
1
FULLBACKUP_DIR=$BACKUP_DIR/full 
1
# 全库备份的目录
1
INCRBACKUP_DIR=$BACKUP_DIR/incre 
1
# 增量备份的目录
1
MEMORY=2048M 
1
# 还原的时候使用的内存限制数
1
ERRORLOG=`grep -i 
1
"^log-error"

 

1
$MY_CNF |cut -d = -f 2`
1
MYSQLD_SAFE=/usr/local/mysql/bin/mysqld_safe
1
MYSQL_PORT=3306
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
#显示错误
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
error()
1
{
1
    
1
echo 
1
"$1"

 

1
1>&2
1
    
1
exit 1
1
}
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
# 检查innobackupex错误输出
1
  

 

1
  

 

1
#############################################################################
1
  

 

1
  

 

1
check_innobackupex_fail()
1
{
1
    
1
if

 

1
[ -z 
1
"`tail -2 $TMP_LOG | grep 'completed OK!'`"

 

1
] ; then
1
    
1
echo 
1
"$INNOBACKUPEX命令执行失败:"
1
; echo
1
    
1
echo 
1
"---------- $INNOBACKUPEX的错误输出 ----------"
1
    
1
cat $TMP_LOG
1
    
1
#保留一份备份的详细日志
1
    
1
logfiledate=restore.`date +%Y%m%d%H%M`.txt
1
    
1
cat $TMP_LOG>/backup/$logfiledate  
1
    
1
rm -f $TMP_LOG
1
    
1
exit 1
1
  
1
fi
1
}
1
  

 

1
  

 

1
  

 

1
# 选项检测
1
if

 

1
[ ! -x $INNOBACKUPEX_PATH ]; then
1
  
1
error 
1
"$INNOBACKUPEX_PATH在指定路径不存在,请确认是否安装或核实链接是否正确."
1
fi
1
  

 

1
  

 

1
if

 

1
[ ! -d $BACKUP_DIR ]; then
1
  
1
error 
1
"备份目录$BACKUP_DIR不存在.请新建备份主目录$BACKUP_DIR"
1
fi
1
  

 

1
  

 

1
if

 

1
[ $
1
# != 1 ] ; then
1
  
1
error 
1
"使用方法: $0 使用还原目录的绝对路径"
1
fi
1
  

 

1
  

 

1
  

 

1
if

 

1
[ ! -d $1 ]; then
1
  
1
error 
1
"指定的备份目录:$1不存在."
1
fi
1
  

 

1
  

 

1
  

 

1
PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
1
if

 

1
[ $PORTNUM00 = 1  ];
1
then
1
echo -e 
1
"\e[31m NOTE:------------------------------------------.\e[m"

 

1
#红色
1
echo -e 
1
"\e[31m mysql处于运行状态,请关闭mysql. \e[m"

 

1
#红色
1
echo -e 
1
"\e[31m NOTE:------------------------------------------.\e[m"

 

1
#红色
1
exit 0
1
fi
1
  

 

1
  

 

1
################判断还原增量备份部分还是所有################
1
echo 
1
"*************************************************************************"
1
echo -e 
1
"\e[31m 输入的增量文件名应为截止的增量文件名的下一个文件.\e[m"

 

1
#红色
1
echo 
1
"*************************************************************************"
1
ipname=
1
''
1
read -p 
1
"输入截止增量备份名[默认所有]:"

 

1
ipname
1
echo
1
  

 

1
  

 

1
echo 
1
"输入截止增量备份名为:$ipname"
1
  

 

1
  

 

1
  

 

1
input_value=$1
1
intpu_res=`echo ${input_value%/*}` 
1
  

 

1
  

 

1
  

 

1
  

 

1
# Some info output
1
echo 
1
"----------------------------"
1
echo
1
echo 
1
"$0: MySQL还原脚本"
1
START_RESTORE_TIME=`date +%F
1
' '
1
%T
1
' '
1
%w`
1
echo 
1
"数据库还原开始于: $START_RESTORE_TIME"
1
echo
1
  

 

1
  

 

1
  

 

1
#PARENT_DIR=`dirname ${intpu_res}`
1
PARENT_DIR=${intpu_res}
1
  

 

1
  

 

1
if

 

1
[ $PARENT_DIR = $FULLBACKUP_DIR ]; then
1
FULL=`ls -t $FULLBACKUP_DIR |head -1`
1
FULLBACKUP=${intpu_res}/$FULL
1
echo 
1
"还原完全备份:`basename $FULLBACKUP`"
1
echo
1
  

 

1
  

 

1
else
1
  

 

1
################判断还原部分增量备份还是所有增量备份################
1
if

 

1
[ 
1
"$ipname"

 

1
= 
1
''

 

1
];then
1
 
1
if

 

1
[ $PARENT_DIR = $INCRBACKUP_DIR ]; then
1
FULL=`ls -t $FULLBACKUP_DIR |head -1`
1
FULLBACKUP=$FULLBACKUP_DIR/$FULL
1
if

 

1
[ ! -d $FULLBACKUP ]; then
1
error 
1
"全备:$FULLBACKUP不存在."
1
fi
1
INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1 ` 
1
#查找最后一个增量备份文件
1
echo 
1
"还原将从全备全备$FULL开始,到增量$INCR结束."
1
echo
1
echo 
1
"Prepare:完整备份..........."
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
     

 

1
  

 

1
  

 

1
# Prepare增量备份集,即将增量备份应用到全备目录中,按照增量备份顺序即按照时间从旧到最新
1
for

 

1
i 
1
in

 

1
`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -n `;
1
do
1
  

 

1
  

 

1
#判断最新全备的lsn
1
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`
1
     

 

1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
  

 

1
  

 

1
######判断增量备份中第一个增量备份的LSN
1
#check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`
1
       

 

1
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
1
       

 

1
fetch_incre_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_incre_lastlsn} |cut -d = -f 2`
1
echo 
1
"完全备份$FULLBACKUP的LSN值:${fetch_full_lastlsn} "
1
echo 
1
"增量备份$i的LSN值:${fetch_incre_lastlsn} "
1
  

 

1
if

 

1
[ 
1
"${fetch_incre_lastlsn}"

 

1
-eq 
1
"${fetch_full_lastlsn}"

 

1
];then
1
echo 
1
"*****************************************"
1
echo 
1
"LSN相等,不需要prepare!"
1
echo 
1
"*****************************************"
1
echo
1
break
1
  

 

1
  

 

1
  

 

1
else
1
echo 
1
"Prepare:增量备份集$i........"
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
   

 

1
if

 

1
[ $INCR = $i ]; then
1
break
1
fi
1
      

 

1
fi
1
######判断LSN
1
done
1
  

 

1
else
1
error 
1
"未知的备份类型"
1
  
1
fi
1
  

 

1
  

 

1
else
1
FULL=`ls -t $FULLBACKUP_DIR |head -1`
1
FULLBACKUP=$FULLBACKUP_DIR/$FULL
1
echo 
1
"Prepare:完整备份..........."
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
  

 

1
  

 

1
  

 

1
  

 

1
ipt=`stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2`
1
echo 
1
"还原的指定增量目录文件$ipname的纪元时间为:$ipt"
1
for

 

1
i 
1
in

 

1
`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -n `;
1
do
1
#判断for循环取到的文件名是否为输入的文件名,如果是则停止循环
1
if

 

1
[ 
1
"$i"

 

1
=  
1
"$ipname"

 

1
]; then
1
break
1
;
1
else
1
f01=`stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2`
1
if

 

1
[ 
1
"$f01"

 

1
-le 
1
"$ipt"

 

1
]; then
1
  

 

1
  

 

1
if

 

1
[ $PARENT_DIR = $INCRBACKUP_DIR ]; then
1
if

 

1
[ ! -d $FULLBACKUP ]; then
1
error 
1
"全备:$FULLBACKUP不存在."
1
fi
1
#INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1`
1
echo 
1
"还原将从全备$FULL开始,到增量$ipname结束."
1
echo
1
  

 

1
  

 

1
#判断最新全备的lsn
1
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`
1
     

 

1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
  

 

1
  

 

1
######判断增量备份中第一个增量备份的LSN
1
check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -n |  head -1`
1
       

 

1
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
1
       

 

1
fetch_incre_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_incre_lastlsn} |cut -d = -f 2`
1
echo 
1
"完全备份的LSN:${fetch_full_lastlsn} "
1
echo 
1
"增量备份的LSN:${fetch_incre_lastlsn} "
1
if

 

1
[ 
1
"${fetch_incre_lastlsn}"

 

1
-eq 
1
"${fetch_full_lastlsn}"

 

1
];then
1
echo 
1
"*****************************************"
1
echo -e 
1
"\e[31m LSN不需要prepare或备份间隔期间无数据变化 \e[m"

 

1
#红色
1
echo 
1
"*****************************************"
1
  

 

1
  

 

1
  

 

1
fi
1
  

 

1
  

 

1
echo
1
echo 
1
"Prepare:增量备份集$i........"
1
echo 
1
"*****************************"
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
######判断LSN
1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
echo 
1
"完全备份当前的LSN:${fetch_full_lastlsn}"
1
  

 

1
  

 

1
else
1
error 
1
"未知的备份类型"
1
fi
1
else
1
echo 
1
"查找增量备份文件完成."
1
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
1
     

 

1
fetch_full_lastlsn=`grep -i 
1
"^last_lsn"

 

1
${check_full_lastlsn} |cut -d = -f 2`
1
echo -e 
1
"\e[31m -------------------------------------------- \e[m"

 

1
#红色
1
echo -e 
1
"\e[31m 完全备份最终的LSN:${fetch_full_lastlsn} \e[m"

 

1
#红色
1
echo -e 
1
"\e[31m -------------------------------------------- \e[m"

 

1
#红色
1
break
1
fi
1
fi
1
done
1
  

 

1
  

 

1
fi
1
################判断还原部分增量备份还是所有增量备份################
1
  

 

1
  

 

1
fi
1
  

 

1
echo
1
echo 
1
"prepare:完整备份以及回滚那些未提交的事务..........."
1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
  

 

1
  

 

1
echo 
1
"*****************************"
1
echo 
1
"数据库还原中 ...请稍等"
1
echo 
1
"*****************************"
1
  

 

1
  

 

1
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
1
check_innobackupex_fail
1
  

 

1
  

 

1
    

 

1
rm -f $TMP_LOG
1
echo 
1
"1.恭喜,还原成功!."
1
echo 
1
"*****************************"
1
  

 

1
  

 

1
#修改目录权限
1
echo 
1
"修改mysql目录的权限."
1
mysqlcnf=
1
"/etc/my.cnf"
1
mysqldatadir=`grep -i 
1
"^basedir"

 

1
$mysqlcnf |cut -d = -f 2`
1
`echo 
1
'chown -R mysql:mysql'

 

1
${mysqldatadir}`
1
echo 
1
"2.权限修改成功!"
1
echo 
1
"*****************************"
1
  

 

1
  

 

1
#自动启动mysql
1
  

 

1
  

 

1
INIT_NUM=1
1
if

 

1
[ ! -x $MYSQLD_SAFE ]; then
1
  
1
echo 
1
"mysql安装时启动文件未安装到$MYSQLD_SAFE或无执行权限"
1
  
1
exit 1  
1
#0是执行成功,1是执行不成功
1
else
1
echo 
1
"启动本机mysql端口为:$MYSQL_PORT的服务"
1
$MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/
1
null

 

1
&
1
while

  

1
[ $INIT_NUM  -le 10 ]
1
      
1
do
1
        
1
PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
1
        
1
echo 
1
"mysql启动中....请稍等..."
1
        
1
sleep 10
1
        
1
if

 

1
[ $PORTNUM = 1  ];
1
        
1
then
1
echo -e 
1
"\e[32m mysql                                      ****启动成功**** \e[m"
1
        
1
exit 0
1
        
1
fi
1
        
1
INIT_NUM=$(($INIT_NUM +1))
1
      
1
done
1
echo -e 
1
"\e[31m mysql启动失败或启动时间过长,请检查错误日志 `echo 'cat ' ${ERRORLOG}` \e[m"
1
echo 
1
"*****************************************"
1
exit 0
1
fi
1
  

 

1
  

 

1
  

 

1
END_RESTORE_TIME=`date +%F
1
' '
1
%T
1
' '
1
%w`
1
echo 
1
"数据库还原完成于: $END_RESTORE_TIME"
1
exit 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
1
************************************************************************************************
1
执行结果:
1
************************************************************************************************
1
  

 

1
# ./restore.sh /backup/incre/ 
1
输入截止增量备份名[默认所有]:2015-04-10_14-10-49
1
 

 

1
 

 

1
输入截止增量备份名为:2015-04-10_14-10-49
1
----------------------------
1
 

 

1
 

 

1
./restore.sh: MySQL还原脚本
1
数据库还原开始于: 2015-04-10 14:24:51 5
1
 

 

1
 

 

1
Prepare:完整备份...........
1
*****************************
1
还原的指定增量目录文件2015-04-10_14-10-49的纪元时间为:1428646269
1
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
1
 

 

1
 

 

1
完全备份的LSN: 344693290 
1
增量备份的LSN: 413297865 
1
Prepare:增量备份集2015-04-10_14-08-19........
1
*****************************
1
完全备份当前的LSN: 413297865
1
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
1
 

 

1
 

 

1
完全备份的LSN: 413297865 
1
增量备份的LSN: 481905295 
1
Prepare:增量备份集2015-04-10_14-09-07........
1
*****************************
1
完全备份当前的LSN: 481905295
1
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
1
 

 

1
 

 

1
完全备份的LSN: 481905295 
1
增量备份的LSN: 550515490 
1
Prepare:增量备份集2015-04-10_14-10-49........
1
*****************************
1
完全备份当前的LSN: 550515490
1
查找增量备份文件完成.
1
 
1
-------------------------------------------- 
1
 
1
完全备份最终的LSN: 550515490 
1
 
1
-------------------------------------------- 
1
 

 

1
 

 

1
prepare:完整备份以及回滚那些未提交的事务...........
1
*****************************
1
数据库还原中 ...请稍等
1
*****************************
1
1.恭喜,还原成功!.
1
*****************************
1
修改mysql目录的权限.
1
2.权限修改成功!
1
*****************************
1
启动本机mysql端口为:3306的服务
1
mysql启动中....请稍等...
1
mysql启动中....请稍等...
1
mysql启动中....请稍等...
1
 
1
mysql                                      ****启动成功**** 

本文转自坏总的:小坏天空

数据库备份xtrabackup自动备份脚本

一、安装xtrabackup
见centos下使用yum 安装percona xtrabackup
二、安装脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
1
#backup.sh  
1
#!/bin/sh  
1
#on xtrabackup 2.2.8  
1
# 第一次执行它的时候它会检查是否有完全备份,否则先创建一个全库备份  
1
# 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全备或增量备份进行增量备份  
1
#xiaohuai@xiaohuai.org  
1
   

 

1
INNOBACKUPEX_PATH=innobackupex  
1
#INNOBACKUPEX的命令  
1
INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX_PATH  
1
#INNOBACKUPEX的命令路径  
1
   

 

1
#mysql目标服务器以及用户名和密码  
1
MYSQL_CMD=
1
"--host=localhost --user=root --password=123456 --port=3306"

   

1
   

 

1
MYSQL_UP=
1
" --user=root --password='123456' --port=3306 "

  

1
#mysqladmin的用户名和密码  
1
   

 

1
TMPLOG=
1
"/tmp/innobackupex.$$.log"

 

1
   

 

1
MY_CNF=/etc/my.cnf 
1
#mysql的配置文件  
1
   

 

1
MYSQL=/usr/local/mysql/bin/mysql 
1
   

 

1
MYSQL_ADMIN=/usr/local/mysql/bin/mysqladmin
1
   

 

1
BACKUP_DIR=/data/xtrabackup 
1
# 备份的主目录  
1
   

 

1
FULLBACKUP_DIR=$BACKUP_DIR/full 
1
# 全库备份的目录  
1
   

 

1
INCRBACKUP_DIR=$BACKUP_DIR/incre 
1
# 增量备份的目录  
1
   

 

1
FULLBACKUP_INTERVAL=86400 
1
# 全库备份的间隔周期,时间:秒  
1
   

 

1
KEEP_FULLBACKUP=1 
1
# 至少保留几个全库备份  
1
   

 

1
logfiledate=backup.`date +%Y%m%d%H%M`.txt  
1
   

 

1
#开始时间  
1
STARTED_TIME=`date +%s`  
1
   

 

1
   

 

1
   

 

1
#############################################################################  
1
   

 

1
# 显示错误并退出  
1
   

 

1
#############################################################################  
1
   

 

1
error()  
1
{  
1
    
1
echo 
1
"$1"

 

1
1>&2  
1
    
1
exit 1  
1
}  
1
   

 

1
    

 

1
   

 

1
# 检查执行环境  
1
   

 

1
if

 

1
[ ! -x $INNOBACKUPEXFULL ]; then 
1
  
1
error 
1
"$INNOBACKUPEXFULL未安装或未链接到/usr/bin."

 

1
fi 
1
   

 

1
    

 

1
   

 

1
if

 

1
[ ! -d $BACKUP_DIR ]; then 
1
  
1
error 
1
"备份目标文件夹:$BACKUP_DIR不存在."

 

1
fi 
1
   

 

1
    

 

1
   

 

1
mysql_status=`netstat -nl | awk 
1
'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'
1
`  
1
   

 

1
if

 

1
[ 
1
"$mysql_status"

 

1
!= 
1
"Yes"

 

1
];then 
1
    
1
error 
1
"MySQL 没有启动运行."

 

1
fi 
1
   

 

1
   

 

1
   

 

1
    

 

1
   

 

1
if

 

1
! `echo 
1
'exit'

 

1
| $MYSQL -s $MYSQL_CMD` ; then 
1
 
1
error 
1
"提供的数据库用户名或密码不正确!"

 

1
fi 
1
   

 

1
    

 

1
   

 

1
# 备份的头部信息  
1
   

 

1
echo 
1
"----------------------------"

 

1
echo 
1
echo 
1
"$0: MySQL备份脚本"

 

1
echo 
1
"开始于: `date +%F' '%T' '%w`"

 

1
echo 
1
   

 

1
    

 

1
   

 

1
#新建全备和差异备份的目录  
1
   

 

1
mkdir -p $FULLBACKUP_DIR  
1
mkdir -p $INCRBACKUP_DIR  
1
   

 

1
   

 

1
   

 

1
#查找最新的完全备份  
1
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -nr | head -1`  
1
   

 

1
    

 

1
   

 

1
# 查找最近修改的最新备份时间  
1
   

 

1
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`  
1
   

 

1
   

 

1
#如果全备有效进行增量备份否则执行完全备份  
1
if

 

1
[ 
1
"$LATEST_FULL_BACKUP"

 

1
-a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then 
1
    
1
# 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录  
1
    
1
echo -e 
1
"完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份基础目录名"

 

1
    
1
echo 
1
"                     "

 

1
    
1
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
1
    
1
mkdir -p $NEW_INCRDIR  
1
   

 

1
    
1
# 查找最新的增量备份是否存在.指定一个备份的路径作为增量备份的基础  
1
    
1
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

  

1
| sort -nr | head -1`  
1
        
1
if

 

1
[ ! $LATEST_INCR_BACKUP ] ; then 
1
            
1
INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP  
1
            
1
echo -e 
1
"增量备份将以$INCRBASEDIR作为备份基础目录"

 

1
            
1
echo 
1
"                     "

 

1
        
1
else

 

1
            
1
INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}  
1
            
1
echo -e 
1
"增量备份将以$INCRBASEDIR作为备份基础目录"

 

1
            
1
echo 
1
"                     "

 

1
        
1
fi 
1
   

 

1
    
1
echo 
1
"使用$INCRBASEDIR作为基础本次增量备份的基础目录."

 

1
    
1
$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1  
1
   

 

1
    
1
#保留一份备份的详细日志  
1
   

 

1
    
1
cat $TMPLOG>/backup/$logfiledate  
1
   

 

1
    
1
if

 

1
[ -z 
1
"`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`"

 

1
] ; then 
1
     
1
echo 
1
"$INNOBACKUPEX命令执行失败:"
1
; echo 
1
     
1
echo -e 
1
"---------- $INNOBACKUPEX_PATH错误 ----------"

 

1
     
1
cat $TMPLOG  
1
     
1
rm -f $TMPLOG  
1
     
1
exit 1  
1
    
1
fi 
1
   

 

1
    
1
THISBACKUP=`awk -- 
1
"/Backup created in directory/ { split( \\\$0, p, "'" ) ; print p[2] }"

 

1
$TMPLOG`  
1
    
1
rm -f $TMPLOG  
1
   

 

1
   

 

1
    
1
echo -n 
1
"数据库成功备份到:$THISBACKUP"

 

1
    
1
echo 
1
   

 

1
    
1
# 提示应该保留的备份文件起点  
1
   

 

1
    
1
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -nr | head -1`  
1
   

 

1
    
1
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
1
   

 

1
    
1
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

  

1
| sort -nr | head -1`  
1
   

 

1
    
1
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}  
1
   

 

1
    
1
RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`  
1
   

 

1
    
1
echo 
1
    
1
echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m
1
' #红色  
1
    
1
echo -e "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份." 
1
    
1
echo -e '
1
\e[31m NOTE:---------------------------------------------------------------------------------.\e[m
1
' #红色  
1
    
1
echo 
1
   

 

1
   

 

1
   

 

1
else 
1
    
1
echo  "*********************************" 
1
    
1
echo -e "正在执行全新的完全备份...请稍等..." 
1
    
1
echo  "*********************************" 
1
    
1
$INNOBACKUPEXFULL --defaults-file=$MY_CNF  --use-memory=4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1   
1
    
1
#保留一份备份的详细日志  
1
   

 

1
    
1
cat $TMPLOG>/backup/$logfiledate  
1
   

 

1
   

 

1
    
1
if [ -z "`tail -1 $TMPLOG | grep '
1
innobackupex: completed OK!
1
'`" ] ; then 
1
     
1
echo "$INNOBACKUPEX命令执行失败:"; echo 
1
     
1
echo -e "---------- $INNOBACKUPEX_PATH错误 ----------" 
1
     
1
cat $TMPLOG  
1
     
1
rm -f $TMPLOG  
1
     
1
exit 1  
1
    
1
fi 
1
   

 

1
        

 

1
    
1
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, "'
1
" ) ; print p[2] }" $TMPLOG`  
1
    
1
rm -f $TMPLOG  
1
   

 

1
    
1
echo -n 
1
"数据库成功备份到:$THISBACKUP"

 

1
    
1
echo 
1
   

 

1
    
1
# 提示应该保留的备份文件起点  
1
   

 

1
    
1
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf 
1
"%P\n"

 

1
| sort -nr | head -1`  
1
   

 

1
    
1
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}  
1
   

 

1
    
1
echo 
1
    
1
echo -e 
1
'\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'

 

1
#红色  
1
    
1
echo -e 
1
"无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."

 

1
    
1
echo -e 
1
'\e[31m NOTE:---------------------------------------------------------------------------------.\e[m'

 

1
#红色  
1
    
1
echo 
1
   

 

1
fi 
1
   

 

1
   

 

1
   

 

1
#删除过期的全备  
1
   

 

1
echo -e 
1
"find expire backup file...........waiting........."

 

1
echo -e 
1
"寻找过期的全备文件并删除"
1
>>/backup/$logfiledate  
1
for

 

1
efile 
1
in

 

1
$(/usr/bin/find $FULLBACKUP_DIR/ -mtime +6)  
1
do

 

1
    
1
if

 

1
[ -d ${efile} ]; then 
1
    
1
rm -rf 
1
"${efile}"

 

1
    
1
echo -e 
1
"删除过期全备文件:${efile}"

 

1
>>/backup/$logfiledate  
1
    
1
elif [ -f ${efile} ]; then 
1
    
1
rm -rf 
1
"${efile}"

 

1
    
1
echo -e 
1
"删除过期全备文件:${efile}"

 

1
>>/backup/$logfiledate  
1
    
1
fi;  
1
       

 

1
done 
1
   

 

1
if

 

1
[ $? -eq 
1
"0"

 

1
];then 
1
   
1
echo 
1
   
1
echo -e 
1
"未找到可以删除的过期全备文件"

 

1
fi 
1
   

 

1
   

 

1
   

 

1
echo 
1
echo 
1
"完成于: `date +%F' '%T' '%w`"

 

1
exit 0  

本文转自坏总的: 小坏天空

MySQL添加用户、删除用户与授权

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):

1.新建用户

  1.1 登录MYSQL:

  @>mysql -u root -p

  @>密码

  1.2 创建用户:

  mysql> insert into mysql.user(Host,User,Password) values(“localhost”,”test”,password(“1234”));

  这样就创建了一个名为:test 密码为:1234 的用户。

  注意:此处的”localhost”,是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将”localhost”改为”%”,表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。

  1.3 然后登录一下:

  mysql>exit;

  @>mysql -u test -p

  @>输入密码

  mysql>登录成功

2.为用户授权

  授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”; 

  2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录:

  @>mysql -u root -p

  @>密码

  2.2 首先为用户创建一个数据库(testDB):

  mysql>create database testDB;

  2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):

   mysql>grant all privileges on testDB.* to test@localhost identified by ‘1234’;

  mysql>flush privileges;//刷新系统权限表

  格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”; 

  2.4 如果想指定部分权限给一用户,可以这样来写:

  mysql>grant select,update on testDB.* to test@localhost identified by ‘1234’;

  mysql>flush privileges; //刷新系统权限表

  2.5 授权test用户拥有所有数据库的某些权限:  

  mysql>grant select,delete,update,create,drop on *.* to test@”%” identified by “1234”;

//test用户对所有数据库都有select,delete,update,create,drop 权限。

  //@”%” 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)

 //对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by ‘1234’;即可。

3. 删除用户

  @>mysql -u root -p

  @>密码

  mysql>Delete FROM user Where User=’test’ and Host=’localhost’;

  mysql>flush privileges;

  mysql>drop database testDB; //删除用户的数据库

删除账户及权限:>drop user 用户名@’%’;

        >drop user 用户名@ localhost;

4. 修改指定用户密码

  @>mysql -u root -p

  @>密码

  mysql>update mysql.user set password=password(‘新密码’) where User=”test” and Host=”localhost”;

  mysql>flush privileges;

5. 列出所有数据库

  mysql>show database;

6. 切换数据库

  mysql>use ‘数据库名’;

7. 列出所有表

  mysql>show tables;

8. 显示数据表结构

  mysql>describe 表名;

9. 删除数据库和数据表

  mysql>drop database 数据库名;

  mysql>drop table 数据表名;