运维和管理企业Linux服务器,除了要熟练Linux系统本身的维护和管理之外,最紧张的是熟练乃至精通基于Linux系统安装配置各种应用软件,对软件进行调优以及软件在利用中遇到各类题目,能够快速定位并解决题目。
本章向读者先容进程、线程、企业Vsftpd服务器实战、匿名用户访问、系统用户访问及捏造用户实战等。
Linux系统各种软件和服务,存在于系统,必然会占用系统各种资源,系统资源是如何分配及调度的呢,本节将给读者展示系统进程、资源及调度相关的内容。
进程(Process)是计算机中的软件步伐关于某数据聚集上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
在早期面向进程设计的计算机结构中,进程是步伐的基本实验实体,在当代面向线程设计的计算机结构中,进程是线程的容器。软件步伐是对指令、数据及其组织形式的描述,而进程是步伐的实体,通常而言,把运行在系统中的软件步伐称之为进程。
除了进程,读者通常会听到线程的概念,线程也被称为轻量级进程(Lightweight Process,LWP),是步伐实验流的最小单位。一个标准的线程由线程ID,当前指令指针(PC),寄存器聚集和堆栈组成。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有操作系统资源,但是该线程可与同属进程的其它线程共享该进程所拥有的全部资源。
步伐、进程、线程三者区别如下:
- 步伐:步伐并不能单独实验,是静止的,只有将步伐加载到内存中,系统为其分配资源后才能够实验;
- 进程:步伐对一个数据集的动态实验过程,一个进程包含一个大概更多的线程,一个线程同时只能被一个进程所拥有,进程是分配资源的基本单位。进程拥有独立的内存单位,而多个线程共享内存,从而提高了应用步伐的运行效率。
- 线程:线程是进程内的基本调度单位,线程的划分尺度小于进程,并发性更高,线程本身不拥有系统资源, 但是该线程可与同属进程的其它线程共享该进程所拥有的全部资源。每一个独立的线程,都有一个步伐运行的入口、顺序实验序列、和步伐的出口。
如图8-1所示,步伐、进程、线程三者的关系拓扑图:
图8-1 步伐、进程、线程关系图
如上图8-1所示,多进程、多线程的区别如下:
- 多进程,每个进程互相独立,不影响主步伐的稳定性,某个子进程崩溃对其他进程没有影响,通过增长CPU可以扩充软件的性能,可以淘汰线程加锁/解锁的影响,极大提高性能。缺点是多进程逻辑控制复杂,需要和主步伐交互,需要跨进程边界,进程之间上下文切换比线程之间上下文切换代价大。
- 多线程,无需跨进程,步伐逻辑和控制方式简单,所有线程共享该进程的内存和变量等。缺点是每个线程与主步伐共用地址空间,线程之间的同步和加锁控制比力麻烦,一个线程的崩溃会影响到整个进程大概步伐的稳定性。
文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。 FTP 基于TCP协议天生一个捏造的连接,紧张用于控制FTP连接信息,同时再天生一个单独的TCP连接用于FTP数据传输。用户可以通过客户端向FTP服务器端上传、下载、删除文件,FTP服务器端可以同时提供给多人共享利用。
FTP服务是Client/Server(简称C/S)模式,基于FTP协议实现FTP文件对外共享及传输的软件称之为FTP服务器源端,客户端步伐基于FTP协议,则称之为FTP客户端,FTP客户端可以向FTP服务器上传、下载文件。
FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP自动模式、FTP被动模式,主被动模式均是以FTP服务器端为参照。主被动模式如图8-2(a)、8-2(b)所示,主被动模式详细区别如下:
- FTP自动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21下令端口,客户端开始监听端口N+1,并发送FTP下令“port N+1”到FTP服务器,FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1)。
- FTP被动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21下令端口,客户端开始监听端口N+1,客户端提交 PASV下令,服务器会开启一个任意的端口(P >1024),并发送PORT P下令给客户端。客户端发起从当地端口N+1到服务器的端口P的连接用来传送数据。
在企业现实环境中,如果FTP客户端与FTP服务端均开放防火墙,FTP需以自动模式工作,这样只需要在FTP服务器端防火墙规则中,开放20、21端口即可。关于防火墙配置后面章节会讲解。
图8-2(a) FTP自动模式
图8-2(b) FTP被动模式
目前主流的FTP服务器端软件包括:Vsftpd、ProFTPD、PureFTPd、Wuftpd、Server-U FTP、 FileZilla Server等软件,此中Unix/Linux利用较为广泛的FTP服务器端软件为Vsftpd 。
非常安全的FTP服务进程(Very Secure FTP daemon,Vsftpd),Vsftpd在Unix/Linux发行版中最主流的FTP服务器步伐,长处小巧轻快,安全易用、稳定高效、满足企业跨部分、多用户的利用(1000用户)等。
Vsftpd基于GPL开源协议发布,在中小企业中得到广泛的应用,Vsftpd可以快速上手,基于Vsftpd捏造用户方式,访问验证更加安全。Vsftpd还可以基于MYSQL数据库做安全验证,多重安全防护。
Vsftpd服务器端安装有两种方法,一是基于YUM方式安装,而是基于源码编译安装,终极实现效果完全一致,本文接纳YUM安装Vsftpd,步调如下:
图8-3 YUM安装Vsftpd服务端
- 打印vsftpd安装后的配置文件路径、启动Vsftpd服务及查看进程是否启动,如图8-4所示:
rpm -ql vsftpd|more
systemctl restart vsftpd.service
ps -ef |grep vsftpd
| 图8-4 打印Vsftpd软件安装后路径
anonymous_enable=YES 开启匿名用户访问;
local_enable=YES 启用当地系统用户访问;
write_enable=YES 当地系统用户写入权限;
local_umask=022 当地用户创建文件及目录默认权限掩码;
dirmessage_enable=YES 打印目录表现信息,通常用于用户第一次访问目录时,信息提示;
xferlog_enable=YES 启用上传/下载日志记录;
connect_from_port_20=YES FTP利用20端口进行数据传输;
xferlog_std_format=YES 日志文件将根据xferlog的标准格式写入;
listen=NO Vsftpd不以独立的服务启动,通过Xinetd服务管理,建议改成YES;
listen_ipv6=YES 启用IPV6监听;
pam_service_name=vsftpd 登录FTP服务器,依据/etc/pam.d/vsftpd中内容进行认证;
userlist_enable=YES vsftpd.user_list和ftpusers配置文件里用户克制访问FTP;
tcp_wrappers=YES 设置vsftpd与tcp wrapper团结进行主机的访问控制,Vsftpd服务器检查/etc/hosts.allow 和/etc/hosts.deny中的设置,来决定哀求连接的主机,是否允许访问该FTP服务器。
|
- 启动Vsftpd服务后,通过Windows客户端资源管理器访问Vsftp服务器端,如图8-5所示:
图8-5 匿名用户访问FTP默认目录
FTP主被动模式,默认为自动模式,设置为被动模式利用端口方法如下:
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60100
| Vsftpd默认以匿名用户访问,匿名用户默认访问的FTP服务器端路径为:/var/ftp/pub,匿名用户只有查看权限,无法创建、删除、修改。如需关闭FTP匿名用户访问,需修改配置文件/etc/vsftpd/vsftpd.conf,将anonymous_enable=YES修改为anonymous_enable=NO,重启Vsftpd服务即可。
如果允许匿名用户能够上传、下载、删除文件,需在/etc/vsftpd/vsftpd.conf配置文件中参加如下代码:
anon_upload_enable=YES 允许匿名用户上传文件;
anon_mkdir_write_enable=YES 允许匿名用户创建目录;
anon_other_write_enable=YES 允许匿名用户其他写入权限。
| 匿名用户完整vsftpd.conf配置文件代码如下:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
| 由于默认Vsftpd匿名用户有两种:anonymous、ftp,所以匿名用户如果需要上传文件、删除及修改等权限,需要ftp用户对/var/ftp/pub目录有写入权限,利用如下chown和chmod任意一种即可,设置下令如下:
chown -R ftp pub/
chmod o+w pub/
| 如上Vsftpd.conf配置文件配置完毕,同时权限设置完,重启vsftpd服务即可,通过Windows客户端访问,能够上传文件、删除文件、创建目录等操作,如图8-6所示:
图8-6 匿名用户访问上传文件
Vsftpd匿名用户设置完毕,匿名用户,任何人都可以查看FTP服务器端的文件、目录,乃至可以修改、删除,此方案如适合存放私密文件在FTP服务器端,如何保证文件大概目录专属拥有者呢,Vsftpd系统用户可以实现该需求。
实现Vsftpd系统用户方式验证,只需在Linux系统中创建多个用户即可,创建用户利用useradd,同时给用户设置暗码,即可通过用户和暗码登录FTP,进行文件上传、下载、删除等操作。Vsftpd系统用户实现方法步调如下:
- Linux系统中创建系统用户jfedu1、jfedu2,分别设置暗码为123456:
useradd jfedu1
useradd jfedu2
echo 123456|passwd --stdin jfedu1
echo 123456|passwd --stdin jfedu2
| anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
|
- 通过Windows资源客户端验证,利用jfedu1、jfedu2用户登录FTP服务器,即可上传文件、删除文件、下载文件,jfedu1、jfedu2系统用户上传文件的家目录在/home/jfedu1、/home/jfedu2下,如图8-7(a)、8-7(b)所示:
图8-7(b) jfedu1登录FTP服务器上传文件
如果基于Vsftpd系统用户访问FTP服务器,系统用户越多越不利于管理,而且不利于系统安全管理,鉴于此,为了能更加的安全利用VSFTPD,需利用Vsftpd捏造用户方式。
Vsftpd捏造用户原理:捏造用户就是没有现实的真实系统用户,而是通过映射到此中一个真实用户以及设置相应的权限来实现访问验证,捏造用户不能登录Linux系统,从而让系统更加的安全可靠。
Vsftpd捏造用户企业案例配置步调如下:
yum install pam* libdb-utils libdb* --skip-broken -y
|
- 创建捏造用户临时文件/etc/vsftpd/ftpusers.txt,新建捏造用户和暗码,此中jfedu001、jfedu002为捏造用户名,123456为暗码,如果有多个用户,依次格式填写即可:
jfedu001
123456
jfedu002
123456
|
- 天生Vsftpd捏造用户数据库认证文件,设置权限700:
db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db
chmod 700 /etc/vsftpd/vsftpd_login.db
|
- 配置PAM认证文件,/etc/pam.d/vsftpd行首参加如下两行:
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
|
- 所有Vsftpd捏造用户需要映射到一个系统用户,该系统用户不需要暗码,也不需要登录,紧张用于捏造用户映射利用,创建下令如下:
useradd -s /sbin/nologin ftpuser
| #global config Vsftpd 2017
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES
#config virtual user FTP
pam_service_name=vsftpd
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=YES
| 如上Vsftpd捏造用户配置文件参数详解:
#config virtual user FTP
pam_service_name=vsftpd 捏造用户启用pam认证;
guest_enable=YES 启用捏造用户;
guest_username=ftpuser 映射捏造用户至系统用户ftpuser;
user_config_dir=/etc/vsftpd/vsftpd_user_conf 设置捏造用户配置文件所在的目录;
virtual_use_local_privs=YES 捏造用户利用与当地用户类似的权限。
|
- 至此,所有捏造用户共同基于/home/ftpuser主目录实现文件上传与下载,可以在/etc/vsftpd/vsftpd_user_conf目录创建捏造用户各自的配置文件,创建捏造用户配置文件主目录:
mkdir -p /etc/vsftpd/vsftpd_user_conf/
|
- 如下分别为捏造用户jfedu001、jfedu002用户创建配置文件:
vim /etc/vsftpd/vsftpd_user_conf/jfedu001,同时创建私有的捏造目录,代码如下:
local_root=/home/ftpuser/jfedu001
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
| vim /etc/vsftpd/vsftpd_user_conf/jfedu002,同时创建私有的捏造目录,代码如下:
local_root=/home/ftpuser/jfedu002
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
| 捏造用户配置文件内容详解:
local_root=/home/ftpuser/jfedu002 jfedu002捏造用户配置文件路径;
write_enable=YES 允许登陆用户有写权限;
anon_world_readable_only=YES 允许匿名用户下载,然后读取文件;
anon_upload_enable=YES 允许匿名用户上传文件权限,只有在write_enable=YES时该参数才生效;
anon_mkdir_write_enable=YES 允许匿名用户创建目录,只有在write_enable=YES时该参数才生效;
anon_other_write_enable=YES 允许匿名用户其他权限,比方删除、重命名等。
| mkdir -p /home/ftpuser/{jfedu001,jfedu002} ;chown -R ftpuser:ftpuser /home/ftpuser
| 重启Vsftpd服务,通过Windows客户端资源管理器登录Vsftpd服务端,测试效果如图8-8(a)、8-8(b)所示:
图8-8(a) jfedu001捏造用户登录FTP服务器
图8-8(b) jfedu001捏造用户上传下载文件
万维网 (WORLD WIDE WEB,WWW)服务器,也称之为WEB服务器,紧张功能是提供网上信息欣赏服务。WWW是 Internet的多媒体信息查询工具,是Internet上飞快发展的服务,也是目前用的最广泛的服务。正是因为有了WWW软件,才使得近年来 Internet 敏捷发展。
目前主流的WEB服务器软件包括:Apache、Nginx、Lighttpd、IIS、Resin、Tomcat、WebLogic、Jetty等。
本章向读者先容Apache WEB服务器发展历史、Apache工作模式深入剖析、Apache捏造主机、配置文件详解及Apache Rewrite企业实战等。
Apache HTTP Server是Apache软件基金会的一个开源的网页服务器,是世界利用排名第一的Web服务器软件,可以运行在险些所有广泛利用的计算机平台上,由于其跨平台和安全性被广泛利用,是目前最盛行的Web服务器端软件之一。
Apache服务器是一个多模块化的服务器,经过多次修改,成为目宿世界利用排名第一的Web服务器软件。Apache取自“A Patchy Server”的读音,即充满补丁的服务器,因为Apache基于GPL发布,大量开辟者不断为Apache贡献新的代码、功能、新的特性、修改原来的缺陷。
Apache服务器的特点是利用简单、速度快、性能稳定,可以做负载均衡及代理服务器来利用。
每辆汽车都有发动机引擎,不同的引擎,对车子运行效率也不一样,同样Apache也有类似工作引擎大概处理哀求的模块,亦可称之为多路处理模块(Multi-Processing Modules,MPM),Apache WEB服务器有三种处理模块:Prefork MPM、Worker MPM、Event MPM。
在企业中最常用的处理模块为Prefork MPM和Worker MPM,Event MPM不支持HTTPS方式,官网也给出“This MPM is experimental, so it may or may not work as expected”提示,所以很少被利用。
默认Apache处理模块为Prefork MPM方式,Prefork接纳的预派生子进程方式,Prefork用单独的子进程来处理不同的哀求,进程之间是彼此独立的,所以比力稳定。
Prefork的工作原理:控制进程Master在最初建立“StartServers”个进程后,为了满足MinSpareServers设置的最小空闲进程,所以需创建第一个空闲进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个,依次按照递增指数级创建进程数,最多每秒同时创建32个空闲进程,直到满足至少有MinSpareServers设置的值为止。
Apache的预派生模式(Prefork),基于预派生模式不必在哀求到来时再产生新的进程,从而减小了系统开销以增长性能,不过由于Prefork MPM引擎是基于多进程方式提供对外服务,每个进程占内存也相对较高。
相对于Prefork MPM,Worker方式是2.0版中全新的支持多线程和多进程混淆模型的MPM,由于利用线程来处理,所以可以处理海量的HTTP哀求,而系统资源的开销要小于基于Prefork多进程的方式。Worker也是基于多进程,但每个进程又天生多个线程,这样可以保证多线程可以得到进程的稳定性。
Worker MPM工作原理:控制进程Master在最初建立“StartServers”个进程,每个进程会创建ThreadsPerChild设置的线程数,多个线程共享该进程内存空间,同时每个线程独立地处理用户的HTTP哀求。为了不在哀求到来时再天生线程,Worker MPM也可以设置最大最小空闲线程。
Worker MPM模式下同时处理的哀求总数=进程总数xThreadsPerChild,也即等于MaxClients。如果服务器负载很高,当前进程数不满足需求,Master控制进程会fork新的进程,最大进程数不能凌驾ServerLimit数,如果需调解的StartServers进程数,需同时调解ServerLimit值。
Prefork MPM与Worker MPM引擎区别小结如下:
- Prefork MPM模式:利用多个进程,每个进程只有一个线程,每个进程在某个确定的时间只能维持一个连接,稳定,内存开销较高;
- Worker MPM模式:利用多个进程,每个子进程包含多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比力小,适合大并发、高流量的WEB服务器。Worker MPM缺点是一个线程崩溃,整个进程就会连同其任何线程一起挂掉。
从Apache官方分站点下载目前稳定版本httpd-2.2.32版本,目前最新版本为2.4版本,下载地址如下:
http://mirrors.hust.edu.cn/apache/httpd/httpd-2.2.32.tar.bz2
| Apache WEB服务器安装步调如下:
tar -xjvf httpd-2.2.32.tar.bz2 tar工具解压httpd包;
cd httpd-2.2.32/ 进入解压后目录;
yum install apr apr-devel apr-util apr-util-devel -y 安装APR相关优化模块;
./configure --prefix=/usr/local/apache2/ --enable-rewrite --enable-so 预编译Apache,启用rewrite规则、启用动态加载库;
make 编译
make install 安装
| Apache2.2.32安装完毕,如图10-1所示:
图10-1 Apache2.2.32安装图解
启动Apache服务,临时关闭selinux、firewalld防火墙:
/usr/local/apache2/bin/apachectl start
setenforce 0
systemctl stop firewalld.service
| 查看Apache服务进程,通过客户端欣赏器访问http://192.168.111.131/,如图10-2(a)、10-2(b)所示:
图10-2(b) 欣赏器访问Apache WEB服务器
企业真实环境中,一台WEB服务器发布单个网站会非常浪费资源,所以一台WEB服务器上会发布多个网站,少则3-5个,多则2-30个网站。
在一台服务器上发布多网站,也称之为部署多个捏造主机,WEB捏造主机配置方法有三种:
- 基于单IP多个Socket端口;
- 基于多IP地址一个端口;
- 基于单IP一个端口不同域名。
此中基于同一端口不同域名的方式在企业中得到广泛的利用和应用,如下为基于一个端口不同域名,在一台Apache WEB服务器上部署多个网站,步调如下:
- 创建捏造主机配置文件httpd-vhosts.conf,该文件默认已存在,只需去掉httpd.conf配置文件中#号即可,如图10-3所示:
图10-3 httpd.conf配置文件开启捏造主机
- 配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf中代码设置为如下:
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin support@jfedu.net
DocumentRoot "/usr/local/apache2/htdocs/jf1"
ServerName www.jf1.com
ErrorLog "logs/www.jf1.com_error_log"
CustomLog "logs/www.jf1.com_access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin support@jfedu.net
DocumentRoot "/usr/local/apache2/htdocs/jf2"
ServerName www.jf2.com
ErrorLog "logs/www.jf2.com_error_log"
CustomLog "logs/www.jf2.com_access_log" common
</VirtualHost>
| Httpd-vhosts.conf参数详解:
NameVirtualHost *:80 开启捏造主机,并且监听当地所有网卡接口的80端口;
<VirtualHost *:80> 捏造主机配置起始;
ServerAdmin support@jfedu.net 管理员邮箱;
DocumentRoot "/usr/local/apache2/htdocs/jf1" 该捏造主机发布目录;
ServerName www.jf1.com 捏造主机完整域名;
ErrorLog "logs/www.jf1.com_error_log" 错误日志路径及文件名;
CustomLog "logs/www.jf1.com_access_log" common 访问日志路径及文件名;
</VirtualHost> 捏造主机配置结束。
|
- 创建www.jf1.com及www.jf2.com发布目录,重启apache服务,并分别创建index.html页面:
mkdir -p /usr/local/apache2/htdocs/{jf1,jf2}/
/usr/local/apache2/bin/apachectl restart
echo "<h1> www.jf1.com Pages</h1>" >/usr/local/apache2/htdocs/jf1/index.html
echo "<h1> www.jf2.com Pages</h1>" >/usr/local/apache2/htdocs/jf2/index.html
|
- Windows客户端设置Hosts映射,将www.jf1.com、www.jf2.com与192.168.111.131 IP进行映射绑定,映射的目的将域名跟IP进行绑定,在欣赏器可以输入域名,不需要输入IP地址,绑定方法是在“C:\Windows\System32\drivers\etc”文件夹中,利用记事本编辑hosts文件,参加如下代码,如图10-4所示:
192.168.111.131 www.jf1.com
192.168.111.131 www.jf2.com
| 图10-4 Windows主机Hosts配置
- 欣赏器访问www.jf1.com、www.jf2.com如图10-5(a)、10-5(b)所示,至此Apache基于多域名捏造主机配置完毕,如果还需添加捏造主机,直接拷贝此中一个捏造主机配置、修改WEB发布目录即可
图10-5(a) www.jf1.com网站返回内容
图10-5(b) www.jf2.com网站返回内容
Apache可以基于源码安装、YUM安装,不同的安装方法,所属的路径特不同,如下为Apache常用路径的功能用途:
/usr/lib64/httpd/modules/ Apache模块存放路径;
/var/www/html/ YUM安装Apache网站发布目录;
/var/www/error/ 服务器设置错误信息,欣赏器表现;
var/www/icons/ Apache小图标文件存放目录;
var/www/cgi-bin/ 可实验的CGI步伐存放目录。
/var/log/httpd/ Apache日志目录;
/usr/sbin/apachectl Apache启动脚本;
/usr/sbin/httpd Apache二进制实验文件;
/usr/bin/htpasswd 设置Apache目录暗码访问;
/usr/local/apache2/bin Apache下令目录;
/usr/local/apache2/build Apache构建编译目录;
/usr/local/apache2/htdocs/ 源码安装Apache网站发布目录;
/usr/local/apache2/cgi-bin 可实验的CGI步伐存放目录;
/usr/local/apache2/include Apache引用配置文件目录;
/usr/local/apache2/logs Apache日志目录;
/usr/local/apache2/man Apache帮助文档目录;
/usr/local/apache2/manual Apache手册;
/usr/local/apache2/modules Apache模块路径。
| Apache的配置文件是Apache WEB难点,读者需要把握配置文件中每个参数的寄义,才能明白并在一样平常运维中去解决Apache遇到的故障,如下为Apache配置文件详解:
ServerTokens OS 表现服务器的版本和操作系统内核版本;
ServerRoot "/usr/local/apache2/" Apache主配置目录;
PidFile run/httpd.pid PidFile进程文件;
Timeout 60 不论接收或发送,当连续连接等待凌驾60秒则该次连接就中断;
KeepAlive Off 关闭连续性的连接;
MaxKeepAliveRequests 100 当KeepAlive设置为On的时候,该数值可以决定此次连接能够传输的最大传输数量;
KeepAliveTimeout 65 当KeepAlive设置为On的时候,该连接在末了一次传输后等待延迟的秒数;
<IfModule prefork.c> Prefork MPM引擎配置段;
StartServers 8 默认启动Apache工作进程数;
MinSpareServers 5 最小空闲进程数;
MaxSpareServers 20 最大空闲进程数;
ServerLimit 4096 Apache服务器最多进程数;
MaxClients 4096 每秒支持的最大客户端并发;
MaxRequestsPerChild 4000 每个进程能处理的最大哀求数;
</IfModule>
<IfModule worker.c> Worker MPM引擎配置段;
StartServers 8 默认启动Apache工作进程数;
MaxClients 4000 每秒支持的最大客户端并发;
MinSpareThreads 25 最小空闲线程数;
MaxSpareThreads 75 最小空闲线程数;
ThreadsPerChild 75 每个进程启动的线程数;
MaxRequestsPerChild 0 每个进程能处理的最大哀求数,0表现无穷定;
</IfModule>
LoadModule mod_version.so 静态加载apache相关模块;
ServerAdmin support@jfedu.net 管理员邮箱,网站异常,错误信息会发生至该邮箱;
DocumentRoot "/usr/local/apache2/htdocs/" Apache网站默认发布目录;
<Directory "/data/webapps/www1"> 设置/data/webapps/www1目录权限;
AllowOverride All
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
AllowOverride 设置为None时,目录中.htaccess 文件将被完全忽略,当指令设置为All时,.htaccess文件生效;
Options -Indexes FollowSymLinks 克制欣赏目录,去掉”-“,表现欣赏目录,常用于下载站点;
Order allow,deny 默认环境下克制所有客户机访问;
Order deny,allow 默认环境下允许所有客户机访问;
Allow from all 允许所有客户机访问。
| Rewirte规则也称为规则重写,紧张功能是实现欣赏器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,险些所有的WEB服务器均可以支持URL重写。Rewrite URL规则重写的用途:
- 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
- 隐藏网站URL真实地址,欣赏器表现更加美观;
- 网站变更升级,可以基于Rewrite临时重定向到其他页面。
Apache WEB服务器如需要利用Rewrite功能,须添加Rewrite模块,基于源码安装是指定参数“--enable-rewrite”,还有一种方法可以动态添加模块,以DSO模式安装Apache,利用模块源码和Apache apxs工具完成Rewrite模块的添加。
利用Apache Rewrite,除了安装Rewrite模块之外,还需在httpd.conf中的全局配置段大概捏造主机配置段设置如下指令来开启Rewrite功能:
Apache Rewrite规则利用中有三个概念需要明白,分别是:Rewrite末端标识符、Rewrite规则常用表达式、Apache Rewrite变量,如下为三个概念的详解:
- Apache Rewrite末端标识符,用于Rewrite规则末尾,表现规则的实验属性。
R[=code](force redirect) 强制外部重定向;
G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码;
P(force proxy) 强制利用代理转发;
L(last rule) 匹配当前规则为末了一条匹配规则,停止匹配后续规则;
N(next round) 重新从第一条规则开始匹配;
C(chained with next rule) 与下一条规则关联;
T=MIME-type(force MIME type) 强制MIME范例;
NC(no case) 不区分大小写。
|
- Apache Rewrite规则常用表达式,紧张用于匹配参数、字符串及过滤设置。
. 匹配任何单字符;
[word] 匹配字符串:word;
[^word] 不匹配字符串:word;
jfedu|jfteach 可选择的字符串:jfedu|jfteach;
? 匹配0到1个字符;
* 匹配0到多个字符;
+ 匹配1到多个字符;
^ 字符串开始标志;
$ 字符串结束标志;
\n 转义符标志。
|
- Apache Rewrite变量,常用于匹配HTTP哀求头信息、欣赏器主机名、URL等。
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;
connection & request: REMOTE_ADDR, QUERY_STRING;
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
system stuff: TIME_YEAR, TIME_MON, TIME_DAY。
详解如下:
HTTP_USER_AGENT 用户利用的代理,比方欣赏器;
HTTP_REFERER 告知服务器,从哪个页面来访问的;
HTTP_COOKIE 客户端缓存,紧张用于存储用户名和暗码等信息;
HTTP_HOST 匹配服务器ServerName域名;
HTTP_ACCEPT 客户端的欣赏器支持的MIME范例;
REMOTE_ADDR 客户端的IP地址
QUERY_STRING URL中访问的字符串;
DOCUMENT_ROOT 服务器发布目录;
SERVER_PORT 服务器端口;
SERVER_PROTOCOL 服务器端协议;
TIME_YEAR 年;
TIME_MON 月;
TIME_DAY 日;
|
- Rewrite规则实战案例,以下配置均配置在httpd.conf大概vhosts.conf中,企业中常用的Rewrite案比方下:
- 将jfedu.net跳转至www.jfedu.net。
RewriteEngine on 启用rewrite引擎;
RewriteCond %{HTTP_HOST} ^jfedu.net [NC] 匹配以jfedu.net开头的域名,NC忽略大小写;
RewriteRule ^/(.*)$ http://www.jfedu.net/$1 [L] (.*)表现任意字符串,$1表现引用(.*)的中任意内容。
|
- 将www.jf1.com www.jf2.com jfedu.net跳转至www.jfedu.net,OR寄义表现大概。
RewriteEngine on
RewriteCond %{HTTP_HOST} www.jf1.com [NC,OR]
RewriteCond %{HTTP_HOST} www.jf2.com [NC,OR]
RewriteCond %{HTTP_HOST} ^jfedu.net [NC]
RewriteRule ^/(.*)$ http://www.jfedu.net/$1 [L]
|
- 访问www.jfedu.net首页,跳转至www.jfedu.net/newindex/,R=301表现永久重定向。
RewriteEngine on
RewriteRule ^/$ http://www.jfedu.net/newindex/ [L,R=301]
|
- 访问/newindex/plus/view.php?aid=71跳转至http://www.jfedu.net/linux/。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^tid=(.+)$ [NC]
RewriteRule ^/forum\.php$ /jfedu/thread-new-%1.html? [R=301,L]
|
- 访问www.jfedu.net首页,内容访问www.jfedu.net/newindex/,但是欣赏器URL地址不改变。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.jfedu.net [NC]
RewriteRule ^/$ /newindex/ [L]
|
- 访问/forum.php?tid=107258跳转至/jfedu/thread-new-107258.html。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^tid=(.+)$ [NC]
RewriteRule ^/forum\.php$ /jfedu/thread-new-%1.html? [R=301,L]
|
- 访问/xxx/123456跳转至/xxx?id=123456。
RewriteEngine on
rewriteRule ^/(.+)/(\d+)$ /$1?id=$2 [L,R=301]
|
- 判断是否利用移动端访问网站,移动端访问跳转至m.jfedu.net。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^iPhone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Android [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WAP [NC]
RewriteRule ^/$ http://m.jfedu.net/index.html [L,R=301]
RewriteRule ^/(.*)/$ http://m.jfedu.net/$1 [L,R=301]
|
- 访问/10690/jfedu/123跳转至/index.php?tid/10690/items=123,[0-9]表现任意一个数字,+表现多个,(.+)表现任何多个字符。
RewriteEngine on
RewriteRule ^/([0-9]+)/jfedu/(.+)$ /index.php?tid/$1/items=$2 [L,R=301]
| MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开辟,目前属于 Oracle 旗下公司。MySQL 最盛行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
本章向读者先容关系型数据库特点、MySQL数据库引擎特点、数据库安装配置、SQL案例操作、数据库索引、慢查询、MySQL数据库集群实战等。
MySQL 是一种关联数据库管理系统,关联数据库将数据生存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增长了速度并提高了灵活性。MySQL 所利用的 SQL 语言是用于访问数据库的最常用标准化语言。
MySQL数据库紧张用于存储各类信息数据,比方:员工姓名、身份证ID、商城订单及金额、销售业绩及陈诉,学生考试成绩、网站帖子、论坛用户信息、系统报表等等。
MySQL 软件接纳了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有本钱低,尤其是开放源码这一特点,一般中小型网站的开辟都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成精良的开辟环境。
关系数据库管理系统(Relational Database Management System,RDBMS),是将数据组织为相关的行和列的系统,而管理关系数据库的计算机软件就是关系数据库管理系统,常用的关系型数据库软件有MYSQL、Mariadb、Oracle、SQL Server、PostgreSQL、DB2等。)
RDBMS数据库的特点如下:
- 数据以表格的形式出现;
- 每行记录数据的真实内容;
- 每列记录数据真实内容的数据域;
- 无数的行和列组成一张表;
- 若干的表组成一个数据库;
目前主流架构LAMP(Linux+Apache+MySQL+PHP),MySQL更是得到各位IT运维、DBA的青睐,固然MySQL数据库已被Orcacle公司收购,不过好消息是原来MySQL创始人已独立出来自己重新开辟了MariaDB数据库,开源免费,目前越来越多的人开始尝试利用。MariaDB数据库兼容MySQL数据库所有的功能和相关参数。
MySQL数据库运行在服务器前,需要选择启动的引擎,好比一辆轿车,性能好的发动机遇提拔轿车的性能,从而启动、运行更加的高效。同样MYSQL也有类似发动机引擎,这里称之为MYSQL引擎。
MYSQL引擎包括:ISAM、MyISAM、InnoDB 、MEMORY、CSV、BLACKHOLE、ARCHIVE、PERFORMANCE_SCHEMA、Berkeley、Merge、Federated、Cluster/NDB等,此中MyISAM、InnoDB利用最为广泛,如下为Myisam BDB Memory InnoDB Archive引擎功能的对比:
引擎特性
| Myisam
| BDB
| Memory
| InnoDB
| Archive
| 批量插入的速度
| 高
| 高
| 高
| 中
| 非常高
| 集群索引
| 不支持
| 不支持
| 不支持
| 支持
| 不支持
| 数据缓存
| 不支持
| 不支持
| 支持
| 支持
| 不支持
| 索引缓存
| 支持
| 不支持
| 支持
| 支持
| 不支持
| 数据可压缩
| 支持
| 不支持
| 不支持
| 不支持
| 支持
| 硬盘空间利用
| 低
| 低
| NULL
| 高
| 非常低
| 内存利用
| 低
| 低
| 中等
| 高
| 低
| 外键支持
| 不支持
| 不支持
| 不支持
| 支持
| 不支持
| 存储限定
| 没有
| 没有
| 有
| 64TB
| 没有
| 事务安全
| 不支持
| 支持
| 不支持
| 支持
| 不支持
| 锁机制
| 表锁
| 页锁
| 表锁
| 行锁
| 行锁
| B树索引
| 支持
| 支持
| 支持
| 支持
| 不支持
| 哈希索引
| 不支持
| 不支持
| 支持
| 支持
| 不支持
| 全文索引
| 支持
| 不支持
| 不支持
| 不支持
| 不支持
| 性能总结:MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务;
InnoDB事务型数据库的首选引擎,支持ACID事务,ACID包括:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在实验事务过程无法保证数据的正确性。
MYSQL5.5之后默认引擎为InnoDB,Innodb支持行级锁定, 支持事物、外键等功能。
BDB源自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性;
Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失;
Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合利用什么引擎呢?
MyISAM范例的数据库表强调的是性能,其实验数度比InnoDB范例更快,但不提供事务支持,不支持外键,如果实验大量的SELECT(查询)操作,MyISAM是更好的选择,支持表锁。
InnoDB提供事务支持事务、外部键、行级锁等高级数据库功能,实验大量的INSERT或UPDATE,出于性能方面的思量,可以思量利用InnoDB引擎。
MySQL数据库安装方法有两种,一种是yum/rpm通过YUM源在线安装,另外一种是通过源码软件编译安装。
yum install mysql-server mysql-devel mysql-libs -y CentOS6.x YUM安装
yum install mariadb-server mariadb mariadb-libs -y CentOS7.x YUM安装
|
- 源码安装MYSQL5.5.20方法,通过cmake、make、make install三个步调实现。
wget http://down1.chinaunix.net/distfiles/mysql-5.5.20.tar.gz
yum install cmake ncurses-devel ncurses -y
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql55/ \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_BIG_TABLES=1 \
-DWITH_DEBUG=0
make
make install
| cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql55 Cmake预编译;-DMYSQL_UNIX_ADDR=/tmp/mysql.sock MYSQL Socket通信文件位置;
-DMYSQL_DATADIR=/data/mysql MYSQL数据存放路径;
-DSYSCONFDIR=/etc 配置文件路径;
-DMYSQL_USER=mysql MYSQL运行用户;
-DMYSQL_TCP_PORT=3306 MYSQL监听端口;
-DWITH_XTRADB_STORAGE_ENGINE=1 开启xtradb引擎支持;
-DWITH_INNOBASE_STORAGE_ENGINE=1 开启innodb引擎支持;
-DWITH_PARTITION_STORAGE_ENGINE=1 开启partition引擎支持;
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 开启blackhole引擎支持;
-DWITH_MYISAM_STORAGE_ENGINE=1 开启MyISAM引擎支持;
-DWITH_READLINE=1 启用快捷键功能;
-DENABLED_LOCAL_INFILE=1 允许从当地导入数据;
-DWITH_EXTRA_CHARSETS=1 支持额外的字符集;
-DDEFAULT_CHARSET=utf8 默认字符集UTF-8;
-DDEFAULT_COLLATION=utf8_general_ci 检验字符;
-DEXTRA_CHARSETS=all 安装所有扩展字符集;
-DWITH_BIG_TABLES=1 将临时表存储在磁盘上;
-DWITH_DEBUG=0 克制调试模式支持;
make 编译;
make install 安装。
|
- 将源码安装的Mysql数据库服务设置为系统服务,可以利用chkconfig管理,并启动MYSQL数据库,如图11-1所示:
cd /usr/local/mysql55/
\cp support-files/my-large.cnf /etc/my.cnf
\cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 35 mysqld on
mkdir -p /data/mysql
useradd mysql
/usr/local/mysql55/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql55/
ln -s /usr/local/mysql55/bin/* /usr/bin/
service mysqld restart
| 图11-1 查看MYSQL启动进程
cd /usr/local/mysql55
mkdir –p /data/mysql
useradd mysql
/usr/local/mysql55/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql55/
ln -s /usr/local/mysql55/bin/* /usr/bin/
/usr/local/mysql55/bin/mysqld_safe --user=mysql &
| MySQL数据库安装完毕之后,对MYSQL数据库中各种指令的操作变得尤为紧张,熟练把握MYSQL必备下令是SA、DBA必备工作之一,如下为MYSQL数据库中操作必备下令,所有操作指令均在MYSQL下令行中操作,不能在Linux Shell解释器上直接运行:
直接在Shell终端实验下令:mysql大概/usr/local/mysql55/bin/mysql,按Enter键,进入MYSQL下令行界面如图11-2所示:
图11-2 MYSQL下令行界面
MYSQL下令行常用下令如下,操作效果如图11-3(a)、11-3(b)、11-3(c)所示:
show databases; 查看所有的数据库;
create database jfedu; 创建名为jfedu数据库;
use jfedu; 进入jfedu数据库;
show tables; 查看数据库里有多少张表;
create table t1 (id varchar(20),name varchar(20)); 创建名为t1表,并创建两个字段,id、name,varchar表现设置数据长度,用字符来界说长度单位,此中1汉字=2字符=2Bytes;
insert into t1 values ("1","jfedu"); 向表中插入数据;
select * from t1; 查看t1表数据内容;
Select * from t1 where id=1 and age =’jfedu’; id、age多个条件查询;
desc t1; 查看t1表字段内容;
alter table t1 modify column name varchar(20); 修改name字段的长度;
update t1 set name='jfedu.net' where id=1; 修改name字段的内容;
flush privileges; 刷新权限;
delete from t1 ; 清空表内容;
drop table t1 ; 删除表;
drop database jfedu; 删除jfedu数据库;
show variables like '%char%'; 查看数据库字符集;
show engines; 查看MySQL存储引擎;
show variables like '%storage_engine%'; 查看MySQL默认的存储引擎;
alter table t1 engine=innodb; 修改MySQL t1表存储引擎;
|
图11-3(b) MYSQL下令操作
图11-3(c) MYSQL下令操作
计算机中储存的信息都是用二进制数方式来表现的,读者天天看到屏幕表现的英文、汉字等字符是二进制数转换之后的效果。普通的说,将汉字按照某种字符集编码存储在计算机中,称为"编码"。将存储在计算机中的二进制数解析表现出来,称为"解码",在解码过程中,如果利用了错误的解码规则,会导致表现乱码。
MYSQL数据库在存储数据时,默认编码latin1,存储中笔墨符时,在表现大概WEB调用时会表现为乱码,为解决该乱码题目,需修改Mysql默认字符集为UTF-8,有两种方法:
- 编辑vim /etc/my.cnf配置文件,在相应段中参加相应的参数字符集修改完毕,重启MySQL服务即可。
[client]字段里参加: default-character-set=utf8
[mysqld]字段里参加: character-set-server=utf8
[mysql]字段里参加 : default-character-set=utf8
|
- MYSQL下令行中运行如下指令,如图11-4所示:
show variables like '%char%';
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
| 图11-4 设置MYSQL数据库字符集
MYSQL数据库在利用过程中为了加强安全防范,需要设置暗码访问,如何设置暗码、及暗码忘记如何破解呢,如下为设置暗码授权、暗码修改及暗码破解的方法:
grant all on jfedu.* to test@localhost identified by 'pas';
grant select,insert,update,delete on *.* to test@”%” identified by ‘pas’;
grant all on jfedu.* to test@’192.168.111.118’ identified by 'pas';
| 如上三条grant语句授权参数详解如下:
授权localhost主机通过test用户和pas暗码访问当地的jfedu库的所有权限;
授权所有主机通过test用户和pas暗码访问当地的jfedu库的查询、插入、更新、删除权限;
授权192.168.111.118主机通过test用户和pas暗码访问当地的jfedu库的所有权限;
| 在利用MYSQL数据库中,偶然会出现暗码忘记,大概被其他人员修改掉数据库权限的,如果需要告急修改暗码,如何破解MYSQL暗码呢,起首停止MYSQL数据库服务,以跳过权限方式启动,下令如下:
/etc/init.d/mysqld stop
/usr/bin/mysqld_safe --user=mysql --skip-grant-tables &
| MYSQL跳过权限方式启动后,在Shell终端实验mysql下令并按Enter键,进入mysql下令行,如图11-5所示:
图11-5 跳过权限启动并登陆MYSQL
由于MYSQL用户及暗码认证信息存放在mysql库中的user表,需进入mysql库,更新相应的暗码字段即可,比方将MYSQL中root用户的暗码均改为123456,如图11-6所示:
use mysql
update user set password=password(‘123456’) where user=’root’;
| 图11-6 MYSQL暗码破解方法
MYSQL root暗码修改完,需停止以Mysql跳过权限表的启动进程,再以正常方式启动MYSQL,再次以新的暗码登陆即可进入Mysql数据库,如图11-7所示:
图11-7 MYSQL正常方式启动
明白MYSQL配置文件,可以更快的学习和把握MYSQL数据库服务器,如下为MYSQL配置文件常用参数详解:
[mysqld] //服务器端配置
datadir=/data/mysql //数据目录
socket=/var/lib/mysql/mysql.sock //socket通信设置
user=mysql //利用mysql用户启动;
symbolic-links=0 //是否支持快捷方式;
log-bin=mysql-bin //开启bin-log日志;
server-id = 1 //mysql服务的ID;
auto_increment_offset=1 //自增长字段从固定数开始;
auto_increment_increment=2 //自增长字段每次递增的量;
socket = /tmp/mysql.sock //为MySQL客户步伐与服务器之间的当地通信套接字文件;
port = 3306 //指定MsSQL监听的端口;
key_buffer = 384M //key_buffer是用于索引块的缓冲区大小;
table_cache = 512 //为所有线程打开表的数量;
sort_buffer_size = 2M //每个需要进行排序的线程分配该大小的一个缓冲区;
read_buffer_size = 2M //读查询操作所能利用的缓冲区大小。
query_cache_size = 32M //指定MySQL查询效果缓冲区的大小
read_rnd_buffer_size = 8M //改参数在利用行指针排序之后,随机读;
myisam_sort_buffer_size = 64M //MyISAM表发生变化时重新排序所需的缓冲;
thread_concurrency = 8 //最大并发线程数,取值为服务器逻辑CPU数量×2;
thread_cache = 8 //缓存可重用的线程数;
skip-locking //制止MySQL的外部锁定,淘汰堕落几率加强稳定性。
default-storage-engine=INNODB //设置mysql默认引擎为Innodb;
#mysqld_safe config
[mysqld_safe] //mysql服务安全启动配置;
log-error=/var/log/mysqld.log //mysql错误日志路径;
pid-file=/var/run/mysqld/mysqld.pid //mysql PID进程文件;
key_buffer_size = 2048MB //MyISAM表索引缓冲区的大小;
max_connections = 3000 //mysql最大连接数;
innodb_buffer_pool_size = 2048MB //InnoDB内存缓冲数据和索引大小;
basedir = /usr/local/mysql55/ //数据库安装路径;
[mysqldump] //数据库导出段配置;
max_allowed_packet =16M //服务器和客户端发送的最大数据包;
| MySQL索引可以用来快速地探求某些具有特定值的记录,所有MySQL索引都以B-树的形式生存。比方MYSQL没有索引,实验select时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。如果表中数据有上亿条数据,查询一条数据花费的时间会非常长,索引的目的就类似电子书的目录及页码的对应关系。
如果在需搜索条件的列上创建了索引,MySQL无需扫描全表记录即可快速得到相应的记录行。如果该表有1000000条记录,通过索引查找记录至少要比全表顺序扫描快至少100倍,这就是索引在企业环境中带来的实验速度的提拔。
MYSQL数据库常见索引范例包括:普通索引(normal)、唯一索引(unique)、全文索引(full text)、主键索引(primary key)、组合索引等,如下为每个索引的应用场景及区别:
普通索引: normal,利用最广泛;
唯一索引: unique,不允许重复的索引,允许有空值;
全文索引: full text,只能用于MyISAM表,FULLTEXT紧张用于大量的内容检索;
主键索引: primary key又称为特殊的唯一索引,不允许有空值;
组合索引: 为提高mysql效率可建立组合索引;
| MYSQL数据库表创建各个索引下令,以t1表为案例,操作如下:
主键索引 ALTER TABLE t1 ADD PRIMARY KEY ( `column` );
唯一索引 ALTER TABLE t1 ADD UNIQUE (`column`);
普通索引 ALTER TABLE t1 ADD INDEX index_name ( `column' );
全文索引 ALTER TABLE t1 ADD FULLTEXT ( `column` );
组合索引 ALTER TABLE t1 ADD INDEX index_name ( `column1`, `column2`, `column3` );
| 如图11-8所示,为t1表的id字段创建主键索引,查看索引是否被创建,然后插入类似的id,提示报错:
图11-8 MYSQL主键索引案例演示
MYSQL数据库表删除各个索引下令,以t1表为案例,操作如下:
DROP INDEX index_name ON t1;
ALTER TABLE t1 DROP INDEX index_name;
ALTER TABLE t1 DROP PRIMARY KEY;
| MYSQL数据库查看表索引:
show index from t1;
show keys from t1;
| MYSQL数据库索引的缺点:
- MYSQL数据库索引固然能够提高数据库查询速度,但同时会降低更新、删除、插入表的速度,比方如对表进行INSERT、UPDATE、DELETE时,update表MySQL不但要生存数据,还需生存更新索引;
- 建立索引会占用磁盘空间,大表上创建了多种组合索引,索引文件的会占用大量的空间。
MYSQL数据库慢查询紧张用于跟踪异常的SQL语句,可以分析出当前步伐里那些Sql语句比力耗费资源,慢查询日志则用来记录在MySQL中相应时间凌驾阀值的语句,具体指运行时间凌驾long_query_time值的SQL语句,会被记录到慢查询日志中。
Mysql数据库默认没有开启慢查询日志功能,需手动在配置文件大概MYSQL下令行中开启,慢查询日志默认写入磁盘中的文件,也可以将慢查询日志写入到数据库表。
查看数据库是否开启慢查询,如图11-9(a)、11-9(b)所示,下令如下:
show variables like "%slow%";
show variables like "%long_query%";
| 图11-9(a) MYSQL数据库慢查询功能
图11-9(b) MYSQL数据库慢查询功能
MYSQL慢查询参数详解如下:
log_slow_queries 关闭慢查询日志功能;
long_query_time 慢查询超时时间,默认为10s,MYSQL5.5以上可以设置微秒;
slow_query_log 关闭慢查询日志;
slow_query_log_file 慢查询日志文件;
slow_launch_time Thread create时间,单位秒,如果thread create的时间凌驾了这个值,该变量slow_launch_time的值会加1;
log-queries-not-using-indexes 记录未添加索引的SQL语句。
| 开启MYSQL慢查询日志方法有两种:
set global slow_query_log=on;
show variables like "%slow%";
| log-slow-queries = /data/mysql/localhost.log
long_query_time = 0.01
log-queries-not-using-indexes
| 慢查询功能开启之后,数据库会自动将实验时间凌驾设定时间的SQL语句添加至慢查询日志文件中,可以通过慢查询日志文件定位实验慢的SQL,从而对其优化,可以通过mysqldumpslow下令行工具分析日志,相关参数如下:
实验下令mysqldumpslow -h可以查看下令帮助信息:
紧张参数包括:-s和-t
-s 这个是排序参数,可选的有:
l: 查询锁的总时间;
r: 返回记录数;
t: 查询总时间排序;
al: 均匀锁定时间;
ar: 均匀返回记录数;
at: 均匀查询时间;
c: 计数;
-t n 表现头n条记录。
| MYSQL慢查询mysqldumpslow按照返回的行数从大到小,查看前2行,如图11-10所,下令如下:
mysqldumpslow -s r -t 2 localhost.log
| 图11-10 mysqldumpslow以返回记录排序
MYSQL慢查询mysqldumpslow按照查询总时间从大到小,查看前5行,同时过滤select的sql语句,如图11-11所,下令如下:
mysqldumpslow -s t -t 5 -g "select" localhost.log
| 图11-11 mysqldumpslow以查询总时间排序
Mysql数据库优化是一项非常紧张的工作,而且是一项恒久的工作,MYSQL优化三分靠配置文件及硬件资源的优化,七分靠sql语句的优化。
Mysql数据库具体优化包括:配置文件的优化、sql语句的优化、表结构的优化、索引的优化,而配置的优化包括:系统内核优化、硬件资源、内存、CPU、mysql本身配置文件的优化。
硬件上的优化:增长内存和提高磁盘读写速度,都可以提高MySQL数据库的查询,更新的速度。另一种提高MySQL性能的方式是利用多块磁盘来存储数据。因为可以从多块磁盘上并行读取数据,这样可以提高读取数据的速度。
MySQL参数的优化:内存中会为MySQL保留部分的缓冲区,这些缓冲区可以提高MySQL的速度,缓冲区的大小可以在MySQL的配置文件中进行设置。
附企业级MYSQL百万量级真实环境配置文件my.cnf内容,可以根据现实环境修改:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user = mysql
server_id = 10
port = 3306
socket = /tmp/mysql.sock
datadir = /data/mysql/
old_passwords = 1
lower_case_table_names = 1
character-set-server = utf8
default-storage-engine = MYISAM
log-bin = bin.log
log-error = error.log
pid-file = mysql.pid
long_query_time = 2
slow_query_log
slow_query_log_file = slow.log
binlog_cache_size = 4M
binlog_format = mixed
max_binlog_cache_size = 16M
max_binlog_size = 1G
expire_logs_days = 30
ft_min_word_len = 4
back_log = 512
max_allowed_packet = 64M
max_connections = 4096
max_connect_errors = 100
join_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
sort_buffer_size = 2M
query_cache_size = 64M
table_open_cache = 10000
thread_cache_size = 256
max_heap_table_size = 64M
tmp_table_size = 64M
thread_stack = 192K
thread_concurrency = 24
local-infile = 0
skip-show-database
skip-name-resolve
skip-external-locking
connect_timeout = 600
interactive_timeout = 600
wait_timeout = 600
#*** MyISAM
key_buffer_size = 512M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 1G
myisam_repair_threads = 1
concurrent_insert = 2
myisam_recover
#*** INNODB
innodb_buffer_pool_size = 64G
innodb_additional_mem_pool_size = 32M
innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 120
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_thread_concurrency = 16
innodb_open_files = 10000
#innodb_force_recovery = 4
#*** Replication Slave
read-only
#skip-slave-start
relay-log = relay.log
log-slave-updates
| 随着访问量的不断增长,单台MySQL数据库服务器压力不断增长,需要对MYSQL进行优化和架构改造,MYQSL优化如果不能明显改善压力环境,可以利用高可用、主从复制、读写分离来、拆分库、拆分表来进行优化。
MYSQL主从复制集群在中小企业、大型企业中被广泛利用,MYSQL主从复制的目的是实现数据库冗余备份,将Master数据库数据定时同步至Slave库中,一旦Master数据库宕机,可以将WEB应用数据库配置快速切换至Slave数据库,确保WEB应用较高的可用率,如图11-12所示,为MYSQL主从复制结构图:
图11-12 MYSQL主从原理架构图
Mysql主从复制集群至少需要2台数据库服务器,此中一台为Master库,另外一台为Slave库,MYSQL主从数据同步是一个异步复制的过程,要实现复制起首需要在master上开启bin-log日志功能,bin-log日志用于记录在Master库中实验的增、删、修改、更新操作的sql语句,整个过程需要开启3个线程,分别是Master开启IO线程,Slave开启IO线程和SQL线程,具体主从同步原理详解如下:
- Slave上实验slave start,Slave IO线程会通过在Master创建的授权用户连接上至Master,并哀求master从指定的文件和位置之后发送bin-log日志内容;
- Master接收到来自slave IO线程的哀求后,master IO线程根据slave发送的指定bin-log日志position点之后的内容,然后返回给slave的IO线程。
- 返回的信息中除了bin-log日志内容外,还有master最新的binlog文件名以及在binlog中的下一个指定更新position点;
- Slave IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和position点记录到master.info文件中,以便在下一次读取的时候能告知master从相应的bin-log文件名及末了一个position点开始发起哀求;
- Slave Sql线程检测到relay-log中内容有更新,会立即解析relay-log的内容成在Master真实实验时候的那些可实验的SQL语句,将解析的SQL语句并在Slave里实验,实验成功后,Master库与Slave库保持数据一致。
MYSQL主从复制环境构建至少需2台服务器,可以配置1主多从,多主多从,如下为1主1从,MYSQL主从复制架构实战步调:
Master:192.168.111.128
Slave: 192.168.111.129
Master端利用源码安装MySQL-5-5版本软件后,在/etc/my.cnf 配置文件[mysqld]段中参加如下代码,然后重启MYSQL服务即可。如果在安装时cp my-large.cnf /etc/my.cnf,则无需添加如下代码:
server-id = 1
log-bin = mysql-bin
| Master端/etc/my.cnf完整配置代码如下:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
| Master数据库服务器下令行中 创建tongbu用户及暗码并设置权限,实验如下下令,查看bin-log文件及position点,如图11-13所示:
grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
show master status;
| 图11-13 MYSQL Master授权用户
Slave端利用源码安装MySQL-5-5版本软件后,在/etc/my.cnf 配置文件[mysqld]段中参加如下代码,然后重启MYSQL服务即可。如果在安装时cp my-large.cnf /etc/my.cnf,则需修改server-id,MASTER与Slave端server-id不能一样,Slave端也无需开启bin-log功能:
Slave端/etc/my.cnf完整配置代码如下:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
server-id = 2
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
| Slave指定Master IP、用户名、暗码、bin-log文件名(mysql-bin.000028)及position(257),代码如下:
change master to
master_host='192.168.238.132',master_user='tongbu',master_password='123456',master_log_file=' mysql-bin.000006',master_log_pos=257;
| 在slave启动slave start,并实验show slave status\G查看Mysql主从状态:
slave start;
show slave status\G
| 查看Slave端IO线程、SQL线程状态均为YES,代表Slave已正常连接Master实现同步:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
| 实验Show slave status\G,常见参数寄义解析:
Slave_IO_State I/O线程连接Master状态;
Master_User 用于连接Master的用户;
Master_Port Master端监听端口;
Connect_Retry 主从连接失败,重试时间隔断;
Master_Log_File I/O线程读取的Master二进制日志文件的名称。
Read_Master_Log_Pos I/O线程已读取的Master二进制日志文件的位置;
Relay_Log_File SQL线程读取和实验的中继日志文件的名称。
Relay_Log_Pos SQL线程已读取和实验的中继日志文件的位置;
Relay_Master_Log_File SQL线程实验的Master二进制日志文件的名称;
Slave_IO_Running I/O线程是否被启动并成功地连接到主服务器上;
Slave_SQL_Running SQL线程是否被启动;
Replicate_Do_DB 指定的同步的数据库列表;
Skip_Counter SQL_SLAVE_SKIP_COUNTER设置的值;
Seconds_Behind_Master Slave端SQL线程和I/O线程之间的时间差距,单位为秒,常被用于主从延迟检查方法之一。
| 在Master端创建mysql_db_test数据库和t0表,如图11-14所示,下令如下:
create database mysql_ab_test charset=utf8;
show databases;
use mysql_ab_test;
create table t0 (id varchar(20),name varchar(20));
show tables;
| 图11-14 MYSQL master创建数据库和表
Slave服务器查看是否有mysql_ab_test数据库和t0的表,如果存在则代表Slave从Master复制数据成功,证明MYSQL主从配置至此已经配置成功,如图11-15所示:
图11-15 MYSQL Slave自动同步数据
在Master服务器的t0表插入两条数据,在slave查看是否已同步,master上实验如下图11-16所示:
insert into t0 values (“001”,”wugk1”);
insert into t0 values (“002”,”wugk2”);
select * from t0;
| 图11-16 MYSQL Master insert数据
Slave端实验查询下令,如图11-17所示,表现在Master插入的数据已经同步到Slave端:
图11-17 MYSQL Slave数据已同步
Mysql主从同步集群在天生环境利用过程中,如果主从服务器之间网络通信条件差大概数据库数据量非常大,轻易导致MYSQL主从同步延迟。
MYSQL主从产生延迟之后,一旦主库宕机,会导致部分数据没有及时同步至丛库,重新启动主库,会导致丛库与主库同步错误,如何快速恢复主从同步关系呢,如下有两种方法:
此种方法实用于主从库数据内容相差不大,大概要求数据可以不完全统一的环境,数据要求不严格的环境。
Master端实验如下下令,将数据库设置全局读锁,不允许写入新数据:
flush tables with read lock;
| Slave端停止Slave I/O及sql线程,同时将同步错误的SQL跳过1次,跳过会导致数据不一致,末了启动start slave,同步状态恢复,下令如下:
stop slave;
set global sql_slave_skip_counter =1;
start slave;
| 此种方法实用于主从库数据内容相差很大,大概要求数据完全统一的环境,数据需完全保持一致。
Master端实验如下下令,将数据库设置全局读锁,不允许写入新数据:
flush tables with read lock;
| Master端基于mysqldump、xtrabackup工具进行数据库将完整的数据库备份,也可以用shell脚本或python脚本实现定时备份,备份成功之后,将完整的数据导入至丛库,重新配置主从关系,当Slave端的IO线程、SQL线程均为YES之后,末了将Master端读锁解开即可,解锁下令如下:
Linux下LAMP(Linux+Apache+MySQL/MariaDB+Perl/PHP/Python)是一组用来搭建动态网站的开源软件架构,本身是各自独立的软件服务,放在一起利用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用步伐平台。
本章向读者先容互联网主流企业架构LAMP应用案例、PHP解释性语言详解、LAMP组合通信原理、LAMP企业源码架设、LAMP拓展及利用Redis提拔LAMP性能优化等。
随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成鼎足之势之势,并且该软件开辟的项目在软件方面的投资本钱较低,因此受到整个IT界的关注。LAMP架构受到大多数中小企业的运维、DBA、步伐员的青睐,Apache默认只能发布静态网页,而LAMP组合可以发布静态+PHP动态页面。
静态页面通常指不与数据库发生交互的页面,是一种基于w3c规范的一种网页誊写格式,是一种统一协议语言,所以称之为静态网页。静态页面被设计好之后,一般很少去修改,不随着欣赏器参数改变而内容改变,需留意的是动态的图片也是属于静态文件。从SEO角度来讲,HTML页面更有利于搜索引擎的爬行和收录。常见的静态页面以.html、.gif、.jpg、.jpeg、.bmp、.png、.ico、.txt、.js、.css等末端。
动态页面通常指与数据库发生交互的页面,内容展示丰富,功能非常强大,实用性广。从SEO角度来讲,搜索引擎很难全面的爬行和收录动态网页,因为动态网页会随着数据库的更新、参数的变更而发生改变,常见的动态页面以.jsp、.php、.do、.asp、.cgi、.apsx等末端。
LAMP企业主流架构最紧张的三个环节,一是Apache WEB服务器,二是PHP(PHP: Hypertext Preprocessor),三是MYSQL数据库。
Apache WEB服务器紧张是基于多模块工作,依赖PHP SAPI处理方式中的PHP_MODULE去解析PHP末端的文件,如图12-1所示:
图12-1 Apache+PHP mod工作原理
PHP是一种实用于web开辟的动态语言,PHP语言内核基于C语言实现包含大量组件的软件框架,是一种功能强大的解释型脚本语言。PHP底层运行机制如图12-2所示:
图12-2 PHP底层处理机制
PHP底层工作原理包括4个部分:
- Zend引擎,属于PHP内核部分,它负责将PHP代码解析为可实验opcode的处理并实现相应的处理方法、实现基本的数据结构、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。
- Extensions,围绕着Zend引擎,Extensions通过组件的方式提供各种基础服务,各种内置函数、标准库等都是通过Extension来实现。
- Sapi,服务端应用编程接口(Server Application Programming Interface,Sapi),sapi通过一系列钩子函数,基于SAPI可以让PHP与外部进行数据交互。
- 常见的SAPI编程接口处理方法包括:apache2handler:以apache作为webserver,接纳MOD_PHP模式运行时候的处理方式;cgi:webserver和PHP直接的另一种交互方式,FastCGI协议;cli:下令行调用的应用模式。
- APP代码应用,又称之为PHP代码步伐,基于sapi接口天生不同的应用模式,从而被PHP引擎解析。
当用户在欣赏器地址中输入域名大概域名+PHP页面,向HTTP WEB服务器Apache发起HTTP哀求,WEB服务器接受该哀求,并根据其后缀判断如果哀求的页面是以.php末端,WEB服务器从硬盘大概内存中取出该PHP文件,将其发送给PHP引擎步伐。
PHP引擎步伐将会对WEB服务器传送过来的文件进行扫描并根据下令从背景读取、处理数据、并动态地天生相应的HTML页面。然后PHP引擎步伐将天生的HTML页面返回给WEB服务器,终极WEB服务器将HTML页面返回给客户端欣赏器,欣赏器基于MIME范例进行解析展示给用户页面。
构建LAMP架构有两种方法,一是利用YUM在线安装,另外一种是基于LAMP源码编译安装,YUM在线安装方法如下:
yum install httpd httpd-devel mysql mysql-server mysql-devel php php-devel php-mysql -y
service httpd restart
service mysqld restart
| YUM方式安装简单、快捷,但如果需要添加扩展的功能和模块,需利用源码包的方式来编译安装LAMP。如下为LAMP源码编译安装的步调:
- Apache WEB安装,先安装apr、apr-utils库包。
yum install apr-devel apr-util-devel -y;
cd /usr/src ;
wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.31.tar.gz
tar xzf httpd-2.2.31.tar.gz
cd httpd-2.2.31
./configure --prefix=/usr/local/apache --enable-so --enable-rewrite
make
make install
|
- MYSQL数据库安装,基于MYSQL5.5编译安装,通过cmake、make、make install三个步调实现。
yum install cmake ncurses-devel ncurses -y
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql55 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_BIG_TABLES=1 \
-DWITH_DEBUG=0
make
make install
| 将源码安装的Mysql数据库服务设置为系统服务,可以利用chkconfig管理,并启动MYSQL数据库:
cd /usr/local/mysql55/
\cp support-files/my-large.cnf /etc/my.cnf
\cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 35 mysqld on
mkdir -p /data/mysql
useradd mysql
/usr/local/mysql55/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql55/
ln -s /usr/local/mysql55/bin/* /usr/bin/
service mysqld restart
|
- PHP服务安装,PHP需与Apache、MySQL进行整合,如图12-3所示,参数下令如下:
cd /usr/src
wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2
tar jxf php-5.3.28.tar.bz2
cd php-5.3.28 ;
./configure --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php5/etc --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql55/
| 图12-3 LAMP源码编译整合
为了能让Apache发布PHP页面,需要将PHP安装完成后的libphp5.so模块与Apache进行整合,vim httpd.conf编辑配置文件,参加如下代码:
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html index.htm
| 创建PHP测试页面,在/usr/local/apache/htdocs目录下创建index.php测试页面,实验如下下令自动创建:
cat >/usr/local/apache/htdocs/index.php<<EOF
<?php
phpinfo();
?>
EOF
| 重新启动Apache服务,欣赏器输入 Apache WEB的IP访问,如图12-4所示,即代表LAMP源码环境整合成功。
图12-4 Apache+PHP测试页面
LAMP源码整合完毕之后,Dicuz官网下载Discuz开源PHP软件包,将软件包解压并发布在Apache Htdocs发布目录,代码如下:
cd /usr/src ;
wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip
unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/
cd /usr/local/apache/htdocs/ ;\mv upload/* .
chmod 757 -R data/ uc_server/ config/ uc_client/
| 通过欣赏器访问Apache WEB IP,如图12-5所示,选择“我同意”
图12-5 Discuz安装界面一
进入如图12-6界面,数据库安装,如果不存在则需要新建数据库并授权。
图12-6 Discuz安装界面二
MYSQL数据库下令行中创建PHP连接MYSQL的用户及暗码,下令如下:
create database discuz charset=utf8;
grant all on discuz.* to root@'localhost' identified by "123456";
| 单击下一步,直至安装完成,欣赏器自动跳转至如图12-7所示界面:
图12-7 Discuz安装界面三
如上LAMP服务均安装至单台服务器,随着用户访问量不断的增长,单台服务器压力渐渐增长,那如何优化LAMP架构,如何拆分LAMP架构呢,怎么把Apache和MySQL分开放在不同的呆板呢。
LAMP架构拆分的目的在于缓解单台服务器的压力,可以将PHP、MYSQL单独安装至多台服务器,本节将实现LAP+MySQL的架构,也即是把MYSQL单独拆分出去。部署方法有两种:
在Apache WEB服务器只需只需如下代码:
yum install httpd httpd-devel php-devel php php-mysql -y
| 在MYSQL数据库服务器只需只需如下代码:
yum install mysql-server mysql mysql-devel mysql-libs -y
| 源码安装LAMP多机方式,Apache WEB服务与MYSQL数据库服务分别部署在不同的服务器即可,PHP与Apache服务部署在一台服务器,PHP编译参数时参加如下代码进行LAMP的整合,mysqlnd为PHP远程连接MYSQL数据库服务器的一种方式:
./configure --prefix=/usr/local/php5 \
--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \
--with-apxs2=/usr/local/apache2/bin/apxs
make
make install
| LAMP在企业生产环境中,除了将MYSQL单独部署在其他服务器、由于MYSQL数据库压力会很大,还会对MYSQL实现主从复制及读写分离,同时会对PHP网站进行调优,通常PHP的优化本事包括:PHP代码本身优化、PHP配置文件优化、为PHP添加缓存模块,将PHP网站数据存入缓存等。
Redis是一个开源的利用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis是一个key-value存储系统。
和Memcached缓存类似,Redis支持存储的value范例相对更多,包括string(字符串)、list(链表)、set(聚集)、zset(有序聚集)和hash(哈希范例)。
Redis是一种高级key-value数据库,它跟memcached类似,不过Redis的数据可以持久化,而且支持的数据范例很丰富,有字符串,链表,集 合和有序聚集。支持在服务器端计算聚集的并,交和补集(difference)等,还支持多种排序功能。Redis也被看成是一个数据结构服务器。
Redis很大程度赔偿了memcached这类key/value存储的不敷,在部分场合可以对关系数据库起到很好的增补作用。Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,方便易用,得到IT人的青睐。
Redis支持主从同步,数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可实验单层树复制,由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录,同步对读取操作的可扩展性和数据冗余很有帮助。
目前利用Redis的互联网企业有:京东、百度、腾讯、阿里巴巴、新浪、图吧、研修网等等,如表12-1所示,为目前主流数据库简单功能对比:
名称
| 数据库范例
| 数据存储选项
| 操作范例
| 备注
| Redis
| 内存存储,Nosql数据库
| 支持字符串、列表、聚集、散列表、有序聚集
| 增、删、修改、更新
| 支持分布式集群、主从同步及高可用、单线程
| Memcached
| 内存缓存数据库,键值对
| 键值之间的映射
| 增、删、修改、更新
| 支持多线程
| MySQL
| 典范关系数据库,RDBMS
| 数据库由多表主成,每张表包含多行
| 增、删、修改、更新
| 支持ACID性子
| PostgreSQL
| 典范关系数据库,RDBMS
| 数据库由多表主成,每张表包含多行
| 增、删、修改、更新
| 支持ACID性子
| MongoDB
| 硬盘存储,Nosql数据库
| 数据库包含多个表
| 增、删、修改、更新
| 主从复制,分片,副本集、空间索引
| 表12-1 常见数据库功能对比
LAMP+Redis工作机制:用户通过欣赏器访问LAMP网站,并以用户名和暗码登录到网站,默认Redis缓存中没有该用户名和暗码对应列表,PHP步伐会读取MYSQL数据库中的用户名和暗码,然后将用户名和暗码缓存至Redis中,下次用户通过欣赏器再次利用同样的用户名和暗码登录网站,PHP无需从数据库中读取该用户和暗码信息,而是直接优先从Redis缓存中读取并返回,从而减轻MYSQL数据库的压力。
Redis除了可以缓存用户名、暗码,还可以换成PHP论坛各种数据,比方用户帖子、用户动态等等,如图12-8所示:
图12-8 LAMP+Redis架构流程图
要实现将LAMP PHP网站相关数据存入Redis,需要一台Redis服务器、PHP-redis连接驱动、PHP代码连接修改等。
LAMP PHP连接Redis,起首需安装Redis服务器,安装连接驱动,然后修改PHP网站配置文件,具体操作步调如下:
LAMP服务器: 192.168.149.128
Redis主库: 192.168.149.129
Redis从库: 192.168.149.130
|
- 192.168.149.129服务器安装部署Redis服务,代码如下
wget http://download.redis.io/releases/redis-2.8.13.tar.gz
tar zxf redis-2.8.13.tar.gz
cd redis-2.8.13
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis/
| 将/usr/local/redis/bin/目录参加至环境变量配置文件/etc/profile末尾,然后Shell终端实验source /etc/profile让环境变量生效。
export PATH=/usr/local/redis/bin PATH
| Nohup背景启动及停止Redis服务下令:
nohup /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
/usr/local/redis/bin/redis-cli -p 6379 shutdown
| 要确保PHP能够连接Redis缓存服务器,需添加PHP Redis扩展步伐,也即是添加PHP安ext扩展模块,添加方法如下:
wget https://github.com/phpredis/phpredis/archive/3.1.2.tar.gz
tar xzf 3.1.2.tar.gz
/usr/local/php5/bin/phpize
cd phpredis-3.1.2/
./configure --with-php-config=/usr/local/php5/bin/php-config --enable-redis
make
make install
| 修改vim /usr/local/php5/lib/php.ini配置文件,添加redis.so模块,代码如下:
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20090626"
extension=redis.so
| 重启Apache服务,写入phpinfo测试页面,通过欣赏器访问,如图12-9所示,检查到存在Redis模块即可:
图12-9 PHP Redis模块添加
登录192.168.149.128 WEB服务器,修改Discuz PHP网站发布/usr/local/apache2/htdcos目录全局配置文件config_global.php,查找CONFIG MEMORY段,将redis server后改为Redis主服务器的IP 192.168.149.129即可,如图12-10所示:
图12-10 PHP Redis配置文件修改
通过欣赏器访问Apache PHP论坛网站,同时登陆Redis服务器,实验下令redis-cli进入Redis下令行,运行下令KEYS *,如图12-11所示,存在以IOKLAN开头的key,则证明Redis成功缓存LAMP+Discuz网站信息数据。
图12-11 Redis缓存LAMP KEYS数据
访问LAMP+Discuz网站,创建论坛测试用户jfedu666,暗码jfedu666,此时用户数据第一次注册,用户名和暗码会写入到MySQL数据库表中,同时会写入该数据也会写入到Redis缓存,如图12-12(a)、12-12(b)、12-12(c)所示:
图12-12(c) Redis缓存测试案例
将jfedu666从MySQL Discuz库pre_common_member中删除,通过该用户依然可以正常登录WEB网站,则证明此时数据读取的是Redis缓存服务器,如图12-13(a)、12-13(b)、12-13(c)所示:
图12-13(b) 用户名和暗码登录discuz论坛
图12-13(c) 用户名和暗码登录discuz论坛
Redis是一个内存数据库,附Redis.conf常用参数的详解,后面章节会继续深入讲解。
# daemonize no Linux Shell终端运行redis,改为yes即背景运行Redis服务;
daemonize yes
# 当运行多个 redis 服务时,需要指定不同的pid文件和端口
pidfile /var/run/redis_6379.pid
# 指定redis运行的端口,默认是 6379
port 6379
# 在高并发的环境中,为制止慢客户端的连接题目,需要设置一个高速背景日志
tcp-backlog 511
# 指定redis只接收来自于该 IP 地址的哀求,如果不进行设置,那么将处理所有哀求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
#设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接;
timeout 0
# 在Linux 上,指定值(秒)用于发送 ACKs 的时间。留意关闭连接需要双倍的时间。默认为 0 。
tcp-keepalive 0
# Redis总共支持四个日志级别: debug 、 verbose 、 notice 、 warning ,默认为 verbose
# debug 记录许多信息,用于开辟和测试
# varbose 有用的信息,不像 debug 会记录那么多
# notice 普通的 verbose ,常用于生产环境
# warning 只有非常紧张大概严峻的信息会记录到日志
loglevel notice
#配置 log 文件地址
#默认值为 stdout ,标准输出,若背景模式会输出到 /dev/null 。
logfile /var/log/redis/redis.log
#可用数据库数
#默认值为16 ,默认数据库为0,数据库范围在 0- ( database-1 )之间
databases 16
#数据写入磁盘快照设置
#生存数据到磁盘,格式如下 :
#save <seconds> <changes>
#指出在多长时间内,有多少次更新操作,就将数据同步到数据文件 rdb 。
#相当于条件触发抓取快照,这个可以多个条件配合
#比如默认配置文件中的设置,就设置了三个条件
#save 900 1 900 秒内至少有 1 个 key 被改变
#save 300 10 300 秒内至少有 300 个 key 被改变
#save 60 10000 60 秒内至少有 10000 个 key 被改变
# save 900 1
# save 300 10
# save 60 10000
# 背景存储错误停止写。
stop-writes-on-bgsave-error yes
# 存储至当地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
rdbcompression yes
# 当地持久化数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
# 工作目录
# 数据库镜像备份的文件放置的路径。
# 这里的路径跟文件名要分开配置是因为 redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成,
# 再把该该临时文件更换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
# AOF 文件也会存放在这个目录下面
# 留意这里必须制定一个目录而不是文件
dir /var/lib/redis/
################################# 复制 #################################
# 主从复制 . 设置该数据库为其他数据库的从数据库 .
# 设置当本机为 slav 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
# slaveof <masterip><masterport>
# 当 master 服务设置了暗码保护时 ( 用 requirepass 制定的暗码 )
# slave 服务连接 master 的暗码
# masterauth <master-password>
# 当从库同主机失去连接大概复制正在进行,从机库有两种运行方式:
# 1) 如果 slave-serve-stale-data 设置为 yes( 默认设置 ) ,从库会继续相应客户端的哀求
# 2) 如果 slave-serve-stale-data 是指为 no ,出去 INFO 和 SLAVOF 下令之外的任何哀求都会返回一个
# 错误 "SYNC with master in progress"
slave-serve-stale-data yes
# 配置 slave 实例是否接受写。写 slave 对存储短暂数据(在同 master 数据同步后可以很轻易地被删除)是有用的,但未配置的环境下,客户端写大概会发送题目。
# 从 Redis2.6 后,默认 slave 为 read-only
slaveread-only yes
# 从库会按照一个时间隔断向主库发送 PINGs. 可以通过 repl-ping-slave-period 设置这个时间隔断,默认是 10 秒
# repl-ping-slave-period 10
# repl-timeout 设置主库批量数据传输时间大概 ping 复兴时间隔断,默认值是 60 秒
# 一定要确保 repl-timeout 大于 repl-ping-slave-period
# repl-timeout 60
# 在 slave socket 的 SYNC 后禁用 TCP_NODELAY
# 如果选择“ yes ” ,Redis 将利用一个较小的数字 TCP 数据包和更少的带宽将数据发送到 slave , 但是这大概导致数据发送到 slave 端会有延迟 , 如果是 Linux kernel 的默认配置,会到达 40 毫秒 .
# 如果选择 "no" ,则发送数据到 slave 端的延迟会降低,但将利用更多的带宽用于复制 .
repl-disable-tcp-nodelay no
# 设置复制的背景日志大小。
# 复制的背景日志越大, slave 断开连接及后来大概实验部分复制花的时间就越长。
# 背景日志在至少有一个 slave 连接时,仅仅分配一次。
# repl-backlog-size 1mb
# 在 master 不再连接 slave 后,背景日志将被释放。下面的配置界说从末了一个 slave 断开连接后需要释放的时间(秒)。
# 0 意味着从不释放背景日志
# repl-backlog-ttl 3600
# 如果 master 不能再正常工作,那么会在多个 slave 中,选择优先值最小的一个 slave 提拔为 master ,优先值为 0 表现不能提拔为 master 。
slave-priority 100
# 如果少于 N 个 slave 连接,且延迟时间 <=M 秒,则 master 可配置停止接受写操作。
# 比方需要至少 3 个 slave 连接,且延迟 <=10 秒的配置:
# min-slaves-to-write 3
# min-slaves-max-lag 10
# 设置 0 为禁用
# 默认 min-slaves-to-write 为 0 (禁用), min-slaves-max-lag 为 10
################################## 安全 ###################################
# 设置客户端连接后进行任何其他指定前需要利用的暗码。
# 警告:因为 redis 速度相当快,所以在一台比力好的服务器下,一个外部的用户可以在一秒钟进行 150K 次的暗码尝试,这意味着你需要指定非常非常强大的暗码来防止暴力破解
# requirepass jfedu
# 下令重命名 .
# 在一个共享环境下可以重命名相对危险的下令。比如把 CONFIG 重名为一个不轻易推测的字符。
# 举例 :
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# 如果想删除一个下令,直接把它重命名为一个空字符 "" 即可,如下:
# rename-command CONFIG ""
###################################束缚###################################
#设置同一时间最大客户端连接数,默认无穷定,
#Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,
#如果设置 maxclients 0 ,表现不作限定。
#当客户端连接数到达限定时, Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
# maxclients 10000
# 指定 Redis 最大内存限定, Redis 在启动时会把数据加载到内存中,到达最大内存后, Redis 会按照清除策略尝试清除已到期的 Key
# 如果 Redis 依照策略清除后无法提供足够空间,大概策略设置为 ”noeviction” ,则利用更多空间的下令将会报错,比方 SET, LPUSH 等。但仍然可以进行读取操作
# 留意: Redis 新的 vm 机制,会把 Key 存放内存, Value 会存放在 swap 区
# 该选项对 LRU 策略很有用。
# maxmemory 的设置比力适合于把 redis 当作于类似 memcached 的缓存来利用,而不适合当做一个真实的 DB 。
# 当把 Redis 当做一个真实的数据库利用的时候,内存利用将是一个很大的开销
# maxmemory <bytes>
# 当内存到达最大值的时候 Redis 会选择删除哪些数据?有五种方式可供选择
# volatile-lru -> 利用 LRU 算法移除设置过过期时间的 key (LRU: 最近利用 Least RecentlyUsed )
# allkeys-lru -> 利用 LRU 算法移除任何 key
# volatile-random -> 移除设置过过期时间的随机 key
# allkeys->random -> remove a randomkey, any key
# volatile-ttl -> 移除即将过期的 key(minor TTL)
# noeviction -> 不移除任何可以,只是返回一个写错误
# 留意:对于上面的策略,如果没有合适的 key 可以移除,当写的时候 Redis 会返回一个错误
# 默认是 : volatile-lru
# maxmemory-policy volatile-lru
# LRU 和 minimal TTL 算法都不是精准的算法,但是相对准确的算法 ( 为了节省内存 ) ,随意你可以选择样本大小进行检测。
# Redis 默认的灰选择 3 个样本进行检测,你可以通过 maxmemory-samples 进行设置
# maxmemory-samples 3
############################## AOF###############################
# 默认环境下, redis 会在背景异步的把数据库镜像备份到磁盘,但是该备份黑白常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比力大范围的数据丢失。
# 所以 redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。
# 开启 append only 模式之后, redis 会把所接收到的每一次写操作哀求都追加到 appendonly.aof 文件中,当 redis 重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成 appendonly.aof 文件过大,所以 redis 还支持了 BGREWRITEAOF 指令,对 appendonly.aof 进行重新整理。
# 你可以同时开启 asynchronous dumps 和 AOF
appendonly no
# AOF 文件名称 ( 默认 : "appendonly.aof")
# appendfilename appendonly.aof
# Redis 支持三种同步 AOF 文件的策略 :
# no: 不进行同步,系统去操作 . Faster.
# always: always 表现每次有写操作都进行同步 . Slow, Safest.
# everysec: 表现对写操作进行累积,每秒同步一次 . Compromise.
# 默认是 "everysec" ,按照速度和安全折中这是最好的。
# 如果想让 Redis 能更高效的运行,你也可以设置为 "no" ,让操作系统决定什么时候去实验
# 大概相反想让数据更安全你也可以设置为 "always"
# 如果不确定就用 "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# AOF 策略设置为 always 大概 everysec 时,背景处理进程 ( 背景生存大概 AOF 日志重写 ) 会实验大量的 I/O 操作
# 在某些 Linux 配置中会制止过长的 fsync() 哀求。留意现在没有任何修复,即使 fsync 在另外一个线程进行处理
# 为了减缓这个题目,可以设置下面这个参数 no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
# AOF 自动重写
# 当 AOF 文件增长到一定大小的时候 Redis 能够调用 BGREWRITEAOF 对日志文件进行重写
# 它是这样工作的: Redis 会记着前次进行些日志后文件的大小 ( 如果从开机以来还没进行过重写,那日子大小在开机的时候确定 )
# 基础大小会同现在的大小进行比力。如果现在的大小比基础大小大制定的百分比,重写功能将启动
# 同时需要指定一个最小大小用于 AOF 重写,这个用于制止即使文件很小但是增长幅度很大也去重写 AOF 文件的环境
# 设置 percentage 为 0 就关闭这个特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
######## # LUA SCRIPTING #########
# 一个 Lua 脚本最长的实验时间为 5000 毫秒( 5 秒),如果为 0 或负数表现无穷实验时间。
lua-time-limit 5000
################################LOW LOG################################
# Redis Slow Log 记录凌驾特定实验时间的下令。实验时间不包括 I/O 计算比如连接客户端,返回效果等,只是下令实验时间
# 可以通过两个参数设置 slow log :一个是告诉 Redis 实验凌驾多少时间被记录的参数 slowlog-log-slower-than( 微妙 ) ,
# 另一个是 slow log 的长度。当一个新下令被记录的时候最早的下令将被从队列中移除
# 下面的时间以微妙为单位,因此 1000000 代表一秒。
# 留意指定一个负数将关闭慢日志,而设置为 0 将强制每个下令都会记录
slowlog-log-slower-than 10000
# 对日志长度没有限定,只是要留意它会斲丧内存
# 可以通过 SLOWLOG RESET 回收被慢日志斲丧的内存
# 保举利用默认值 128 ,当慢日志凌驾 128 时,最先辈入队列的记录会被踢出
slowlog-max-len 128
| Redis缓存服务器下令行中常用下令如下:
Redis CONFIG 下令格式如下:
redis 127.0.0.1:6379> CONFIG GET|SET CONFIG_SETTING_NAME
CONFIG GET * 获取Redis服务器所有配置信息;
CONFIG SET loglevel "notice" 设置Redis服务器日志级别;
CONFIG SET requirepass "jfedu"
AUTH jfedu
redis-cli -h host -p port -a password 远程连接redis数据库;
CLIENT GETNAME 获取连接的名称;
CLIENT SETNAME 设置当前连接的名称;
CLUSTER SLOTS 获取集群节点的映射数组;
COMMAND 获取Redis下令详情数组;
COMMAND COUNT 获取 Redis 下令总数;
COMMAND GETKEYS 获取给定下令的所有键;
TIME 返回当前服务器时间;
CONFIG GET parameter 获取指定配置参数的值;
CONFIG SET parameter value 修改redis 配置参数,无需重启;
CONFIG RESETSTAT 重置 INFO 下令中的某些统计数据;
DBSIZE 返回当前数据库的 key 的数量;
DEBUG OBJECT key 获取 key 的调试信息;
DEBUG SEGFAULT 让Redis服务崩溃;
FLUSHALL 删除所有数据库的所有key;
FLUSHDB 删除当前数据库的所有key;
ROLE 返回主从实例所属的角色;
SAVE 异步生存数据到硬盘;
SHUTDOWN 异步生存数据到硬盘,并关闭服务器;
SLOWLOG 管理 redis 的慢日志;
SET keys values 设置key为jfedu,值为123;
DEL jfedu 删除key及值;
INFO CPU 查看服务器CPU占用信息;
KEYS jfedu 查看是存在jfedu的key;
KEYS * 查看Redis所有的KEY;
CONFIG REWRITE 启动 Redis时所指定的redis.conf 配置文件进行改写;
INFO [section] 获取Redis服务器的各种信息和统计数值;
SYNC 用于复制功能(replication)的内部下令;
SLAVEOF host port 指定服务器的从属服务器(slave server);
MONITOR 及时打印出Redis服务器接收到的下令,调试用;
LASTSAVE 返回最近一次Redis成功将数据生存到磁盘上的时间;;
CLIENT PAUSE timeout 指定时间内终止运行来自客户端的下令;
BGREWRITEAOF 异步实验一个 AOF(AppendOnly File) 文件重写操作;
BGSAVE 背景异步生存当前数据库的数据到磁盘。
| 为了提拔redis高可用性,我们除了备份redis dump数据之外,还需要创建redis主从架构,可以利用从将数据库持久化(数据持久化普通讲就是把数据生存到磁盘上,保证不会因为断电等因素丢失数据。
Redis需要常常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。)
Redis主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会实验类似的操作确保数据一致;且实现Redis的主从复制非常简单。同时slave上还可以开启二级slave,三级slave从库,跟MySQL的主从类似。
Redis主从配置非常简单,只需要在Redis丛库192.168.149.130配置中设置如下指令,slaveof表现指定主库的IP,192168.149.129为master服务器,6379为master服务器Redis端口,配置方法如下:
- 192.168.149.129 Redis主库redis.conf配置文件如下:
daemonize no
pidfile /var/run/redis.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /data/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
|
- 192168.149.130 Redis丛库redis.conf配置文件如下:
daemonize no
pidfile /var/run/redis.pid
port 6379
slaveof 192.168.149.129 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /data/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
|
- 重启Redis主库、丛库服务,在Redis主库创建key及values,登录Redis丛库查看,如图12-14(a)、12-14(b)所示:
图12-14(b) Redis从库获取key值
Redis所有数据都是生存在内存中,Redis数据备份可以定期的通过异步方式生存到磁盘上,该方式称为半持久化模式,如果每一次数据变化都写入aof文件里面,则称为全持久化模式。同时还可以基于Redis主从复制实现Redis备份与恢复。
半持久化RDB模式也是Redis备份默认方式,是通过快照(snapshotting)完成的,当符合在Redis.conf配置文件中设置的条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上,完成数据备份。
Redis进行RDB快照的条件由用户在配置文件中自界说,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。在配置文件中已经预置了3个条件:
save 900 1 #900秒内有至少1个键被更改则进行快照;
save 300 10 #300秒内有至少10个键被更改则进行快照;
save 60 10000 #60秒内有至少10000个键被更改则进行快照。
| 默认可以存在多个条件,条件之间是“或”的关系,只要满足此中一个条件,就会进行快照。 如果想要禁用自动快照,只需要将所有的save参数删除即可。Redis默认会将快照文件存储在Redis数据目录,默认文件名为:dump.rdb文件,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。也可以在Redis下令行实验config get dir获取Redis数据生存路径,如图12-15(a)、12-15(b)所示:
图12-15(b) Redis数据目录及dump.rdb文件
Redis实现快照的过程,Redis利用fork函数复制一份当前进程(父进程)的副本(子进程),父进程继续接收并处理客户端发来的下令,而子进程开始将内存中的数据写入硬盘中的临时文件,当子进程写入完所有数据后会用该临时文件更换旧的RDB文件,至此一次快照操作完成。
实验fork的时操作系统会利用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改此中某片数据时,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是实验fork一刻的内存数据。
Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件更换成新的,也就是说任何时候RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实 现Redis数据库备份。
RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。除了自动快照,还可以手动发送SAVE和BGSAVE下令让Redis实验快照,两个下令的区别在于,前者是由主进程进行快照操作,会阻塞住其他哀求,后者会通过fork子进程进行快照操作。
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存,根据数据量大小与结构和服务器性能不同,通常将一个记录一千万个字符串范例键、大小为1GB的快照文件载入到内存中需花费20~30秒钟。
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失末了一次快照以后更改的所有数据。此时需要开辟者根据具体的应用场合,通过组合设置自动快照条件的方式来将大概发生的数据丧失控制在能够接受的范围。
如果数据很紧张无法承受任何丧失,可以思量利用AOF方式进行持久化,默认Redis没有开启AOF(append only file)方式的全持久化模式。
在启动时Redis会逐个实验AOF文件中的下令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些,开启AOF持久化后每实验一条会更改Redis中的数据的下令,Redis就会将该下令写入硬盘中的AOF文件。AOF文件的生存位置和RDB文件的位置类似,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改该名称。
Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作非常轻易。此时重新启动Redis后Redis会利用AOF文件来恢复数据,因为AOF方式的持久化大概丢失的数据更少,可以在redis.conf中通过appendonly参数开启Redis AOF全持久化模式:
appendonly yes
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
appendfsync always
#appendfsync everysec
#appendfsync no
| Redis AOF持久化参数配置详解:
appendonly yes #开启AOF持久化功能;
appendfilename appendonly.aof #AOF持久化生存文件名;
appendfsync always #每次实验写入都会实验同步,最安全也最慢;
#appendfsync everysec #每秒实验一次同步操作;
#appendfsync no #不自动进行同步操作,而是完全交由操作系统来做,每30秒一次,最快也最不安全;
auto-aof-rewrite-percentage 100 #当AOF文件大小凌驾上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
auto-aof-rewrite-min-size 64mb #允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存的机制。
| 通过持久化功能,Redis保证了即使在服务器重启的环境下也不会丧失(或少量丧失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失。
为了制止单点故障,我们希望将数据库复制多个副本以部署在不同的服务器上,即使只有一台服务器出现故障其他服务器依然可以继续提供服务,这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上,Redis提供了复制(replication)功能可以自动实现同步的过程。通过配置文件在Redis从数据库中配置文件中参加slaveof master-ip master-port即可,主数据库无需配置。
Redis主从复制长处及应用场景, WEB应用步伐可以基于主从同步实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率一般比力大,当单机Redis无法应付大量的读哀求时,可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作,还可以基于LVS+keepalived+Redis对Redis实现均和高可用。
从数据库持久化持久化通常相对比力耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。
当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中利用SLAVEOF NO ONE下令将从数据库提拔成主数据库继续服务,并在原来的主数据库启动后利用SLAVE OF下令将其设置成新的主数据库的从数据库,即可将数据同步回来。
LAMP+Discuz+Redis缓解了MYSQL的部分压力,但是如果访问量非常大,Redis缓存中第一次没有缓存数据,会导致MYSQL数据库压力增大,此时可以基于分库、分表、分布式集群、大概读写分离来分担MYSQL数据库的压力,以读写分离为案例,来实现分担MYSQL数据库的压力。
MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读写分离条件是基于MYSQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave端的数据。
实现MYSQL读写分离可以基于第三方插件,也可以通过开辟修改代码实现,具体实现的读写分离的常见方式有如下四种:
- MySQL-Proxy读写分离;
- Amoeba读写分离;
- Mycat读写分离;
- 基于步伐读写分离(效率很高,实施难度大,开辟改代码)
Amoeba是以MySQL为底层数据存储,并对WEB、APP应用提供MySQL协议接口的proxy。它会合地相应WEB应用的哀求,依据用户事先设置的规则,将SQL哀求发送到特定的数据库上实验,基于此可以实现负载均衡、读写分离、高可用性等需求。
Amoeba相当于一个SQL哀求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要团结利用MySQL的 Replication等机制来实现副本同步等功能。
Mysql-Proxy是MySQL官方提供的mysql中间件服务,支持无数客户端连接,同时后端可连接若干台Mysql-Server服务器,MYSQL-Proxy自身基于MySQL协议,连接MYSQL-Proxy的客户端无需修改任何设置, 跟正常连接MYSQL Server没有区别,无需修改步伐代码。
MySQL Proxy是App应用(客户端)与MYSQL Server之间的一个连接代理,MySQL Proxy负责将APP应用的SQL哀求根据转发规则,转发至相应的后端数据库,基于lua脚本,可以实现复杂的连接控制和过滤,从而实现数据读写分离和负载均衡的需求。
Mysql-Proxy允许用户指定Lua脚本对SQL哀求进行拦截,对哀求进行分析与修改,还允许用户指定Lua脚本对服务器的返回效果进行修改,参加一些效果集大概去除一些效果集,对SQL的哀求通常为读哀求、写哀求,基于Lua脚本,可以实现将SQL读哀求转发至后端Slave服务器,将SQL写哀求转发至后端Master服务器。
如图12-16所示,为MYSQL-PROXY读写分离架构图,通过架构图可以清楚看到SQL哀求整个流向的过程。
图12-16 MYSQL-Proxy读写分离流程
Mysql-Proxy读写分离架构实战配置,如图12-17所示,两台WEB通过MYSQL-Proxy连接后端1.14和1.15 MYSQL服务器。
图12-17 MYSQL-Proxy实施架构图
构建Mysql读写分离架构起首需要将两台MYSQL服务器配置为主从复制(前文已存在,此处省略配置),配置完毕后,在192.168.1.16服务器上安装Mysql-Proxy服务即可,配置步调如下:
- 下载MYSQL-Proxy软件版本,解压并重命名至/usr/local/mysql-proxy,下令如下:
wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
useradd -r mysql-proxy
tar zxvf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz -C /usr/local
mv /usr/local/mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy
|
- 环境变量配置文件/etc/profile中参加如下代码生存退出,然后实验source /etc/profile使环境变量配置生效即可:
export PATH=$PATH:/usr/local/mysql-proxy/bin/
| mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.238.134:3306" --proxy-read-only-backend-addresses="192.168.238.133:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"
| --help-all :获取全部帮助信息;
--proxy-address=host:port :代理服务监听的地址和端口,默认为4040;
--admin-address=host:port :管理模块监听的地址和端口,默认为4041;
--proxy-backend-addresses=host:port :后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name :完成mysql代理功能的Lua脚本;
--daemon :以守护进程模式启动mysql-proxy;
--keepalive :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name :日志文件名称;
--log-level=level :日志级别;
--log-use-syslog :基于syslog记录日志;
--plugins=plugin :在mysql-proxy启动时加载的插件;
--user=user_name :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name :默认利用的配置文件路径,其配置段利用[mysql-proxy]标识;
--proxy-skip-profiling :禁用profile;
--pid-file=/path/to/pid_file_name :进程文件名;
|
- MYSQL-Proxy启动后,在服务器端查看端口,此中4040为proxy代理端口用于WEB应用连接,4041位管理端口用于SA大概DBA管理,如图12-48所示:
图12-48 MYSQL-Proxy启动端口
- 基于4041端口MySQL-Proxy查看读写分离状态,登录4041管理端口,下令如下:
mysql -h192.168.1.16 -uadmin -p -P 4041
|
- 以4041管理口登录,然后实验select下令,如图12-18所示state均为up状态,type范例为rw、ro,则证明读写分离状态成功。如果状态为unknown未知状态,可以4040端口登录实验:show databases;下令,直到state变成up状态为止。
图12-18 MYSQL-Proxy读写分离状态
- 读写分离数据测试,以3306端口登录到从库,进行数据写入和测试,在丛库上创建jfedu_test测试库,并写入内容,如图12-19所示:
图12-19 MYSQL-Proxy读写分离测试
- 读写分离数据测试,以4040代理端口登录,实验如下下令,可以查看到数据即证明读写分离成功。
mysql -h192.168.1.16 -uroot -p123456 -P4040 -e "select * from jfedu_test.t1;"
|
- 登录Apache WEB服务器,修改Discuz PHP网站发布/usr/local/apache2/htdcos目录全局配置文件config_global.php,查找dbhost段,将192.168.1.16 改成192.168.1.16:40404,如图12-20所示:
图12-20 MYSQL-Proxy读写分离测试
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |