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开设好备份目录.

完!

destoon文件目录详解

这是目前找到最详细的Destoon程序文件及目录说明
( /代表的是目录 ├ 代表的是文件 )

/about关于我们页面
├index.html关于我们
├copyright.html版权隐私
├contact.html联系方式
├agreement.html用户协议
/ad广告
├index.php广告入口
/admin系统核心后台管理
/image后台风格
/template后台模板
├404.tpl.php404日志管理模板文件
├admin.tpl.php管理员管理-管理员管理模板文件
├admin_add.tpl.php管理员管理-添加管理员模板文件
├admin_edit.tpl.php管理员管理-修改管理员模板文件
├admin_right.tpl.php管理员管理-权限&面板模板文件
├area.tpl.php地区管理-地区管理模板文件
├area_add.tpl.php地区管理-地区添加模板文件
├banip.tpl.php禁止IP-IP禁止模板文件
├banip_ban.tpl.php禁止IP-IP解锁模板文件
├banword.tpl.php词语过滤模板文件
├category.tpl.phpXX分类-管理分类模板文件
├category_add.tpl.phpXX分类-添加分类模板文件
├category_copy.tpl.phpXX分类-分类复制模板文件
├category_edit.tpl.phpXX分类-分类修改模板文件
├city.tpl.php城市分站-分站管理模板文件
├city_edit.tpl.php城市分站-分站修改模板文件
├count.tpl.php系统首页-统计信息模板文件
├data.tpl.php数据维护-数据导入模板文件
├data_config.tpl.php数据维护-数据导入-配置修改模板文件
├data_view.tpl.php新数据模板文件
├database.tpl.php数据维护-数据库备份模板文件
├database_comment.tpl.php数据维护-修改表注释模板文件
├database_execute.tpl.php数据维护-执行SQL模板文件
├database_import.tpl.php数据维护-数据库恢复模板文件
├database_move.tpl.php数据维护-数据互转模板文件
├database_open.tpl.php数据维护-数据库恢复模板文件
├database_process.tpl.php数据维护-显示进程模板文件
├database_replace.tpl.php数据维护-备份文件内容替换模板文件
├dialog.tpl.php提示信息模板文件
├doctor.tpl.php系统体检模板文件
├fetch.tpl.php单页采编-采编规则模板文件
├fetch_edit.tpl.php单页采编-添加规则模板文件
├fields.tpl.phpXX模块设置-定义字段-管理字段模板文件
├fields_add.tpl.phpXX模块设置-定义字段-添加字段模板文件
├fields_edit.tpl.phpXX模块设置-定义字段-修改字段模板文件
├footer.tpl.php公共页脚模板文件
├header.tpl.php公共页头模板文件
├index.tpl.php后台首页框架模板文件
├ip.tpl.phpip转地址模板文件
├keylink.tpl.phpXX模块设置-管理链接模板文件
├keyword.tpl.php搜索记录模板文件
├left.tpl.php后台左侧分页模板文件
├log.tpl.php后台日志模板文件
├login.tpl.php后台登录模板文件
├main.tpl.php系统首页模板文件
├md5.tpl.php文件校验结果模板文件
├md5_add.tpl.php添加文件校验模板文件
├menu.tpl.php右上角菜单模板文件
├module.tpl.php模块管理模板文件
├module_add.tpl.php添加模块模板文件
├module_edit.tpl.php修改模块模板文件
├msg.tpl.php系统提示信息模板文件
├mymenu.tpl.php定义面板模板文件
├password.tpl.php修改密码模板文件
├product.tpl.php
├property.tpl.php
├property_edit.tpl.php
├question.tpl.php问题验证模板文件
├repeat.tpl.php重名检测模板文件
├scan.tpl.php木马扫描模板文件
├search.tpl.php后台搜索模板文件
├setting.tpl.php网站设置模板文件
├side.tpl.php侧边栏模板文件
├skin.tpl.php模板风格-风格管理模板文件
├skin_add.tpl.php模板风格-风格管理-添加css模板文件
├skin_edit.tpl.php模板风格-风格管理-修改css模板文件
├tag.tpl.php模板风格-标签向导模板文件
├tag_dict.tpl.php
├tag_preview.tpl.php模板风格-标签向导-标签预览模板文件
├template.tpl.php模板风格-模板管理模板文件
├template_add.tpl.php模板风格-模板管理-添加模板模板文件
├template_edit.tpl.php模板风格-模板管理-修改模板模板文件
├type.tpl.php分类管理模板文件
├upload.tpl.php上传记录-选择分表模板文件
├upload_part.tpl.php上传记录-上传记录模板文件
├word.tpl.php编辑助手模板文件

├404.inc.php404日志配置文件
├admin.class.php后台sql操作配置文件
├admin.inc.php管理员管理配置文件
├admin_check.inc.php后台权限判断配置文件
├area.inc.php地区管理配置文件
├banip.inc.php禁止IP管理配置文件
├banword.inc.php词语过滤管理配置文件
├category.inc.phpXX分类管理配置文件
├city.inc.php城市分站配置文件
├config.inc.php后台管理配置文件
├data.inc.php数据维护-数据导入配置文件
├database.inc.php数据维护备份配置文件
├destoon.inc.php系统信息配置文件
├doctor.inc.php系统体检配置文件
├fetch.inc.php单页采编配置文件
├fields.inc.phpXX模块设置-定义字段配置文件
├global.func.php后台全局函数配置文件
├html.inc.php站点更新配置文件
├index.inc.php系统首页配置文件
├ip.inc.phpIP配置文件
├keylink.inc.phpXX模块设置-管理链接配置文件
├keyword.inc.php搜索记录配置文件
├log.inc.php后台日志配置文件
├login.inc.php后台登录配置文件
├logout.inc.php后台退出配置文件
├md5.inc.php木马扫描-文件校验配置文件
├menu.inc.php后台菜单配置文件
├module.inc.php模块管理配置文件
├mymenu.inc.php自定义面板配置文件
├property.inc.php
├question.inc.php问题验证配置文件
├repeat.inc.php重名检测配置文件
├scan.inc.php木马扫描-木马扫描配置文件
├search.inc.php后台搜索配置文件
├setting.inc.php基本设置配置文件
├skin.inc.php模板风格-风格管理配置文件
├split.inc.php
├tag.inc.php模板风格-标签向导配置文件
├template.inc.php模板风格配置文件
├type.inc.php
├unzip.class.phpzip解压
├update.inc.php系统更新配置文件
├upload.inc.php上传记录配置文件
├word.inc.php编辑助手配置文件

/announce
/api系统及第三方接口
/kf在线客服
/map电子地图
/oauth一键登录
/pay支付接口
/stats第三方统计
/trade担保交易
/ucenterUCenter
/archiver档案文件
/brand品牌
/buy求购
/comment用户
/company公司
/down下载
/exhibit展会
/extend扩展
/feedrss订阅
/file文件
├backup数据库备份
├cache缓存
├captcha验证码字体
├chat聊天记录
├config配置
├data导数据导入
├email邮件列表
├flashFlash文件
├font中文字体
├image公用图片
├ipdataIP数据库
├log日志
├md5MD5镜像
├mobile手机列表
├scriptjavascript
├sessionSESSION
├setting配置数据
├temp临时目录
├update系统更新
├upload上传文件
/gift积分换礼
/group团购
/guestbook留言本
/include核心类库
├bmp.func.php缩略图
├cache_eaccelerator.class.php缓存加速
├cache_file.class.php生成缓存文件 $dc = new dcache;$dc->pre;$dc->time;
├cache_memcache.class.phpmemcache缓存文件
├cache_shmop.class.phpshmop缓存文件
├cache_xcache.class.phpxcache缓存文件
├cache.func.php从数据库查询到数据并写入缓存
├captcha.class.php验证码
├city.inc.php城市
├convert.func.php字符转义
├db_access.class.phpaccess数据库
├db_mssql.class.phpmssql数据库
├db_mysql.class.phpmysql数据库
├db_mysqli.class.phpmysqli数据库
├db_mysqlirw.class.php读取mysqli缓存数据库
├db_mysqlrw.class.php读取mysql缓存数据库
├defend.inc.php防护配置文件
├fields.func.php字段函数文件
├file.func.php文件及文件夹的操作函数
├ftp.class.phpftp类文件
├global.func.php全局函数
├image.class.php图像相关类(包括验证码)
├index.htm.php引导后台首页
├ip.func.phpip相关类
├mail.func.php邮件相关函数
├module.func.php模块函数文件
├post.func.phppost传递验证
├property.func.php财务函数文件
├remote.class.php文件转存类
├rewrite.inc.php重写相关
├seo.inc.phpseo相关
├session.class.phpsession
├sphinx.class.phpsphinx
├sql.func.phpsql一些方法
├tag.func.php标签
├template.func.php生成模板
├tree.class.php树函数
├type.class.php类型函数
├update.inc.php更新点击文件
├upload.class.php上传类
/install安装程序
/invest招商
/jc集采
/job人才
/know知道
/lang语言包
/link友情链接
/mall商城
/member会员
/news咨询
/photo图库
/poll行业票选
/quote行情
/sell供应
/module功能模块
/article文章模块
/brand品牌模块
/buy求购模块
/company公司模块
/down下载模块
/exhibit展会模块
/extend扩展模块
/group团购模块
/info信息模块
/job人才模块
/know知道模块
/mall商城模块
/member会员模块
/photo图库模块
/quote行情模块
/sell供应模块
/special专题模块
/video视频模块
/jc集采模块 [以此为例]
/admin集采管理
/template集采管理模板
├edit.tpl.php添加修改集采模板文件
├html.tpl.php生成静态网页模板文件
├index.tpl.php生成动态网页模板文件
├move.tpl.php移动分类模板文件
├setting.tpl.php模块设置模板文件

├config.inc.php模块配置文件配置文件
├html.inc.php页面生成配置文件
├index.inc.php后台模块首页配置文件
├install.inc.php安装文件配置文件
├menu.inc.php模块菜单配置文件
├remkdir.inc.php创建模块配置文件
├setting.inc.php模块更新配置文件
├uninstall.inc.php模块卸载配置文件

├common.inc.php公共配置配置文件
├global.func.php集采公共函数
├index.htm.php静态首页
├index.inc.php动态首页配置文件
├jc.class.php集采数据库操作类
├list.htm.php静态列表页
├list.inc.php动态列表页配置文件
├my.inc.php集采函数文件配置文件
├price.inc.php询价价格配置文件
├search.inc.php搜索配置文件
├show.htm.php静态展示页
├show.inc.php动态展示页配置文件
├task.inc.php任务分配文件配置文件

/sitemap网站地图
/skin风格皮肤
├default默认风格
├default/image图片文件
├default/style.cssCSS文件
/special专题
/spread推广
/template模板文件
├default默认模板
├default/index.htm首页模板
/video视频
/vote投票
/wap手机网
/upgrade系统升级
├404.php404错误入口
├admin.php后台入口
├ajax.phpajax入口
├city.php城市获取入口
├common.inc.php系统初始化
├config.inc.php系统配置
├index.php动态首页
├index.html静态首页
├search.php搜索入口
├upload.php上传入口
├version.inc.php版本控制

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
yum install nginx

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

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

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

1
2
/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之间桥梁,使之可以互相通信和交换。

安装及启动过程如下:

1
2
3
4
5
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.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

为了保证整个配置更加清晰,我们尽量不修改主配置文件/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
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的移植基本完成。

MySQL 配置优化

安装MySQL后,配置文件my.cnf在 /MySQL安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分别对应大中小型数据库应用的配置。win环境下即存在于MySQL安装目录中的.ini文件。

下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区变量。

1. 连接请求的变量:

1) max_connections
MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。

数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。

show variables like ‘max_connections’ 最大连接数

show status like ‘max_used_connections’响应的连接数

如下:

mysql> show variables like ‘max_connections‘;

+———————–+——-+

| Variable_name | Value |

+———————–+——-+

| max_connections | 256  |

+———————–+——-+

mysql> show status like ‘max%connections‘;

+———————–+——-+

| Variable_name  | Value |

+—————————-+——-+

| max_used_connections | 256|

+—————————-+——-+

max_used_connections / max_connections * 100% (理想值≈ 85%)

如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

2) back_log
MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。

当观察你主机进程列表(mysql> show full processlist),发现大量264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大back_log 的值了。

默认数值是50,可调优为128,对于Linux系统设置范围为小于512的整数。

3) interactive_timeout
一个交互连接在被服务器在关闭前等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE 选项的客户。

默认数值是28800,可调优为7200。

2. 缓冲区变量

全局缓冲:

4) key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。

key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。

举例如下:

mysql> show variables like ‘key_buffer_size‘;

+——————-+————+

| Variable_name | Value |

+———————+————+

| key_buffer_size | 536870912 |

+———— ———-+————+

key_buffer_size为512MB,我们再看一下key_buffer_size的使用情况:

mysql> show global status like ‘key_read%‘;

+————————+————-+

| Variable_name  | Value |

+————————+————-+

| Key_read_requests| 27813678764 |

| Key_reads   | 6798830 |

+————————+————-+

一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

key_cache_miss_rate =Key_reads / Key_read_requests * 100%,设置在1/1000左右较好

默认配置数值是8388600(8M),主机有4GB内存,可以调优值为268435456(256MB)。

5) query_cache_size
使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。

通过检查状态值Qcache_*,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查询缓冲,可以设置为0、1、2,该变量是SESSION级的变量。

query_cache_limit指定单个查询能够使用的缓冲区大小,缺省为1M。

query_cache_min_res_unit是在4.1版本以后引入的,它指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多,这就表明查询结果都比较小,此时需要减小query_cache_min_res_unit。

举例如下:

mysql> show global status like ‘qcache%‘;

+——————————-+—————–+

| Variable_name | Value  |

+——————————-+—————–+

| Qcache_free_blocks  | 22756  |

| Qcache_free_memory  | 76764704 |

| Qcache_hits      | 213028692 |

| Qcache_inserts     | 208894227 |

| Qcache_lowmem_prunes | 4010916 |

| Qcache_not_cached | 13385031 |

| Qcache_queries_in_cache | 43560 |

| Qcache_total_blocks | 111212  |

+——————————-+—————–+

mysql> show variables like ‘query_cache%‘;

+————————————–+————–+

| Variable_name      | Value  |

+————————————–+———–+

| query_cache_limit      | 2097152 |

| query_cache_min_res_unit  | 4096   |

| query_cache_size      | 203423744 |

| query_cache_type      | ON  |

| query_cache_wlock_invalidate | OFF  |

+————————————–+—————+

查询缓存碎片率= Qcache_free_blocks / Qcache_total_blocks * 100%

如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。

查询缓存利用率= (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。

查询缓存命中率= (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

示例服务器查询缓存碎片率=20.46%,查询缓存利用率=62.26%,查询缓存命中率=1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。

每个连接的缓冲

6) record_buffer_size
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。

默认数值是131072(128K),可改为16773120 (16M)

7) read_rnd_buffer_size
随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

一般可设置为16M

8) sort_buffer_size
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。

默认数值是2097144(2M),可改为16777208 (16M)。

9) join_buffer_size
联合查询操作所能使用的缓冲区大小

record_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size为每个线程独占,也就是说,如果有100个线程连接,则占用为16M*100

10) table_cache
表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

1G内存机器,推荐值是128-256。内存在4GB左右的服务器该参数可设置为256M或384M。

11) max_heap_table_size
用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#

这个变量和tmp_table_size一起限制了内部内存表的大小。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。

12) tmp_table_size
通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表。如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果,建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。

mysql> show global status like ‘created_tmp%‘;

+——————————–+———+

| Variable_name   | Value |

+———————————-+———+

| Created_tmp_disk_tables | 21197 |

| Created_tmp_files   | 58  |

| Created_tmp_tables  | 1771587 |

+——————————–+———–+

每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% =1.20%,应该相当好了 默认为16M,可调到64-256最佳,线程独占,太大可能内存不够I/O堵塞 13) thread_cache_size 可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。 通过比较 Connections和Threads_created状态的变量,可以看到这个变量的作用。 默认值为110,可调优为80。 14) thread_concurrency 推荐设置为服务器 CPU核数的2倍,例如双核的CPU, 那么thread_concurrency的应该为4;2个双核的cpu, thread_concurrency的值应为8。默认为8 15) wait_timeout 指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。 3. 配置InnoDB的几个变量 innodb_buffer_pool_size 对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。 根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。 innodb_flush_log_at_trx_commit 主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。 实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。 根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。 innodb_log_buffer_size log缓存大小,一般为1-8M,默认为1M,对于较大的事务,可以增大缓存大小。 可设置为4M或8M。 innodb_additional_mem_pool_size 该参数指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。 根据MySQL手册,对于2G内存的机器,推荐值是20M,可适当增加。 innodb_thread_concurrency=8 推荐设置为 2*(NumCPUs+NumDisks),默认一般为8

数据库还原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
************************************************************************************************
脚本
************************************************************************************************
#!/bin/sh
#xiaohuai@xiaohuai.org
#xtrabackup 2.3.3
# 使用方法:
# ./restore.sh /增量备份父目录或全备的父目录名
#eg1:./restore.sh /data/backup/full/
#eg2:./restore.sh /data/backup/incre/
#NOTICE:增量备份还原如果指定文件,则还原到指定文件名的上一个文件末截止.
#即输入的增量文件名应为需要截止的增量文件名的下一个文件
   
   
#NOTE:恢复开始前请确保mysql服务停止以及数据和日志目录清空,如
# rm -rf /usr/local/mysql/innodb_data/*
# rm -rf /usr/local/mysql/data/*
# rm -rf /usr/local/mysql/innodb_log/*
   
   
echo "*************************************************************************"
echo -e '\e[32m 提示:mysql端口根据实际环境修改. \e[m' #红色
echo "*************************************************************************"
   
   
   
INNOBACKUPEX=innobackupex
INNOBACKUPEX_PATH=/usr/bin/$INNOBACKUPEX
TMP_LOG="/var/log/restore.$$.log"
MY_CNF=/etc/my.cnf
BACKUP_DIR=/home/xtrabackup # 你的备份主目录
FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的目录
INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的目录
MEMORY=2048M # 还原的时候使用的内存限制数
ERRORLOG=grep -i "^log-error" $MY_CNF |cut -d = -f 2
MYSQLD_SAFE=/usr/local/mysql/bin/mysqld_safe
MYSQL_PORT=3306
   
   
#############################################################################
   
   
#显示错误
   
   
#############################################################################
   
   
error()
{
    echo "$1" 1>&2
    exit 1
}
   
   
#############################################################################
   
   
# 检查innobackupex错误输出
   
   
#############################################################################
   
   
check_innobackupex_fail()
{
    if [ -z "tail -2 $TMP_LOG | grep 'completed OK!'" ] ; then
    echo "$INNOBACKUPEX命令执行失败:"; echo
    echo "---------- $INNOBACKUPEX的错误输出 ----------"
    cat $TMP_LOG
    #保留一份备份的详细日志
    logfiledate=restore.date +%Y%m%d%H%M.txt
    cat $TMP_LOG>/backup/$logfiledate  
    rm -f $TMP_LOG
    exit 1
  fi
}
   
   
   
# 选项检测
if [ ! -x $INNOBACKUPEX_PATH ]; then
  error "$INNOBACKUPEX_PATH在指定路径不存在,请确认是否安装或核实链接是否正确."
fi
   
   
if [ ! -d $BACKUP_DIR ]; then
  error "备份目录$BACKUP_DIR不存在.请新建备份主目录$BACKUP_DIR"
fi
   
   
if [ $# != 1 ] ; then
  error "使用方法: $0 使用还原目录的绝对路径"
fi
   
   
   
if [ ! -d $1 ]; then
  error "指定的备份目录:$1不存在."
fi
   
   
   
PORTNUM00=netstat -lnt|grep ${MYSQL_PORT}|wc -l
if [ $PORTNUM00 = 1  ];
then
echo -e "\e[31m NOTE:------------------------------------------.\e[m" #红色
echo -e "\e[31m mysql处于运行状态,请关闭mysql. \e[m" #红色
echo -e "\e[31m NOTE:------------------------------------------.\e[m" #红色
exit 0
fi
   
   
################判断还原增量备份部分还是所有################
echo "*************************************************************************"
echo -e "\e[31m 输入的增量文件名应为截止的增量文件名的下一个文件.\e[m" #红色
echo "*************************************************************************"
ipname=''
read -p "输入截止增量备份名[默认所有]:" ipname
echo
   
   
echo "输入截止增量备份名为:$ipname"
   
   
   
input_value=$1
intpu_res=echo ${input_value%/*} 
   
   
   
   
# Some info output
echo "----------------------------"
echo
echo "$0: MySQL还原脚本"
START_RESTORE_TIME=date +%F' '%T' '%w
echo "数据库还原开始于: $START_RESTORE_TIME"
echo
   
   
   
#PARENT_DIR=dirname ${intpu_res}
PARENT_DIR=${intpu_res}
   
   
if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then
FULL=ls -t $FULLBACKUP_DIR |head -1
FULLBACKUP=${intpu_res}/$FULL
echo "还原完全备份:basename $FULLBACKUP"
echo
   
   
else
   
################判断还原部分增量备份还是所有增量备份################
if "$ipname" '' ];then
 if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
FULL=ls -t $FULLBACKUP_DIR |head -1
FULLBACKUP=$FULLBACKUP_DIR/$FULL
if [ ! -d $FULLBACKUP ]; then
error "全备:$FULLBACKUP不存在."
fi
INCR=ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1  #查找最后一个增量备份文件
echo "还原将从全备全备$FULL开始,到增量$INCR结束."
echo
echo "Prepare:完整备份..........."
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
      
   
   
# Prepare增量备份集,即将增量备份应用到全备目录中,按照增量备份顺序即按照时间从旧到最新
for in find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n ;
do
   
   
#判断最新全备的lsn
#check_full_file=find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1
      
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
      
fetch_full_lastlsn=grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2
   
   
######判断增量备份中第一个增量备份的LSN
#check_incre_file=find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1
        
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
        
fetch_incre_lastlsn=grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2
echo "完全备份$FULLBACKUP的LSN值:${fetch_full_lastlsn} "
echo "增量备份$i的LSN值:${fetch_incre_lastlsn} "
   
if "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
echo "*****************************************"
echo "LSN相等,不需要prepare!"
echo "*****************************************"
echo
break
   
   
   
else
echo "Prepare:增量备份集$i........"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
check_innobackupex_fail
    
if [ $INCR = $i ]; then
break
fi
       
fi
######判断LSN
done
   
else
error "未知的备份类型"
  fi
   
   
else
FULL=ls -t $FULLBACKUP_DIR |head -1
FULLBACKUP=$FULLBACKUP_DIR/$FULL
echo "Prepare:完整备份..........."
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
   
   
   
   
   
ipt=stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2
echo "还原的指定增量目录文件$ipname的纪元时间为:$ipt"
for in find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n ;
do
#判断for循环取到的文件名是否为输入的文件名,如果是则停止循环
if "$i" =  "$ipname" ]; then
break;
else
f01=stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2
if "$f01" -le "$ipt" ]; then
   
   
if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
if [ ! -d $FULLBACKUP ]; then
error "全备:$FULLBACKUP不存在."
fi
#INCR=ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1
echo "还原将从全备$FULL开始,到增量$ipname结束."
echo
   
   
#判断最新全备的lsn
#check_full_file=find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1
      
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
      
fetch_full_lastlsn=grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2
   
   
######判断增量备份中第一个增量备份的LSN
check_incre_file=find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1
        
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
        
fetch_incre_lastlsn=grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2
echo "完全备份的LSN:${fetch_full_lastlsn} "
echo "增量备份的LSN:${fetch_incre_lastlsn} "
if "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
echo "*****************************************"
echo -e "\e[31m LSN不需要prepare或备份间隔期间无数据变化 \e[m" #红色
echo "*****************************************"
   
   
   
fi
   
   
echo
echo "Prepare:增量备份集$i........"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
check_innobackupex_fail
   
######判断LSN
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
      
fetch_full_lastlsn=grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2
echo "完全备份当前的LSN:${fetch_full_lastlsn}"
   
   
else
error "未知的备份类型"
fi
else
echo "查找增量备份文件完成."
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
      
fetch_full_lastlsn=grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2
echo -e "\e[31m -------------------------------------------- \e[m" #红色
echo -e "\e[31m 完全备份最终的LSN:${fetch_full_lastlsn} \e[m" #红色
echo -e "\e[31m -------------------------------------------- \e[m" #红色
break
fi
fi
done
   
   
fi
################判断还原部分增量备份还是所有增量备份################
   
   
fi
   
echo
echo "prepare:完整备份以及回滚那些未提交的事务..........."
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
   
   
   
echo "*****************************"
echo "数据库还原中 ...请稍等"
echo "*****************************"
   
   
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
   
   
     
rm -f $TMP_LOG
echo "1.恭喜,还原成功!."
echo "*****************************"
   
   
#修改目录权限
echo "修改mysql目录的权限."
mysqlcnf="/etc/my.cnf"
mysqldatadir=grep -i "^basedir" $mysqlcnf |cut -d = -f 2
echo 'chown -R mysql:mysql' ${mysqldatadir}
echo "2.权限修改成功!"
echo "*****************************"
   
   
#自动启动mysql
   
   
INIT_NUM=1
if [ ! -x $MYSQLD_SAFE ]; then
  echo "mysql安装时启动文件未安装到$MYSQLD_SAFE或无执行权限"
  exit 1  #0是执行成功,1是执行不成功
else
echo "启动本机mysql端口为:$MYSQL_PORT的服务"
$MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/null &
while  [ $INIT_NUM  -le 10 ]
      do
        PORTNUM=netstat -lnt|grep ${MYSQL_PORT}|wc -l
        echo "mysql启动中....请稍等..."
        sleep 10
        if [ $PORTNUM = 1  ];
        then
echo -e "\e[32m mysql                                      ****启动成功**** \e[m"
        exit 0
        fi
        INIT_NUM=$(($INIT_NUM +1))
      done
echo -e "\e[31m mysql启动失败或启动时间过长,请检查错误日志 echo 'cat ' ${ERRORLOG} \e[m"
echo "*****************************************"
exit 0
fi
   
   
   
END_RESTORE_TIME=date +%F' '%T' '%w
echo "数据库还原完成于: $END_RESTORE_TIME"
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
************************************************************************************************
执行结果:
************************************************************************************************
   
# ./restore.sh /backup/incre/ 
输入截止增量备份名[默认所有]:2015-04-10_14-10-49
  
  
输入截止增量备份名为:2015-04-10_14-10-49
----------------------------
  
  
./restore.sh: MySQL还原脚本
数据库还原开始于: 2015-04-10 14:24:51 5
  
  
Prepare:完整备份...........
*****************************
还原的指定增量目录文件2015-04-10_14-10-49的纪元时间为:1428646269
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
  
  
完全备份的LSN: 344693290 
增量备份的LSN: 413297865 
Prepare:增量备份集2015-04-10_14-08-19........
*****************************
完全备份当前的LSN: 413297865
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
  
  
完全备份的LSN: 413297865 
增量备份的LSN: 481905295 
Prepare:增量备份集2015-04-10_14-09-07........
*****************************
完全备份当前的LSN: 481905295
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.
  
  
完全备份的LSN: 481905295 
增量备份的LSN: 550515490 
Prepare:增量备份集2015-04-10_14-10-49........
*****************************
完全备份当前的LSN: 550515490
查找增量备份文件完成.
 -------------------------------------------- 
 完全备份最终的LSN: 550515490 
 -------------------------------------------- 
  
  
prepare:完整备份以及回滚那些未提交的事务...........
*****************************
数据库还原中 ...请稍等
*****************************
1.恭喜,还原成功!.
*****************************
修改mysql目录的权限.
2.权限修改成功!
*****************************
启动本机mysql端口为:3306的服务
mysql启动中....请稍等...
mysql启动中....请稍等...
mysql启动中....请稍等...
 mysql                                      ****启动成功**** 

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