原文链接:转载
Linux入门篇
1.1 Linux操作系统简介
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
1991年的10月5日,Linux创始人林纳斯·托瓦兹(Linus Torvalds)在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生,1994年3月,Linux 1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL(General Public License的缩写,是一份GNU通用公共授权)协议。
Linux具有如下优点:
Ø 稳定、免费或者花费少
Ø 安全性高
Ø 多任务,多用户
Ø 耗资源少
Ø 由于内核小,所以它可以支持多种电子产品,如:Android手机、PDA等。
1.2 Linux发展趋势
随着IT产业的不断发展,用户对网站体验要求也越来越高,而目前主流网站后端承载系统都是Linux系统,目前Android手机全部基于Linux内核研发。企业大数据、云存储、虚拟化等先进技术都是基于Linux系统。
2010年据有关权威部门统计:将来几年内我国软件行业的从业机会十分庞大,中国每年对软件人才的需求将达到50万人左右。而对于Linux 专业人才的就业前景,更是广阔;据悉在未来5-10年内 Linux 专业人才的需求将达到 120 万+!尤其是有经验的资深的Linux工程师目前非常的缺乏,薪资也是非常诱人,平均月薪都是15-20K,能力强的薪资更高。
所以机会对每个人都是公平的,关键是我们每个人如何去行动,选择大于努力。
1.3 Linux系统安装
在安装Linux系统之前,先来了解windows系统结构,windows系统一般是安装在C盘系统盘,同样Linux也有类似的系统盘(/根分区),Linux通常分区为(根分区/、swap分区),Linux系统以文件的存储方式,所有的文件都是存储在某个目录下的,类似于windows的文件夹。
对于文件系统的属性来说,windows文件系统类型一般是ntfs、fat32等,而Linux文件系统类型则为ext2、ext3、ext4等(文件系统:是操作系统用于明确磁盘或分区上的文件的方法和数据结构,文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。)
安装 Linux系统是每一个初学者的第一个门槛。在这个过程中间,最大的困惑莫过于给硬盘进行分区。虽然现在各种发行版本的 Linux 已经提供了友好的图形交互界面,但是很多人还是感觉无从下手。这其中的原因主要是不清楚 Linux 的分区规定。就好比如果我们了解了windows分区的规则,系统盘C、数据盘D等,就很好分区了。
在 Linux 中规定,每一个硬盘设备最多只能有 4个主分区(其中包含扩展分区)构成,任何一个扩展分区都要占用一个主分区号码,也就是在一个硬盘中,主分区和扩展分区一共最多是 4 个。
下面正式来安装Linux系统,安装系统前需要准备如下软件:
ü VMware workstation10.0
ü CentOS 5.8x86_i386.iso
安装图解如下:
第一步,新建虚拟机如下图:
第二步,选择相关选项,如下图:
第三步选择“稍后安装操作系统”,如下图:
第四步,选择客户机操作系统类型如下图:
第五步,设置虚拟机硬盘大小为20G,最低不能小于5G,如下图:
第六步,虚拟机新建完成,如下图:
第七步,修改虚拟机内存为512M,并添加ISO镜像,如下图:
自此,虚拟机新建完成,接下来点击“启动此虚拟机”进行Linux系统安装,Linux系统安装图解如下:
第一步,进入安装界面,直接按Enter回车键即可。
第二步,光盘检测,选择SKIP跳过。
第三步,选择安装过程中的语言,初学者可以选择“简体中文”。
第四步,选择初始化整个硬盘,清除所有数据。
第五步,选择分区方式为“自定义分区“。
第五步,点击“新建“-首先创建一个swap交换分区,大小为物理内存的2倍(1024M)。
第六步,继续创建分区,选择“新建“,然后创建根分区/,如下图选择,大小为剩余所有空间即可。
第七步,默认点击下一步,同时默认DHCP配置,时钟选择上海,去掉UTC勾,点击下一步。
第八步,设置root密码,至少六位,点击下一步。
第九步,系统安装包选择,这里选择“现在定制“。
第十步,系统安装包选择,左侧选择“开发“----右侧选择”开发工具“和“开发库”,语言选择“支持中文“,其他一概不选择。
安装完毕会提示“reboot“,直接回车即可。
1.4 Linux学习技巧
初学者可以自己安装虚拟机,然后把linux常用命令例如cd、ls、chmod、useradd、vi等等多练习几十遍,把自己敲打命令的熟练程度提升上来。
然后根据文档搭建Linux下常见的各种服务(DHCP、SAMBA、DNS、Apache、Mysql等),遇到问题后可以在google搜索,搜索的时候多看几篇文章,综合最好的文章来解决问题。
能够熟练的搭建服务后,理解每个服务的完整配置和优化,可以拓展思维。例如LAMP,我们一般是把所有服务放在一台机器上,如果分开多台该如何部署呢?等等。
平时多积累shell编程,可以在网上查找前辈们写的非常好的shell,自己下载下来多练习几遍,从中吸取,不断提高。
建立一个自己的学习博客,把平时工作学习中的知识都记录在里面,这样也可以供别人来参考同时也能提高自己的编写文档及方案的能力。
通过以上学习能够满足企业的一般应有,需要达到资深级别,还需要深入学习集群架构、负载均衡、自动化运维、运维开发等知识。最后还是一句话:多练习才是硬道理!实践出真知!
Linux系统篇
2.1 Linux系统管理
通过前两章的学习,我们已经能够独立安装Linux系统,已经掌握了Linux学习的技巧,那接下来,我们将系统的来了解Linux系统各目录、权限及常用命令的使用。
2.1.1 Linux目录初识
通过前面的学习,我们已经能够独立安装完一个linux系统,那接下来我们来熟悉一下Linux系统里面的各个目录文件夹的大致功能:
主要的目录树的有/、/root、/home、/usr、/bin等目录。下面是一个典型的linux目录结构如下: (附图表)
/ 根目录
/bin 存放必要的命令
/boot 存放内核以及启动所需的文件
/dev 存放设备文件
/etc 存放系统配置文件
/home 普通用户的宿主目录,用户数据存放在其主目录中
/lib 存放必要的运行库
/mnt 存放临时的映射文件系统,通常用来挂载使用。
/proc 存放存储进程和系统信息
/root 超级用户的主目录
/sbin 存放系统管理程序
/tmp 存放临时文件
/usr 存放应用程序,命令程序文件、程序库、手册和其它文档。
/var 系统默认日志存放目录
2.1.2 Linux常用命令
默认进入系统,我们会看到这样的字符: [root@localhost ~]#,其中#代表当前是root用户登录,如果是$表示当前为普通用户。
我们了解linux由很多目录文件构成,那我们来学习第一个Linux命令:
cd命令,cd /home ;解析:进入/home目录
cd /root 进入/root目录;cd …/返回上一级目录;cd ./当前目录;(.和…可以理解为相对路径;例如cd /hom/test ,cd加完整的路径,可以理解为绝对路径)
接下来继续学习更多的命令:
ls ./ 查看当前目录所有的文件和目录。
ls -a 查看所有的文件,包括隐藏文件,以.开头的文件。
pwd显示当前所在的目录。
mkdir创建目录,用法mkdir test ,命令后接目录的名称。
rmdir 删除空目录
rm 删除文件或者目录,用法 rm –rf test.txt (-r表示递归,-f表示强制)。
cp 拷贝文件,用法,cp old.txt /tmp/new.txt ,常用来备份;如果拷贝目录
需要加 –r参数。
mv 重命名或者移动文件或者目录,用法, mv old.txt new.txt
touch 创建文件,用法,touch test.txt,如果文件存在,则表示修改当前文件时间。
Useradd创建用户,用法 useradd wugk ,userdel删除用户。
Groupadd创建组,用法 groupadd wugk1 ,groupdel删除组。
find查找文件或目录,用法 find /home -name “test.txt”,命令格式为:
find 后接查找的目录,-name指定需要查找的文件名称,名称可以使用*表示所有。
find /home -name “*.txt” ;查找/home目录下,所有以.txt结尾的文件或者目录。
vi 修改某个文件,vi有三种模式:
命令行模式、文本输入模式、末行模式。
默认vi打开一个文件,首先是命令行模式,然后按i进入文本输入模式,可以在文件里写入字符等等信息。
写完后,按esc进入命令模式,然后输入:进入末行模式,例如输入:wq表示保存退出。
如果想直接退出,不保存,可以执行:q!, q!叹号表示强制退出。
cat 查看文件内容,用法 cat test.txt 可以看到test.txt内容
more 查看文件内容,分页查看,cat是全部查看,如果篇幅很多,只能看到最后的篇幅。可以使用cat和more同时使用,例如:cat test.txt |more 分页显示text内容,|符号是管道符,用于把|前的输出作为后面命令的输入。
echo 回显,用法 echo ok,会显示ok,输入什么就打印什么。
echo ok > test.txt ;把ok字符覆盖test.txt内容,>表示追加并覆盖的意思。
两个大于符号,表示追加,echo ok >> test.txt,表示向test.txt文件追加OK字符,不覆盖原文件里的内容。
初学者常见的命令就如上所示,当然还有很多深入的命令需要学习,后面的课程会讲解。
2.1.3 Linux用户权限
在Linux操作系统中,root的权限是最高的,相当于windows的administrator,拥有最高权限,能执行任何命令和操作。在系统中,通过UID来区分用户的权限级别,UID等于0,表示此用户具有最高权限,也就是管理员。其他的用户UID依次增加,通过/etc/passwd用户密码文件可以查看到每个用户的独立的UID。
每一个文件或者目录的权限,都包含一个用户权限、一个组的权限、其他人权限,例如下:
标红第一个root表示该文件所有者是root用户,第二个root代表该文件的所属的组为root组,其他用户这里默认不标出。
[root@node1 ~]#ls -l monitor_log.sh
-rw-r–r--1 root root 91 May 7 20:21monitor_log.sh
[root@node1 ~]#
如果我们想改变某个文件的所有者或者所属的组,可以使用命令chown
chown –R test:test monitor_log.sh即可。
每个Linux文件具有四种访问权限:可读®、可写(w)、可执行(x)和无权限(-)。
利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为
准。第一个字段由10个字符组成,如下:
[root@node1 ~]# ls -lmonitor_log.sh
-rw-r–r-- 1 rootroot 91 May 7 20:21 monitor_log.sh
[root@node1~]#
第一位表示文件类型,-表示文件,d表示目录;后面每三位为一组。
第一组:2-4位表示文件所有者的权限,即用户user权限,简称u
第二组:5-7位表示文件所有者所属组成员的权限,group权限,简称g
第三组:8-10位表示所有者所属组之外的用户的权限,other权限,简称o
从上面这个文件,我们可以看出,monito_log.sh文件对应的权限为:
root用户具有读和写的权限,root组具有读的权限,其他人具有读的权限。
为了能更简单快捷的使用和熟悉权限,rwx权限可以用数字来表示,分别表示为r(4)、w(2)、x(1)。
Monitor_log.sh权限可以表示为:644
如果给某个文件授权,命令为chmod:chmod 777 monitor_log.sh
2.1.4 Linux网络配置
熟悉了常用的命令和Linux权限,那接下来如何让所在的Linux系统上网呢?管理linux服务器网络有哪些命令呢?
Linux服务器默认网卡配置文件在/etc/sysconfig/network-scripts/下,命名的名称一般为:ifcfg-eth0 ifcfg-eth1 ,eth0表示第一块网卡,eth1表示第二块网卡,依次类推。一般DELL R720标配有4块千兆网卡。
修改网卡的IP,可以使用命令: vi /etc/sysconfig/network-scripts/ifcfg-eth0 如果是DHCP获取的IP,默认配置如下:
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0c:29:52:c7:4e
ONBOOT=yes
TYPE=Ethernet
如果是静态配置的IP,ifcfg-eth0网卡配置内容如下:
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:0c:29:52:c7:4e
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.33.10
NETMASK=255.255.255.0
GATEWAY=192.168.33.1
网卡参数详解如下:
DEVICE=eth0 #物理设备名
ONBOOT=yes # [yes|no](重启网卡是否激活设备)
BOOTPROTO=static #[none|static|bootp|dhcp](不使用协议|静态分配|BOOTP协议|DHCP协议)
TYPE=Ethernet #网卡类型
IPADDR=192.168.33.10 #IP 地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.33.1 #网关地址
网卡配置完毕,重启网卡,命令: /etc/init.d/network restart 即可。
查看ip命令:ifconfig 查看当前服务器所有网卡的IP,可以单独指定,ifconfig eth0 查看eth0的IP地址。
网卡配置完毕,如果来配置DNS,首先要知道DNS配置在哪个目录文件下,vi /etc/resolv.conf 文件:
在该文件里面添加如下两条:
nameserver 202.106.0.20
nameserver 8.8.8.8
从上到下,分别表示主DNS,备DNS。配置完毕后,不需要重启网卡,DNS立即生效。
可以ping www.baidu.com 看看效果:
IP配置完毕后,我们可以通过远程工具来连接Linux服务器,常见的Linux远程连接工具有:putty、secureCRT(主流)、xshell、xmanger等工具。
下载安装secureCRT,打开工具,然后如图配置:
点击左上角quick connect快速连接,弹出界面,然后输入IP,用户名,端口默认是22,然后点击下方的connect连接,会提示输入密码,输入即可。
弹出输入密码框:
进入远程界面,与服务器真实登录一样,然后可以执行命令:
通过这几章的学习,我们已经熟练了Linux常用命令的操作,权限网络、网络配置、远程连接等知识,那接下来我们还能做什么呢?我们已经差不多入门了,接下来就是更进一步的服务配置,Linux系统到底用来做什么呢?接下来的章节将跟大家一起来学习。
Linux系统的应用,我们最开始介绍的时候简单介绍过,目前大中型企业都用它来承载web网站、数据库、虚拟化平台等,那接下来我们将在Linux系统安装各种服务和软件来实现Linux真正的价值。
Linux服务篇
3.1 Linux服务部署
3.1.1 构建NTP时间服务器
NTP服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,某些应用对时间实时性要求高的必须统一时间。
互联网的时间服务器也有很多,例如ntpdate ntp.fudan.edu.cn 复旦大学的NTP免费提供互联网时间同步。
NTP服务器监听端口为UDP的123,那就需要在本地防火墙开启运行客户端访问123端口,vi /etc/sysconfig/iptables添加如下规则:
-A INPUT -m state–state NEW -m udp -p udp --dport 123 -j ACCEPT
NTP时间服务器配置:
yum install ntp ntpdate -y 即可!
修改ntp.conf配置文件
cp /etp/ntp.conf /etc/ntp.conf.bak
vi /etc/ntp.conf 只修改如下两行,把#号去掉即可!
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
以守护进程启动ntpd
/etc/init.d/ntpd start 即可
(注意*: ntpd启动后,客户机要等几分钟再与其进行时间同步,否则会提示“no server suitable for synchronization found”错误。)
配置时间同步客户机
crontab -e
增加一行,在每天的6点10分与时间同步服务器进行同步
10 06 * * * /usr/sbin/ntpdate ntp-server的ip>>/usr/local/logs/crontab/ntpdate.log
备注:如果客户机没有ntpdate,可以yum –y install ntp 即可!
以下是ntp服务器配置文件内容(局域网NTP,如果需要跟外网同步,添加外网server即可)
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeernoquery
restrict 127.0.0.1
restrict -6 ::1
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
下面是参数详解:
restrict default ignore
restrict 127.0.0.1
restrict 192.168.0.0 mask 255.255.255.0 nomodify
#在内部子网里面的客户端可以进行网络校时,但不能修改NTP服务器的时间参数。
server 198.123.30.132
#198.123.30.132作为上级时间服务器参考
restrict 198.123.30.132
#开放server 访问我们ntp服务的权限
driftfile /var/lib/ntp/drift
在与上级时间服务器联系时所花费的时间,记录在driftfile参数后面的文件内
broadcastdelay 0.008
#广播延迟时间
自此NTP服务搭建完毕,然后在所有客户端crontab里面添加如下语句:
0 0 * * * /usr/sbin/ntpdate 10.0.0.155 >>/data/logs/ntp.log2>&1
3.1.2 构建DHCP服务器
DHCP(Dynamic HostConfiguration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作,主要用途:给内部网络或网络服务供应商自动分配IP地址,DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口。
DHCP可以部署在服务器、交换机或者服务器,可以控制一段IP地址范围,客户机登录服务器时就可以自动获得DHCP服务器分配的IP地址和子网掩码。其中DHCP所在服务器的需要安装TCP/IP协议,需要设置静态IP地址、子网掩码、默认网关。
正式安装DHCP服务:
Yum install dhcp dhcp-devel –y 即可,然后修改DHCP /etc/dhcpd.conf配置文件内容如下:
ddns-update-style interim;
ignore client-updates;
next-server 192.168.0.79;
filename “pxelinux.0”;
allow booting;
allow bootp;
subnet 192.168.0.0 netmask 255.255.255.0 {
option routers 192.168.0.1;
optionsubnet-mask 255.255.252.0;
range dynamic-bootp 192.168.0.100 192.168.0.200;
host ns {
hardware ethernet 00:1a:a0:2b:38:81;
fixed-address 192.168.0.101;}
}
参数解析如下:
选 项
解 释
ddns-update-style interim|ad-hoc|none
参数用来设置DHCP服务器与DNS服务器的动态信息更新模式:interim为DNS互动更新模式,ad-hoc为特殊DNS更新模式,none为不支持动态更新模式。
next-server ip
pxeclient远程安装系统,指定tftp server 地址
filename
开始启动文件的名称,应用于无盘安装,可以是tftp的相对或绝对路径
ignore client-updates
为忽略客户端更新
subnet-mask
为客户端设定子网掩码
option routers
为客户端指定网关地址
domain-name
为客户端指明DNS名字
domain-name-servers
为客户端指明DNS服务器的IP地址
host-name
为客户端指定主机名称
broadcast-address
为客户端设定广播地址
ntp-server
为客户端设定网络时间服务器的IP地址
time-offset
为客户端设定格林威治时间的偏移时间,单位是秒
注意如上配置,需要修改成对应服务器网段IP,然后重启DHCP服务,/etc/init.d/dhcpd restart即可。
客户端要从这个DHCP服务器获取IP,需要做简单的设置,如果是linux需要把/etc/sysconfig/network-scritps/ifcfg-eth0里BOOTPROTO相改成dhcp即可,windows机器的话,需要修改本地连接,把它设置成自动获取IP即可。
BOOTPROTO=dhcp
3.1.3 搭建Samba服务器
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,
SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS overTCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。
安装SAMBA服务器:
Yum install samba –y
安装完毕,然后做如下设置(过滤#号行、空行如下命令)
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak ;egrep -v"#|^$" /etc/samba/smb.conf.bak |grep -v “^;”>/etc/samba/smb.conf
查看smb.conf配置文件如下:
[global]
workgroup =MYGROUP
server string =Samba Server Version %v
security =share
passdb backend= tdbsam
load printers =yes
cups options =raw
[temp]
comment=Temporaryfile space
path=/tmp
read only=no
public=yes
[data]
comment=Temporaryfile space
path=/data
read only=no
public=yes
根据需求修改之后重启服务:
[root@node1 ~]# /etc/init.d/smb restart
Shutting down SMB services: [FAILED]
Shutting down NMB services: [FAILED]
Starting SMB services: [ OK ]
Starting NMB services: [ OK ]
workgroup =
WORKGROUP 设Samba Server 所要加入的工作组或者域。
server string = Samba Server Version %v
Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。
security = user
1.share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
domain:域安全级别,使用主域控制器(PDC)来完成认证。
comment = test
是对该共享的描述,可以是任意字符串。
path = /home/test
共享目录路径
browseable= yes/no
用来指定该共享是否可以浏览。
writable = yes/no
writable用来指定该共享路径是否可写。
available = yes/no
available用来指定该共享资源是否可用
admin users = admin
该共享的管理者
valid users = test
允许访问该共享的用户
invalid users = test
禁止访问该共享的用户
write list = test
允许写入该共享的用户
public = yes/no
public用来指定该共享是否允许guest账户访问。
在浏览器里面访问方式为:\192.168.33.10(SMB文件共享服务端IP),如何没有权限访问,需要注意防火墙和selinux设置,可以使用如下命令关闭:
/etc/init.d/iptables stop ;sed –i ‘/SELINUX/s/enforcing/disabled’ /etc/sysconfig/selinux
3.1.4 搭建NFS服务器
NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的。
NFS应用场景,常用于高可用文件共享,多台服务器共享同样的数据,可扩展性比较差,本身高可用方案不完善,取而代之的数据量比较大的可以采用MFS、TFS、HDFS等等分布式文件系统。
NFS安装配置:
Yum install nfs* portmap -y 如下图,安装成功即可。
NFS安装完毕,需要创建共享目录,共享目录在/etc/exports文件里面配置,可配置参数如下:
/data/ 192.168.33.11(rw,sync,no_hide,no_all_squash)
在配置文件中添加如上一行,然后重启Portmap,NFS服务即可,/etc/init.d/portmap restart;/etc/init.d/nfs restart
第一列/data/表示需要共享的目录。
IP表示允许哪个客户端访问。
IP后括号里的设置表示对该共享文件的权限。
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
Linux客户端,如何想使用这个NFS文件系统,需要在客户端挂载,挂载命令为:
Mount –t nfs 192.168.33.10:/data/ /mnt 即可。如果有报错根据错误信息排查。常见问题有rpc服务没有启动、防火墙没关闭、selinux未关闭等问题。(拓展* 有兴趣的童鞋可以研究MFS(分布式文件系统)。)
3.1.5 搭建FTP服务器
FTP 是文件传输协议,正是由于这种协议使得主机间可以共享文件。 FTP 使用TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。
vsftpd是一款在Linux发行版中最主流的FTP服务器程序;特点是小巧轻快,安全易用;能让其自身特点得发发挥和掌握。
目前在开源操作系统中常用的FTP服务器程序主要有vsftpd、ProFTPD、PureFTPd和wuftpd等,这么多FTP服务器程序,关键在于自己熟练哪一个就使用哪一个。今天我们来研究一下VSFTPD简单安装及使用。安装命令: yum install vsftpd* -y
修改配置文件如下:
#vsftpd config2014 by wugk
anonymous_enable=NO //禁止匿名用户访问
local_enable=YES //允许本地用户登录FTP
write_enable=YES //运行用户在FTP目录有写入的权限
local_umask=022 //设置本地用户的文件生成掩码为022,默认是077
dirmessage_enable=YES//激活目录信息,当远程用户更改目录时,将出现提示信息
xferlog_enable=YES //启用上传和下载日志功能
connect_from_port_20=YES //启用FTP数据端口的连接请求
xferlog_std_format=YES //是否使用标准的ftpd xferlog日志文件格式
listen=YES //使vsftpd处于独立启动监听端口模式
pam_service_name=vsftpd//设置PAM认证服务配置文件名称,文件存放在/etc/pam.d/目录
userlist_enable=YES //用户列表中的用户是否允许登录FTP服务器,默认是不允许
tcp_wrappers=YES //使用tcp_wrqppers作为主机访问控制方式
第一种方法就是使用系统用户登录FTP,但是也是比较危险的,先测试系统用户登录FTP,在Linux系统上创建useradd test 用户,并为其设置名,然后在xp客户端打开我的电脑资源里面访问 ftp://192.168.33.10,输入用户名和密码即可访问,进行创建和删除操作。
第二种方法比较安全,配置相对复杂一点,就是使用vsftpd虚拟用户登录FTP服务器进行常见的操作。
Ø 首先安装FTP 虚拟用户需要用到的软件及认证模块
yum install pam* db4*–skip-broken –y
创建并生成vsftpd数据库文件vi /etc/vsftpd/ftpusers.txt,内容如下:
第一行为FTP虚拟用户,登录用户名,第二行为密码,第三行为用户名,依次类推。
wugk
1
wugk1
1
Ø 生成数据库文件命令:
db_load -T -t hash -f/etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db
chmod 700/etc/vsftpd/vsftpd_login.db
Ø 配置PAM验证文件:
在配置文件vi /etc/pam.d/vsftpd 行首加入如下两行认证语句:(如果是32位,lib64需改成lib,如果RedHat,加入的语句不一样,需注意)
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
Ø 创建vsftpd映射本地用户:
所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码,也不需要登录。主要用来做虚拟用户映射使用。
useradd –d /home/ftpuser –s /sbin/nologin ftpuser
Ø 修改完整版配置文件内容如下:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
listen=YES
guest_enable=YES
guest_username=ftpuser
pam_service_name=vsftpd
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=YES
保存重启,/etc/init.d/vsftpd restart 即可使用虚拟用户登录,这时候所有的虚拟用户共同使用/home/ftpuser目录上传下载,如果想使用自己独立的目录,可以在/etc/vsftpd/vsftpd_user_conf目录创建各自的配置文件,如给wugk创建独立的配置文件:
vi/etc/vsftpd/vsftpd_user_conf/wugk ,内容如下,建立自己的FTP目录。
local_root=/home/ftpsite/wugk
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
重启,使用客户端登录FTP,测试即可。关于FTP讲解就到此,windows还可以使用Server-U来搭建FTP服务器端,有兴趣的童鞋可以研究一下。
Ø FTP主被动模式
FTP主动模式:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的port 21命令端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
FTP被动模式:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的port 21命令端口。然后客户端开始监听端口N+1,同时客户端提交 PASV命令。服务器会开启一个任意的非特权端口(P >1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
3.1.6 构建Apache WEB服务器
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。Apache工作模式有多种,其中最常用的有两种:
Prefork模式:PreforkMPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。
在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
Worker模式:WorkerMPM 使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。
Worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。
Ø 源码安装Apache
官方下载目前稳定版本,http://mirror.esocc.com/apache/httpd/httpd-2.2.27.tar.gz ,解压安装如下,安装apache之前,需要先安装apr apr-util。
然后启动apache服务: /usr/local/apache2/bin/apachectl start
查看apache进程及端口:
源码包安装Apache默认发布目录为:/usr/local/apache2/htdocs/下。
Ø Apache基于域名虚拟主机配置
修改vi/usr/local/apache2/conf/extra/httpd-vhosts.conf 虚拟主机配置文件内容如下:
NameVirtualHost*:80
ServerAdmin [email protected]
DocumentRoot "/data/webapps/www1"
ServerName www.wugk1.com
AllowOverride All
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
ErrorLog logs/error_log
CustomLog logs/access_log common
ServerAdmin [email protected]
DocumentRoot "/data/webapps/www2"
ServerName www.wugk2.com
AllowOverride All
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
ErrorLog logs/error_log
CustomLog logs/access_log common
然后在/usr/local/apache2/conf/httpd.conf最末尾加入如下配置:
Includeconf/extra/httpd-vhosts.conf
重新加载apache即可,/usr/local/apache2/bin/apachectlgraceful效果演示如下:
Apache基于IP虚拟主机同样跟域名一直,在服务器配置多个IP,然后把域名改成IP即可。
Ø Apache Rewrite规则讲解
Rewrite URL重定向就是实现URL的跳转和隐藏真实地址,可以把复杂的URL变成简洁直观的URL,对seo优化有很大的帮助。如下几个简单的举例:
把所有配置的域名都跳转到一个域名:
RewriteEngine on //启用rewrite引擎
RewriteCond %{HTTP_HOST}^wugk1.com [NC] //匹配以wugk1.com开头的域名,NC忽略大小写。
RewriteRule ^/(.*)$ http://www.wugk1.com/$1 [L]
//匹配上面条件,然后跳转到http://www.wugk1.com
R 强制外部重定向。
F 禁用URL,返回403HTTP状态码。
G 强制URL为GONE,返回410HTTP状态码。
P 强制使用代理转发。
L 表明当前规则是最后一条规则,停止分析以后规则的重写。
N 重新从第一条规则开始运行重写过程。
C 与下一条规则关联。
3.1.7 构建MySQL服务器
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司, 目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维、DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始人已独立出来自己重新开发了一个MariaDB,而且使用的人数越来越多。而且MariaDB兼容mysql所有的功能和相关参数。
Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢?
MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT操作,MyISAM是更好的选择,支持表锁。
InnoDB提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
MySQL安装方式有两种,一种是yum/rpm安装,另外一种是tar源码安装。
Yum 安装方法很简单,执行命令如下即可: yum install –y mysql-server mysql-devel mysql
源码安装MySQL方式:
cd/usr/src ;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz ;tarxzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure–prefix=/usr/local/mysql --enable-assembler &&make &&make install
配置Mysql服务为系统服务:
cp/usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cp/usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on
cd /usr/local/mysql
useradd mysql
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql var
/usr/local/mysql/bin/mysqld_safe --user=mysql &
MySQL日常操作命令:
create database test_db; 创建名为test_db数据库
use test_db; 进入test_db数据库
show tables; 查看数据库里有多少张表。
create table test01 (id varchar(20),namevarchar(20));创建名为test01表,并创建两个字段,id、name、数据长度(用字符来定义长度单位。)
insert into test01 values(“001”,“wugk1”); 向表中插入数据。
select * from test01; 查看test01表数据内容。
grant all privileges on test_db.* to test@localhost identified by ‘123456’;
grant all on test_db.* to test@localhost identified by ‘123456’;
grant select,insert,update,delete on . to test@”%” identified by ‘123456’;
给mysql数据库授权。
flush privileges;刷新权限
mysqldump –uroot –p123456 test_db >/tmp/test.db.sql ;MySQL备份或导出
mysql –uroot –p123456 test_db
mysqladmin –uroot–p123456 password newpassword ;修改MySQL root密码
drop database test_db ; 删除数据库
drop table test01 ; 删除表
delete from test01 ; 清空表内容
show variables like ‘%char%’; 查看数据库字符集
修改Mysql字符集为UTF-8的方法:在/etc/my.cnf对应如下配置段加入相应命令。
[client]字段里加入default-character-set=utf8
[mysqld]字段里加入character-set-server=utf8
[mysql]字段里加入default-character-set=utf8
然后重启MySQL服务即可。
3.1.8 LAMP架构网站搭建
Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个IT界的关注。
目前LAMP架构是大多数中小企业最青睐的PHP架构选择,也是众多Linux SA喜欢选择的一套架构。那接下来我们就实战来操作一下,如果来搭建这样一套架构,当然可以使用yum方法,安装命令很简单,一条命令搞定所有。
yum install httpd httpd-devel mysql-servermysql-devel php php-devel php-mysql –y
这一条命令LAMP环境即可安装成功,只需要重启apache、mysql服务即可。
如果想要更多功能和自定义模块,需要使用源码包的方式来安装LAMP架构。如下我们使用源码包来实现LAMP架构安装与配置:
Ø 源码安装LAMP之Apache
yum install apr-devel apr-util-devel –y;
cd /usr/src ; wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz ;tarxzf httpd-2.2.27.tar.gz ;cd httpd-2.2.27;./configure --prefix=/usr/local/apache --enable-so --enable-rewrite&&make &&make install
Ø 源码安装LAMP之MySQL
cd /usr/src ;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz ;tarxzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure --prefix=/usr/local/mysql–enable-assembler &&make &&make install
配置Mysql服务为系统服务:
cp/usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cp/usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on
cd /usr/local/mysql
useradd mysql
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql var
/usr/local/mysql/bin/mysqld_safe --user=mysql &
Ø 源码安装LAMP之PHP
cd /usr/src ;wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2 ;tarjxf php-5.3.28.tar.bz2 ;cd php-5.3.28;./configure --prefix=/usr/local/php5–with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql/
Ø 源码安装Apache+PHP整合
整合apache+php环境,修改httpd.conf配置文件,然后加入如下语句:
LoadModule php5_modulemodules/libphp5.so (默认已存在)
AddType application/x-httpd-php .php
DirectoryIndex index.phpindex.html (把index.php加入index.html之前)
然后在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令:
cat>>/usr/local/apache/htdocs/index.php < EOF 重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。 Ø 源码安装DISCUZ论坛 下载discuz源码包文件,然后解压: cd /usr/src ;wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip 解压discuz程序包:unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/ 重命名程序文件:cd/usr/local/apache/htdocs/ ;mv upload/* . 赋予discuz目录完全访问权限:cd /usr/local/apache/htdocs/ ;chmod 777 -R data/ uc_server/ config/uc_client/ 然后访问IP安装discuz论坛,如下图,选择“我同意” 进入如下界面,数据库安装,如果不存在则需要新建数据库并授权。 数据库创建及授权命令如下: create database discuz charset=utf8; grant all on discuz.* toroot@‘localhost’ identified by “123456”; 点击下一步,直至安装完成,进入等待已久的论坛画面: 自此LAMP环境整合并搭建成功,通过IP直接访问即可。 3.1.9 Cacti监控平台搭建 Cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此,snmp和rrdtool是cacti的关键。 Snmp关系着数据的收集,rrdtool关系着数据存储和图表的生成。snmp抓到数据不是存储在mysql中,而是存在rrdtool生成的rrd文件中(在cacti根目录的rra文件夹下,一般以rra为后缀名称)。简单原理图如下: 官网下载cacti相关软件,一共需要三个软件,下载地址分别如下: http://www.cacti.net/downloads/cacti-0.8.8a.tar.gz http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.5.tar.gz http://www.cacti.net/downloads/spine/cacti-spine-0.8.8a.tar.gz 这里采用yum安装方式,安装命令: yum install httpd mysql mysql-server php php-mysql php-json php-pdo -y 安装rrdtool之前需要安装相应的lib库,如下安装: yum install cairo-devel libxml2-devel pango pango-devel –y tar xzf rrdtool-1.4.5.tar.gz ;cd rrdtool-1.4.5 ;./configure --prefix=/usr/local/rrdtool/ make &&make install;ln -s /usr/local/rrdtool/bin/* /usr/local/bin/ yum install net-snmp net-snmp-utils –y tar xzf cacti-0.8.8a.tar.gz &&mv cacti-0.8.8a /var/www/html/cacti/ mysql -uroot –p 输入你的密码进入数据库,然后创建数据库: create database cacti;创建数据库 grant all on cacti.* to cacti@‘localhost’ identified by"123456";创建用户并授权 flush privileges; 刷新权限 mysql配置完毕后,把cacti数据导入cacti数据库 mysql -ucacti -p123456 cacti
配置完mysql后,我们需要设置cacti rra、log 目录的权限,这里设置为777: chmod -R 777 /var/www/html/cacti/rra/ chmod -R 777 /var/www/html/cacti/log/ vi /var/www/html/cacti/include/config.php为如下配置: */5 * * * * /usr/bin/php /var/www/html/cacti/poller.php>>/tmp/cacti_rrdtool.log 2 >&1 通过http://ip/cacti/ 访问出现如下界面,点击NEXT下一步。 默认一直点击下一步: 进入登录界面,第一次需要修改密码: 进入Cacti配置管理界面 点击device,可以添加设备,默认可以看到127.0.0.1这台服务器。右上角Add可以增加设备。 点击localhost可以看到具体的设置,包括采用的snmp协议版本,监控的名称等: 如果出现snmp error,检查snmp服务是否已启动,或者是否有权限。出现如上信息则表示正常。 点击左上角第二个按钮,graphs查看cacti图像—选择localhost主机—右边会显示cacti每5分钟的监控图像。 更多cacti深入知识,根据需求深入讲解。 3.1.10 Nagios监控平台搭建 Nagios和cacti有什么区别呢?简单的来说cacti主要监控流量,服务器状态页面展示;nagios主要监控服务,邮件及短信报警灯,当然也有简单的流量监控界面,二者综合使用效果更好。(附Nagios工作简单逻辑图) Nagios监控客户端需要借助插件及NRPE软件来实现,NRPE作为中间的代理程序,接收Nagios服务器端发来的请求,另一端在远程主机上指定的相关的监控信息。 同样安装nagios服务需要安装LAMP环境,这里省略,可以参考之前的cacti PHP环境安装方法:官网下载nagios相应版本和插件: wget http://sourceforge.net/projects/nagios/files/nagios-3.x/nagios-3.2.1/nagios-3.2.1.tar.gz/download http://down1.chinaunix.net/distfiles/nagios-plugins-1.4.14.tar.gz /usr/sbin/useraddnagios tar zxvf nagios-3.2.1.tar.gz cd nagios-3.2.1 ./configure --prefix=/usr/local/nagios --with-command-group=nagios make all make install //来安装主程序,CGI和HTML文件 make install-init //在/etc/rc.d/init.d安装启动脚本 make install-config //来安装示例配置文件,安装的路径是/usr/local/nagios/etc make install-commandmode //来配置目录权限 make install-webconf // 配置nagios跟apache整合 tar zxvf nagios-plugins-1.4.14.tar.gz cd nagios-plugins-1.4.14 ./configure --prefix=/usr/local/nagios --with-nagios-user=nagios–with-nagios-group=nagios make && make install htpasswd -c /usr/local/nagios/etc/htpasswd.usersnagiosadmin 输入两次密码即可,登录页面的时候会用到这个密码. 重启nagios ,/etc/init.d/nagios restart;/etc/init.d/httpd restart ; http://localhost/nagios/ 如下图: 点击左侧的Hosts可以看到右侧默认localhost主机的监控,UP表示主机目前运行正常: 点击左侧的Services可以看到右侧默认localhost监控的各个服务的状态,绿色OK表示正常: 默认安装完nagios,配置文件主目录在/usr/local/nagios/下,目录各种的功能如下: bin Nagios 可执行程序所在目录 etc Nagios 配置文件所在目录 sbin Nagios CGI 文件所在目录,也就是执行外部命令所需文件所在的目录 share Nagios网页文件所在的目录 libexec Nagios 外部插件所在目录 var Nagios 日志文件、lock 等文件所在的目录 var/archives Nagios 日志自动归档目录 var/rw 用来存放外部命令文件的目录 这里先来了解etc/objects目录主要包括监控主机的配置、模板、监控时间段等配置文件。 简单来添加一个客户端监控的步骤: cplocalhost.cfg 192.168.33.10.cfg 把默认配置文件里面的locahost、127.0.0.1、check_local替换成最新 sed -i’s#localhost#192.168.33.10#g;s#127.0.0.1#192.168.33.10#g;s#check_local#check#g;s#linux-servers#192.168.33.10#g’ 192.168.33.10.cfg 在nagios.cfg36行后加入cfg_file=/usr/local/nagios/etc/objects/192.168.33.10.cfg sed -i’36a cfg_file=/usr/local/nagios/etc/objects/192.168.33.10.cfg’/usr/local/nagios/etc/nagios.cfg 最后执行:/usr/local/nagios/bin/nagios-v /usr/local/nagios/etc/nagios.cfg没有报错即可。 默认有报错,因为没有在客户端安装nagios插件及NRPE,需删掉配置文件里disk、swap、process、user、cpu等监控配置段: defineservice{ 这里注意*如果没有配置check_nrpe监控,默认不能监控客户端例如swap、disk、CPU、process等状态,需要在配置文件里删除或者注释掉。 如下是刚刚添加的默认的客户端监控图: Nagios客户端安装需要安装两个软件,nagios-plugins-1.4.15.tar.gz和nrpe-2.13.tar.gz,安装方法如下: useradd nagios ;tar-xzf nagios-plugins-1.4.15.tar.gz &&cd nagios-plugins-1.4.15&&./configure –prefix=/usr/local/nagios &&make&&make install tar -xzfnrpe-2.13.tar.gz && cd nrpe-2.13 &&./configure --enable-ssl–with-ssl-lib &&make all && make install-plugin &&make install-daemon && make install-daemon-config chown -R nagios:nagios /usr/local/nagios/ ;cd … ;cp nrpe.cfg /usr/local/nagios/etc/nrpe.cfg 启动nrpe客户端命令:/usr/local/nagios/bin/nrpe-c /usr/local/nagios/etc/nrpe.cfg –d 修改vi/usr/local/nagios/etc/nrpe.cfg 修改默认配置段的内容如下,去掉#号,做相应修改。 command[check_users]=/usr/local/nagios/libexec/check_users-w 5 -c 10 command[check_load]=/usr/local/nagios/libexec/check_load-w 15,10,5 -c 30,25,20 command[check_disk]=/usr/local/nagios/libexec/check_disk-w 20 -c 10 -p /dev/sda2 command[check_procs]=/usr/local/nagios/libexec/check_procs-w 50 -c 100 command[check_swap]=/usr/local/nagios/libexec/check_swap-w 20 -c 10 Nagios 服务器端也需要安装nrpe,同时需要定义Nrpe监控命令,写command.cfg末尾即可: define command{ 在192.168.33.10.cfg加入如下配置段,引用客户端nrpe.cfg里面配置的check_load命令,命令一般格式为:check_nrpe!command define service{ 其他同理,添加的方法一样。只要在客户端nrpe.cfg里面添加的监控命令,都可以在服务端引用。 在真实的线上环境中,如果要监控HTTP、web、tomcat某个URL关键词,监控网站关键词是否被篡改,如果来实现呢? 这里可以使用默认监控命令check_http命令+相关的参数来实现,如下: 在command.cfg添加如下关键词监控命令:check_http_word,参数解析:-I指定IP或者主机名,-u指定URL,-p指定端口,-s指定关键词。 define command{ ARG1 − p A R G 2 −p ARG2 −pARG2 -s A R G 3 ARG3 ARG3 然后在服务器端监控主机的配置文件里面引用即可,引用的方法如下: 也可以在服务器端命令行执行如下命令来做测试,例如监控页面不存在ATM关键词,但82端口web服务可以访问,依然会发送报警。 /usr/local/nagios/libexec/check_http -I192.168.33.11 -u /index.html -p 82 -s “ATM” 如上截图表示,关键词ATM不存在,则nagios在监控页面上会显示CRITICAL紧急。 使用nagios报警,以前可以用飞信发送报警,但是自从飞信更改接口后,就不方便了,那我们要发短信报警怎么办呢,我们可以139邮箱,机制是nagios给139邮箱发送信息,然后信息会自动发到我们绑定的手机。提前在139上绑定好手机即可。除此之外还可以使用短信猫(收费)设备来发送报警。 默认command.cfg里面已经配置好了邮件报警设置,可以使用默认的配置,使用系统默认的mail发送邮件;还可以自己定义发送的内容格式及发送的邮件smtp服务器端软件。 这里使用默认的配置文件,要能收到短信报警,除了在139.com界面绑定139邮箱之外,还需要在nagios服务器端配置文件修改邮件收件人如下: 修改配置文件:vi/usr/local/nagios/etc/objects/contacts.cfg内容如下: 同样也可以使用sed命令修改:cd /usr/local/nagios/etc/objects/ ; sed -i ‘s#nagios@localhost#[email protected]#g’ contacts.cfg 3.1.11 Kickstart自动化安装平台 大中型互联网公司一次采购服务器上百台,如果采用人工手动一台一台的安装,一个人得搞坏N张光盘,得多少个加班加点才能完成这项”艰巨”的任务呢,我们可以看到全人工来完成这样的工作太浪费人力了,有没有自动化安装平台呢,通过一台已存在的系统然后克隆或者复制到新的服务器呢。Kickstart可以毫不费力的完成这项工作。 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行。 要使用kickstart安装平台,包括的完整架构为:Kickstart+DHCP+NFS+TFTP+PXE,从架构可以看出,大致需要安装的服务,例如dhcp、tftp、nfs、kickstart/pxe等。 yum install -y dhcp* tftp* 首先配置tftp服务: vi /etc/xinetd.d/tftp servicetftp { disable =no socket_type= dgram protocol =udp wait = yes user =root server =/usr/sbin/in.tftpd server_args= -u nobody -s /tftpboot per_source= 11 cps = 1002 flags =IPv4 } 只需要把disable =yes改成disable = no即可。 要实现远程安装系统,首先需要在TFTPBOOT目录指定相关PXE内核模块及相关参数。配置步骤如下: mount /dev/cdrom /mnt 挂载本地光盘 #如果系统是5.x,默认tftpboot目录已经自动创建到/根目录下 #如果系统是6.x,默认tftpboot目录在/var/lib/下,所以centos6.x需要做软链接到/根目录下。 cp/usr/lib/syslinux/pxelinux.0 ./ cp /mnt/images/pxeboot/{vmlinuz,initrd.img} ./ 拷贝内核至tftpboot目录下 mkdir -p pxelinux.cfg &&cp /mnt/isolinux/isolinux.cfg pxelinux.cfg/default 拷贝isolinux.cfg配置文件重命名,系统安装的时候会根据这个文件的配置启动相应的选项。 修改pexlinux.cfg/default内容如下: defaultlinux prompt 1 timeout 10 displayboot.msg F1boot.msg F2options.msg F3general.msg F4param.msg F5rescue.msg labelcentos5.8 kernelvmlinuz appendks=nfs:192.168.0.79:/centosinstall/ks.cfg ksdevice=eth0 initrd=initrd.img label text kernelvmlinuz appendinitrd=initrd.img text label ks kernelvmlinuz append ksinitrd=initrd.img labellocal localboot1 labelmemtest86 kernelmemtest append – 解析:192.168.0.79是kickstart服务器,/centosinstall 是nfs共享linux镜像的目录,也是linux存放安装文件的路径,ks.cfg是kickstart主配置文件;设置timeout 10 /*超时时间为10S */;ksdevice=etho代表当我们有多块网卡的时候,要实现自动化需要设置从eth0安装。 TFTP配置完毕,由于是TFTP是非独立服务,需要依赖xinetd服务来启动,启动命令为: chkconfig tftp --level 35 on && service xinetd restart 远程系统安装,客户端需要下载系统所需的软件包,所以需要使用NFS或者httpd把镜像文件共享出来。 mkdir -p /centosinstall nohup cp -rf /mnt/* /centosinstall & echo “/centosinstall *(rw,sync)” >>/etc/exports 在NFS配置文件/etc/exports中加入如上语句:/centosinstall *(rw,sync),表示允许任何主机访问/centosinstall目录,有读写权限。 如下我这里采用配置文件内容如下:vi ks.cfg install text nfs --server=192.168.0.79 --dir=/centosinstall key --skip lang zh_CN.UTF-8 keyboard us network --device eth0 --bootproto=dhcp --noipv6 rootpw 123456 firewall --disabled authconfig --enableshadow --enablemd5 selinux --disabled timezone Asia/Shanghai bootloader --location=mbr --driveorder=sda–append=“rhgb quiet” clearpart --all --initlabel part /boot --fstype ext3 --size=200 part swap --size=4000 part / --fstype ext3 --size=80000 part /data --fstype ext3 --size=1 --grow %packages @admin-tools @base @core @development-libs @development-tools @editors @system-tools @base-x @chinese-support keyutils kexec-tools trousers fipscheck device-mapper-multipath imake audit xorg-x11-server-Xnest xorg-x11-server-Xvfb 第一步install,以text字符界面,指定nfs共享IP和目录,设置安装后的服务器字符集、网络分配方式、密码; 然后设置防火墙状态,磁盘采用MBR方式引导,然后客户机分区的情况;%packages 后写入客户机系统需要安装的软件包,可以自己定制。更多详细的参数在此就不做过多的说明了,可以进一步学习。 在真实环境中,通常我们会发现一台服务器好几块硬盘,做完raid,整个硬盘有等10T,如果来使用kickstart自动安装并分区呢;一般服务器硬盘超过2T,如何来使用kickstart安装配置呢?这里就不能使用MBR方式来分区,需要采用GPT格式来引导并分区。 需要在ks.cfg末尾添加如下命令来实现需求: %pre 为了实现kickstart安装完系统后,自动初始化系统等等工作,我们可以在系统安装完后,自动执行定制的脚本,需要在ks.cfg末尾加入如下配置: %post mount -t nfs 192.168.0.79:/centos/init /mnt cd /mnt/;/bin/sh auto_init.sh %end Pxe+kickstart自动安装系统,需要用到DHCP分配的客户端的IP地址,这里直接上dhcpd.conf配置文件: ddns-update-style interim; ignore client-updates; next-server 192.168.0.79; filename “pxelinux.0”; allow booting; allow bootp; subnet 192.168.0.0 netmask 255.255.255.0 { option routers 192.168.0.1; option subnet-mask 255.255.252.0; range dynamic-bootp 192.168.0.100 192.168.0.200; host ns { hardware ethernet 00:1a:a0:2b:38:81; fixed-address 192.168.0.101;} } 最后重启所有服务,并关闭iptables和selinux,然后找一台新服务器,接入网线与kickstart服务器在一个交换机或通过中继能获取到IP的网络即可。 service xinetd restart service nfs restart service dhcpd restart 注*KICKSTART所有配置就此告一段落,真实环境需要注意,新服务器跟kickstart最后独立在一个网络,不要跟办公环境或者服务器机房网络混在一起,如果别的机器以网卡就会把它的系统重装成Linux系统。 4.1 LinuxShell编程 Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell脚本编程去运行。随着Linux企业应用越来越多,维护Linux日常工作频繁,所以如果单靠手工去敲打命令是非常困难的,所以学会熟练使用SHELL编程是每个Linux SA必备的功课。 Linux Shell种类非常多,常见的有:BourneShell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。 最常用的shell是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。接下来我们来写一个简单的shell脚本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本) vi first_shell.sh #!/bin/bash #This is my First shell echo “Hello World !” 这就是我们的第一个脚本,是不是很简单呢,注解如下: #!/bin/bash //表示定义该脚本是一个shell脚本(固定格式)。 #This is my First shell //这里的#号属于注解,没有任何的意义,SHELL不会解析它。 echo “Hello World !” //shell脚本主命令,我们执行这个脚本讲看到: Hello World ! 信息。 脚本编写完毕,如何来执行呢,首先执行shell脚本需要执行权限,赋予执行权限: chmod o+x first_shell.sh 然后./first_shell.sh执行即可;也可以直接使用命令执行: /bin/sh first_shell.sh,显示效果一样。 4.1.2 Shell变量设置 SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。 例如在脚本里面定义A=123,定义这样一个变量,前面变量名,后面是变量的值。 引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?如下: #!/bin/bash #Author wugk 2014-06-10 A=123 echo “Printf variables equal is $A” 执行脚本:sh test.sh,结果将会显示: Printf variables equal is 123 简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。 例如定义变量 name=wuguangke 执行echo $name 将会显示wuguangke SHELL常见的系统变量解析: $0 当前程序的名称 $n 当前程序的第n个参数,n=1,2,…9 $* 当前程序的所有参数(不包括程序本身) $# 当前程序的参数个数(不包括程序本身) $? 命令或程序执行完后的状态,一般返回0表示执行成功。 $UID 当前用户的ID $PWD 当前所在的目录 4.1.3 Shell流程控制语句 Ø If条件判断语句 If (表达式) #if ( Variable in Array ) 语句1 else 语句2 fi 案例一,测试数字大小 #!/bin/sh NUM=100 if (( $NUM > 4 )) ;then echo “this num is $NUM greater 4 !” fi 案例二,测试目录是否存在,不存在则新建(注意,中括号之间必须要空格) #!/bin/sh #judge dir exist if [ ! -d /data/20140515 ];then mkdir -p/data/20140515 else fi 逻辑运算符解析: -f 判断文件是否存在 eg: if [ -f filename ] -d 判断目录是否存在 eg: if [ -d dir ] -eq 等于 应用于:整型比较 -ne 不等于 应用于:整型比较 -lt 小于 应用于:整型比较 -gt 大于 应用于:整型比较 -le 小于或等于 应用于:整型比较 -ge 大于或等于 应用于:整型比较 -a 双方都成立(and) 逻辑表达式 –a 逻辑表达式 -o 单方成立(or) 逻辑表达式 –o 逻辑表达式 -z 空字符串 案例三,多个条件测试判断 #!/bin/sh scores=80; Ø 循环语句for For 变量 in 字符串 do 语句1 done 案例一,打印seq多个数 案例二,找到相关log,然后批量打包 Ø 循环语句while while 条件语句 do 语句1 done 案例一,while条件判断数字 #!/bin/sh i=1; while [[ $i -lt 10 ]];do echo $i; ((i++)); done; 案例二,while逐行读取某个文件 #!/bin/sh while read line do echo $line; done < /etc/hosts Ø Until循环语句 until 条件 do action done 直到满足条件,才退出。否则执行action。 案例一,条件判断数字 #!/bin/sh a=10; until [[ $a -lt 0 ]];do echo $a; ((a–)); done; Ø Case选择语句 case $arg in esac 案例一,创建选择参数脚本 #!/bin/sh case $1 in esac Ø select选择语句 #!/bin/sh PS3=“What you like most of the open sourcesystem?” select i in CentOS RedHat Ubuntu do echo "Your Select System: "$i done 4.1.4 Shell脚本案例 脚本的功能实现从/root/目录cp拷贝test.txt到/tmp目录,并且在/tmp目录创建一个目录abc,并且删除原/root/下test.txt。 首先命名脚本名称为auto_cp.sh(名称可以自己定义),内容如下: #!/bin/bash #This is First shell for auto cpFiles #定义文件和目录变量 FILES=/root/test.txt DIR=/tmp cp $FILES $DIR cd $DIR ; mkdir –p abc rm -rf $FILES echo “The Shell Scripts exec successfully !” “自动CP并删除文件”的脚本编写完毕,保存退出即可。 b) 自动备份Mysql数据库脚本 #!/bin/sh #autobackup mysql #wugk 2012-12-12 #DefinePATH定义变量 BAKDIR=/data/backup/mysql/ MYSQLDB=webapp MYSQLPW=backup MYSQLUSR=backup #mustuse root user run scripts 必须使用root用户运行,$UID为系统变量 if [ $UID -ne 0 ];then echo This script must use the root user ! !! sleep 2 exit 0 fi #DefineDIR and mkdir DIR 判断目录是否存在,不存在则新建 if [ ! -d $BAKDIR ];then mkdir -p $BAKDIR else echo This is $BAKDIR exists… fi #Usemysqldump backup mysql 使用mysqldump备份数据库 /usr/bin/mysqldump-u M Y S Q L U S R − p MYSQLUSR -p MYSQLUSR−pMYSQLPW -d M Y S Q L D B > MYSQLDB > MYSQLDB>BAKDIR/webapp_db.sql echo"The mysql backup successfully " c) 自动打包tar目录下log文件脚本 #!/bin/sh #autotar czf shell to Files #Authorwugk 2014-05-15 SRC_DIR=/opt/ DES_DIR=/opt/backup/ If [ ! –d $DES_DIR ];then fi for i in do done echo “Thescripts exec end, Files tar successfully !” d) 自动拒绝恶意IP脚本 #!/bin/sh #autodrop ssh failed IP address #wugk 2013-1-2 #定义变量 SEC_FILE=/var/log/secure #如下为截取secure文件恶意ip 远程登录22端口,大于等于4次就写入防火墙,禁止以后再登录服务器的22端口 IP_ADDR= IPTABLE_CONF=/etc/sysconfig/iptables echo cat< ++++++++++++++welcometo use ssh login drop failed ip+++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++±-----------------------------------++++++++++++++++++ EOF echo-n "请等待5秒后开始执行 " for ((j=0;j<=4;j++));do echo -n “----------”;sleep 1 ;done echo for i in do if else fi done #最后重启iptables生效 /etc/init.d/iptablesrestart 4.1.5 Shell数组编程 今天这里我们来探讨一维数组的定义、统计、引用和删除等操作。首先来定义一个一维数组: A=( test1 test2 test3 ) ,定义数组一般以括号的方式来定义,数组的值可以随机定义。如何来引用呢? echo ${A[0]},代表引用第一个数组变量,结果会显示test1,数组引用从0开始,代表第一个数组,依次类推。 echo ${A[1]},代表引用第二个数组变量,结果会显示test2,数组引用也是从0开始计算的。 如何显示该数组所有参数呢?echo ${A[@]} 将显示所有参数test1test2 test3 。 如何显示该数组参数个数呢?echo ${#A[@]} 将显示该数组的参数个数3。 如果替换某个数组呢?例如替换第二个test2数组为test5:echo ${A[@]/test2/test5} 如何删除一个数组呢?例如删除test3数组命令为:unset A[2] ;echo ${A[@]}查看效果。 那输入如何在编程来使用呢?请看下面例子: #!/bin/sh #Auto Make KVM Virtualization #Auto config bond scripts eth_bond() { NETWORK=( HWADDR= IPADDR= NETMASK= GATEWAY= ) cat >ifcfg-bond0< DEVICE=bond0 BOOTPROTO=static ${NETWORK[1]} ${NETWORK[2]} ${NETWORK[3]} ONBOOT=yes TYPE=Ethernet NM_CONTROLLED=no EOF 如上脚本为定义三个数组变量,然后分别来引用,这样让脚本可读性更强,更整洁。关于数组就简单的介绍到这里。 5.1 构建Nginx WEB服务器 据Netcraft统计,在2012年8月份,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。目前互联网主流公司360、百度、新浪、腾讯、阿里等都在使用nginx作为自己的web服务器。 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。 Nginx相对于Apache优点: 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s 反向代理性能非常好。(可用于负载均衡) 内存和cpu占用率低。(为Apache的1/5-1/10) 功能较Apache少(常用功能均有) 对php可使用cgi方式和fastcgi方式。 5.1.1 NginxWEB安装 #安装pcre支持rewrite库,也可以安装源码,注*安装源码时,指定pcre路径为解压 源码的路径,而不是编译后的路径,否则会报错 (make[1]: *** [/usr/local/pcre/Makefile] Error 127 错误) yum install pcre-devel pcre -y #下载Nginx源码包 cd /usr/src ;wget -c http://nginx.org/download/nginx-1.4.2.tar.gz #解压Nginx源码包 tar -xzf nginx-1.4.2.tar.gz #进入解压目录,然后sed修改Nginx版本信息为WS cd nginx-1.4.2 ; sed -i -e ‘s/1.4.2//g’ -e’s/nginx//WS/g’ -e ‘s/“NGINX”/“WS”/g’ src/core/nginx.h #预编译Nginx useradd www ;./configure --user=www --group=www–prefix=/usr/local/nginx --with- http_stub_status_module --with-http_ssl_module #.configure预编译成功后,执行make命令进行编译 make #make执行成功后,执行make install 正式安装 make install #自此Nginx安装完毕 /usr/local/nginx/sbin/nginx -t 检查nginx配置文件是否正确,返回OK即正确。 [root@localhost ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file/usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file/usr/local/nginx/conf/nginx.conf test is successful [root@localhost ~]# 然后启动nginx,/usr/local/nginx/sbin/nginx回车即可。查看进程是否已启动: [root@localhost ~]# ps -ef |grep nginx nobody 5381 30285 0 May16 ? 00:04:31 nginx: worker process root 30285 1 0 2014? 00:00:00 nginx: master process/usr/local/nginx/sbin/nginx root 32260 32220 0 12:34 pts/0 00:00:00 grep nginx [root@localhost ~]# 5.1.2 Nginx虚拟主机配置 vi修改nginx.conf server段配置内容如下: #virtual hosts config 2014/5/18 server { server { 创建两个不同的目录mkdir –p /usr/local/nginx/html/{a,b},然后分别在两个目录创建两个不同的index.html网站页面即可。通过客户端配置hosts指向两个域名,然后在IE浏览器访问测试效果。 5.1.3 Nginx性能优化 worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数。 worker_cpu_affinity 00000001 00000010 0000010000001000 00010000 00100000 01000000 10000000; 为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一 个进程分配到多个cpu。 worker_rlimit_nofile 102400; 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打 开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀 ,所以最好与ulimit -n的值保持一致。 use epoll; 使用epoll的I/O模型。epoll是Linux内核为处理大批量文件描述符而作了改进的 poll,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用 率。 worker_connections 102400; 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为 worker_processes*worker_connections。 keepalive_timeout 60; keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后 继请求时,keepalive-timeout功能可避免建立或重新建立连接。 client_header_buffer_size 4k; 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个 请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为 分页大小。分页大小可以用命令getconf PAGESIZE取得。 open_file_cache max=102400 inactive=20s; 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开 文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s; 这个是指多长时间检查一次缓存的有效信息。 open_file_cache_min_uses 1; open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这 个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。 net.ipv4.tcp_max_tw_buckets = 10000 timewait的数量,默认是180000。 net.ipv4.ip_local_port_range = 1024 65000 允许系统打开的端口范围。 net.ipv4.tcp_tw_recycle = 1 启用timewait快速回收。 net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。 net.ipv4.tcp_syncookies = 1 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。 5.1.4 Nginx参数深入理解 Nginx 的upstream目前支持5种算法分配方式: 每个请求按时间顺序逐一分配到后端不同的服务器,如果后端某台服务器down掉,自动剔除,待恢复自动添加上。 指定轮询权重,权重越高,处理的请求就越多,weight和访问比率成正比,用于后端服务器性能不均的情况。 每个请求根据访问的IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,一般用于登录会话。 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream的 fail_timeout和max_fails参数是用来判断负载均衡upstream中的某个server是否失效。 在fail_timeout的时间内,nignx与upstream中某个server的连接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。 例如在nginx.conf里面配置如下的tdt_app均衡: upstream tdt_app { } Tdt_app均衡两台后端JAVA服务,在30秒内nginx会与后端的某个server通信检测,如果检测连接失败2次,则Nginx会认为该server已经失效,然后踢出转发列表,然后在接下来的30s内,nginx不再讲请求转发给失效的server。 另外,fail_timeout设置的时间对响应时间没影响,这个响应时间是用proxy_connect_timeout和proxy_read_timeout来控制的。 proxy_connect_timeout :Nginx与后端服务器连接的超时时间,发起握手等候响应超时时间。 proxy_read_timeout:连接成功后_等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)。 proxy_send_timeout :后端服务器数据回传时间,在规定时间之内后端服务器必须传完所有的数据。 keepalive_timout:一个http产生的tcp连接在传送完最后一个响应后,还需要等待多少秒后,才关闭这个连接。 5.1.5 NginxRewrite规则 Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种: last :相当于Apache里德(L)标记,表示完成rewrite; break;本条规则匹配完成后,终止匹配,不再匹配后面的规则 redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 last和break用来实现URL重写,浏览器地址栏URL地址不变。 a) 例如用户访问www.test.com,想直接跳转到网站下面的某个页面,www.test.com/new.index.html如何来实现呢? 我们可以使用Nginx Rewrite 来实现这个需求,具体如下: 在server中加入如下语句即可: rewrite ^/$ http://www.wugk.com/index.html permanent; *代表前面0或更多个字符 +代表前面1或更多个字符 ?代表前面0或1个字符 ^代表字符串的开始位置 $代表字符串结束的位置 。为通配符,代表任何字符 b) 例如多个域名跳转到同一个域名,nginx rewrite规则写法如下: server { listen 80; server_name www.wugk.com wugk.com; if ($host != ‘www.wugk.com’ ) { rewrite ^/(.*)$ http://www.wugk.com/$1 permanent; } 更多深入的rewrite可以继续学习。 5.2 构建Rsync同步服务器 Rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。可以很容易做到保持原来文件的权限、时间、软硬链接等。 5.2.1 Rsync服务端配置 A是源服务器,B、C为客户端服务器,因需求,B、C服务器需要从A某个同步某个目录到本地。 正式安装,官网下载rsync稳定版本,然后进行安装编译。 cd /usr/src;wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz tar xzf rsync-3.0.7.tar.gz && cd rsync-3.0.7 &&./configure – prefix=/usr/local/rsync &&make &&make install 安装完毕,配置rsync配置文件,默认/etc/不存在rsyncd.conf配置文件,需要手动创建,配置内容为如下:cat rsyncd.conf #########[global] 全局配置 uid = nobody gid = nobody use chroot = no max connections = 30 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300 [www] read only = yes path = /usr/local/webapps comment = www auth users =test secrets file = /etc/rsync.pas hosts allow = 192.168.0.11,192.168.0.12 [web] read only = yes path = /data/www/web comment = web auth users =test secrets file = /etc/rsync.pas hosts allow = 192.168.1.11,192.168.0.0/24 Rsync配置参数说明: [www] #要同步的模块名 path = /usr/local/webapps #要同步的目录 comment = www #这个名名称无所谓,最后模块名一直) read only = no # no客户端可上传文件,yes只读 write only = no # no客户端可下载文件,yes不能下载 list = yes #是否提供资源列表 auth users =test #登陆系统使用的用户名,没有默认为匿名。 hosts allow = 192.168.0.10,192.168.0.20 #本模块允许通过的IP地址 hosts deny = 192.168.1.4 #禁止主机IP secrets file=/etc/rsync.pas #密码文件存放的位置 设置rsync服务器端同步密钥: vi /etc/rsync.pas username:userpasswd (表示用户名:密码) test:test999 保存完毕,chmod 600 /etc/rsync.pas设置权限为宿主用户读写。 最后在客户端配置同步密钥和命令,如下设置即可同步。 vi /etc/rsync.pas 输入服务器端配置的密码: test999 保存即可开始同步:执行如下语句 Rsync -aP [email protected]::www /usr/local/webapps --password-file=/etc/rsync.pas Rsync -aP [email protected]::web /data/www/web --password-file=/etc/rsync.pas 注*/usr/local/webapps为客户端的目录,@前test是认证的用户名;IP后面www为rsync服务器端的模块名称。 Rsync 常用参数解析: -a, ––archive 归档模式,表示以递归方式传输文件,并保持所有文件属性。 ––exclude=PATTERN 指定排除一个不需要传输的文件匹配模式 ––exclude-from=FILE 从 FILE 中读取排除规则 ––include=PATTERN 指定需要传输的文件匹配模式 ––delete 删除那些接收端还有而发送端已经不存在的文件 -P 等价于 ––partial ––progress -v, ––verbose 详细输出模式 -q, ––quiet 精简输出模式 ––rsyncpath=PROGRAM 指定远程服务器上的 rsync 命令所在路径 ––password-file=FILE 从 FILE 中读取口令,以避免在终端上输入口令, 通常在 cron 中连接 rsync 服务器时使用 5.2.2 Rsync基于SSH同步 5.2.3 Rsync实时同步配置 Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 Rsync安装完毕后,需要安装inotify文件检查软件。同时为了同步的时候不需要输入密码,这样可以使用ssh免密钥方式进行同步。 安装inotify-tools-3.14.tar.gz软件,tar –xzf inotify-tools-3.14.tar.gz ;./configure ;make ;make install 即可。配置auto_inotify.sh同步脚本,内容如下: #!/bin/sh src=/data/webapps/www des=/home/webapps/ ip=192.168.0.11 inotifywait -mrq–timefmt ‘%d/%m/%y-%H:%M’ --format ‘%T %w%f’ -e modify,delete,create,attrib${src} | while read file do for i in $ip done 5.3 Tomcat/ResinJAVA服务器 5.3.1 Tomcat安装配置 配置java环境变量,vi /etc/profile 添加如下语句: exportJAVA_HOME=/usr/java/jdk1.6.0_18 exportCLASSPATH= C L A S S P A T H : CLASSPATH: CLASSPATH:JAVA_HOME/lib:$JAVA_HOME/jre/lib exportPATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:JAVA_HOME/jre/bin: P A T H : PATH: PATH:HOMR/bin source /etc/profile //使环境变量立刻生效。 java -version //查看java版本,显示版本为1.6.0_18,证明安装成功。 在官网下载tomcat相应版本,这里下载的版本为apache-tomcat-6.0.30.tar.gz,下载完后解压: tar -xzf apache-tomcat-6.0.30.tar.gz ;mvapache-tomcat-6.0.30 /usr/local/tomcat即可。 启动tomcat,命令为:/usr/local/tomcat_test/bin/startup.sh 查看ps -ef |grep tomcat 进程及端口是否存在,通过页面访问可以看到tomcat默认测试页面: 这个画面是默认网站,怎么来创建一个自己的网站页面呢,定义自己的发布目录,方法如下:在server.xml配置文件末尾加入如下行:(附截图) 在/data/webapps/www目录下,创建自己的jsp代码,重启tomcat即可访问。 5.3.2 Tomcat性能优化 Ø Linux内核的优化 Ø 服务器资源配置的优化 Ø Tomcat参数优化 Ø 配置负载集群优化 这里着重讲解tomcat参数的优化:server.xml文件,关闭DNS查询、配置最大并发等参数。 maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200 acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100 当然这些值都不是越大越好,需要根据实际情况来设定。可以基于测试的基础上来不断的调优分析。 Catalina.sh JVM参数优化,添加如下内容: CATALINA_OPTS="$CATALINA_OPTS –Xms4000M–Xmx4000M –Xmn1000M-XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=82 -DLOCALE=UTF-16LE -DRAMDISK=/ -DUSE_RAM_DISK=ture-DRAM_DISK=true" 配置多个tomcat实例,方法也很简单,只需要在服务器上cp多个tomcat,然后修改三个端口和发布目录即可,然后分别启动即可。 为了提升整个网站的性能,还需要在tomcat前面架设nginx web反向代理服务器,用以提高用户高速访问。 5.3.3 Resin安装配置 resin 普通版本和pro版本主要区别是 pro支持缓存和负载均衡。pro因为有强大的cache功能,独立作为web服务器处理静态页面性能都可以和apache有一比。但普通版本独立作为web服务器性能就要差一些。当然可以使用apache+resin的方案借助apache的缓存功能提高性能。 一般个人使用都使用开源免费版,如果想更高的性能,可以购买使用企业版resin,售后服务有保障。 wgethttp://www.caucho.com/download/resin-4.0.33.tar.gz tar –xzvf resin-4.0.33.tar.gz cdresin-4.0.33 &&./configure --prefix=/usr/local/resin –with-resin-log=/data/logs/resin/–with-java-home=/usr/java/jdk1.6.0_18/ make&&make install 安装完毕后,修改/usr/local/resin/conf/resin.xml配置文件发布目录,如图: 然后启动resin,/usr/local/resin/bin/resin.shstart 测试成功访问如下图(发布目录未修改之前resin默认测试页面): 5.3.4 Resin性能优化 Resin参数优化同样包括最大内存、最小内存,年轻带,最大并发,会话超时时间等。根据实际的应用来调节不同的参数。 5.3.5 Resin多实例配置 cd/usr/local/resin/conf下,然后cp resin.xml resin1.xml ;cp resin.xml resin2.xml 修改两个配置文件如下图所示: HTTP端口为8080 Resin1.xml 配置如下: HTTP端口为8081 Resin2.xml 配置如下: 创建两个发布目录mkdir -p /data/webapps/{www1,www2}写入测试jsp文件即可。最后如下方法启动两个resin实例: /usr/local/resin/bin/resin.sh -conf/usr/local/resin/conf/resin1.xml -server 1 start /usr/local/resin/bin/resin.sh -conf/usr/local/resin/conf/resin2.xml -server 2 start 真实环境,需要调整jvm参数,需要在resin.xml里面配置,同时需要开启启动resin,只需要把上述脚本加入/etc/rc.local即可。 5.4 NginxTomcat动静分离 动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。这样也是本次课程要讲解的,具体怎么来实现呢,如下图,通过location指定不同的后缀名实现不同的请求转发。 通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。 此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。 如下为nginx.conf里面server 配置段,直接添加在nginx.conf里即可。 ####www.wuguangke.cn server { listen 80; server_name www.wuguangke.cn; #配置发布目录为/data/www/wugk root /data/www/wugk; #动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡 #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。 expires 3d; #定义Nginx输出日志的路径 access_log /data/logs/nginx_wugk/access.log main; error_log /data/logs/nginx_wugk/error.log crit; } 真实环境网站程序包只有一个,需要把这个程序包在nginx前端放一份,同时需要在Tomcat、Resin后端也放置一份,如果服务器涉及数量很多,那每台服务器都需要更新,可以使用批量更新方法。 5.5 LNAMP高性能架构配置 Nginx处理静态文件能力很强,Apache处理动态文件很强而且很稳定,把二者综合在一块,性能提升很多倍。可能很多Linux SA在从事LNMP运维中,会发现PHP(FastCGI)模式会出现一些502错误的现象,这是因为Nginx+PHP(FastCGI)组合不稳定的原因造成的。 Ø 源码安装LNAMP之Nginx yum install prce-devel –y;cd /usr/src ;wget http://nginx.org/download/nginx-1.6.0.tar.gz ;cd nginx-1.6.0 ;./configure –prefix=/usr/local/nginx&& make &&make install Ø 源码安装LNAMP之Apache yum install apr-devel apr-util-devel –y; cd /usr/src ; wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz ;tarxzf httpd-2.2.27.tar.gz ;cd httpd-2.2.27;./configure --prefix=/usr/local/apache --enable-so --enable-rewrite&&make &&make install Ø 源码安装LNAMP之MySQL cd /usr/src ;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz ;tarxzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure --prefix=/usr/local/mysql–enable-assembler &&make &&make install 配置Mysql服务为系统服务: cp/usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf cp/usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld chkconfig --add mysqld cd /usr/local/mysql useradd mysql Ø 源码安装LNAMP之PHP cd /usr/src ;wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2 ;tarjxf php-5.3.28.tar.bz2 ;cd php-5.3.28;./configure --prefix=/usr/local/php5–with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql/ Ø 源码安装Apache+PHP整合 整合apache+php环境,修改httpd.conf配置文件,然后加入如下语句: LoadModule php5_modulemodules/libphp5.so (默认已存在) AddType application/x-httpd-php .php DirectoryIndex index.phpindex.html (把index.php加入index.html之前) 然后在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令: cat>>/usr/local/apache/htdocs/index.php < EOF 重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。 Ø 源码安装DISCUZ论坛 下载discuz源码包文件,然后解压: cd /usr/src ;wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip 解压discuz程序包:unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/ 重命名程序文件:cd/usr/local/apache/htdocs/ ;mv upload/* . 赋予discuz目录完全访问权限:cd /usr/local/apache/htdocs/ ;chmod 777 -R data/ uc_server/ config/uc_client/ 然后访问IP安装discuz论坛,如下图,选择“我同意” 进入如下界面,数据库安装,如果不存在则需要新建数据库并授权。 数据库创建及授权命令如下: create database discuz charset=utf8; grant all on discuz.* toroot@‘localhost’ identified by “123456”; 点击下一步,直至安装完成,进入等待已久的论坛画面: 自此LAMP环境整合并搭建成功,那如何使用Nginx来整合LAMP呢? Ø 源码安装Nginx+LAMP整合 先修改apache访问端口为8080,Nginx端口为80。 然后修改nginx配置文件:vi /usr/local/nginx/conf/nginx.conf,server配置段内容如下: (定义upstream均衡模块,配置动静分离,动态转发至apache,静态文件直接本地响应) upstream app_lamp { server 127.0.0.1:8080 weight=1max_fails=2 fail_timeout=30s; } server { { } } 测试,访问nginx ip+port如下图所示: 查看系统启动的端口及进程如下图: 自此,LNAMP全部整合完毕,接下来就是对系统内核、各个服务、架构进行优化,同样优化是一项长期的任务。 5.6 构建DNS域名解析服务器 那什么是DNS呢?简单的说就是完成域名到IP的解析过程。简洁的域名能让人们更方便记忆,不需要记那么长的IP访问某一个网站。 DNS解析过程到底是怎样的呢? 第一步:客户机访问某个网站,请求域名解析,首先查找本地HOSTS文件,如果有对应域名、IP记录,直接返回给客户机。如果没有则将该请求发送给本地的域名服务器: 第二步:本地DNS服务器能够解析客户端发来的请求,服务器直接将答案返回给客户机。 第三步:本地DNS服务器不能解析客户端发来的请求,分为两种解析方法 1、采用递归解析:本地DNS服务器向根域名服务器发出请求,根域名服务器对本地域名服务的请求进行解析,得到记录再给本地DNS服务器,本地DNS服务器将记录缓存,并将记录返给客户机。 2、采用迭代解析:本地DNS服务器向根域名服务器发出请求,根域名服务器返回给本地域名服务器一个能够解析请求的根的下一级域名服务器的地址,本地域名服务器再向根返回的IP地址发出请求,最终得到域名解析记录。 如上只是简单介绍了一下DNS相关知识,言归正传,那接下来我们正式来搭建一下DNS服务器。 首先安装bind,执行yum install bind* -y 安装完毕修改bind配置文件/etc/named.conf内容如下: options { }; logging { }; zone “.” IN { }; include “/etc/named.rfc1912.zones”; include"/etc/named.root.key"; #add named by wugk zone “wugk.com” IN { }; zone "188.92.182.in-addr.arpa"IN { }; Wugk.com.zone正向解析文件内容如下: $TTL 86400 @ IN SOA ns.wugk.com. root ( @ IN NS ns.wugk.com. ns IN A 182.92.188.163 www IN A 182.92.188.163 @ IN MX 10 mail.wugk.com. mail IN A 182.92.188.163 Wugk.com.arpa反向解析文件内容如下: $TTL 86400 @ IN SOA ns.wugk.com. root ( @ IN NS ns.wugk.com. 163 IN PTR mail.wugk.com. 163 IN PTR ns.wugk.com. 163 IN PTR www.wugk.com. 找一台客户端,PC或者其他服务器,将客户端的DNS修改为服务器端DNS,访问解析的域名能正常访问即证明DNS服务器搭建成功。 5.7 MySQL主从高可用架构 对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维、DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始人已独立出来自己重新开发了一个MariaDB,而且使用的人数越来越多。而且MariaDB兼容mysql所有的功能和相关参数。 Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢? MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT操作,MyISAM是更好的选择,支持表锁。 InnoDB提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。 Ø MySQL数据库主从复制原理 Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。 a) 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。 b) Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。) c) Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”; d) Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。 Ø MySQL数据库主从配置 环境准备:192.168.33.10为master主服务器,192.168.33.11为slave从服务器。 在主和从服务器都安装mysql相关软件,命令如下: yum install -y mysql mysql-devel mysql-server mysql-libs 安装完毕后,在Master修改vi /etc/my.cnf内容为如下: [mysqld] datadir=/data/mysql socket=/var/lib/mysql/mysql.sock user=mysql #Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-bin=mysql-bin server-id= 1 auto_increment_offset=1 auto_increment_increment=2 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid replicate-do-db =all 创建/data/mysql数据目录,mkdir –p /data/mysql ;chown –R mysqld:mysqld/data/mysql 启动mysql即可,/etc/init.d/mysqld restart 然后修改slave Mysql数据库my.cnf配置文件内容如下: [mysqld] datadir=/data/mysql socket=/var/lib/mysql/mysql.sock user=mysql #Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-bin=mysql-bin server-id =2 auto_increment_offset=2 auto_increment_increment=2 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid master-host=192.168.33.10 master-user=tongbu master-pass=123456 master-port=3306 master-connect-retry=60 replicate-do-db =all 在Master数据库服务器上设置权限,执行如下命令: grant replication slave on . to ‘tongbu’@’%’ identified by ‘123456’; 在Master 数据库执行如下命令: mysql> show masterstatus; ±-----------------±---------±-------------±-----------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB | ±-----------------±---------±-------------±-----------------+ | mysql-bin.000006| 98 | | | ±-----------------±---------±-------------±-----------------+ 1 row inset (0.00 sec) 然后在slave服务器指定master IP和同步的pos点: change master to master_host=‘192.168.33.10’,master_user=‘tongbu’,master_password=‘123456’,master_log_file=‘mysql-bin.000006’,master_log_pos=98; 在slave启动slave start,并执行show slave status\G查看Mysql主从状态: Slave_IO_Running: Yes Slave_SQL_Running: Yes两个状态为YES,代表slave已经启动两个线程,一个为IO线程,一个为SQL线程。 然后在Master服务器创建一个数据库和表,命令如下: 然后去slave服务器查看是否有mysql_ab_test数据库和相应t0的表,如果存在则代表Mysql主从同步搭建成功: 同样还可以测试在master服务器插入两条数据,在slave查看insert数据是否已同步: 128 master上执行如下图: 129 slave上执行如下图,在master插入的数据已经同步到slave上: 自此Mysql主从搭建完毕,现在有一个问题,如果master服务器down机了,如何快速恢复服务呢? 可以通过两种方法: 第一种方法,如果程序连接的是master的IP,直接在slave服务器上添加master的IP即可。这个手动去操作,而且需要花费时间比较长,可能还会出现误操作的情况,不推荐。 第二种方法,可以使用keepalived、heartbeat作为HA检测软件,检查MySQL服务是否正常,不正常则自动切换到slave上,推荐使用。 Ø MySQL+keepalived高可用配置 继上一章节MySQL主从配置完毕后,接着配置keepalived服务,主要用于Mysql故障自动切换。那说到keepalived,keepalived到底是什么呢? keepalived是一个类似于layer3, 4& 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。 Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。 Keepalived安装配置: tar zxfkeepalived-1.2.1.tar.gz cd keepalived-1.2.1 &&./configure–with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686 &&make&& make install DIR=/usr/local/;cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp$DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p/etc/keepalived cp$DIR/sbin/keepalived /usr/sbin/ 修改Master服务器上keepalived.conf配置如下,vi/etc/keepalived/keepalived.conf ! ConfigurationFile for keepalived global_defs{ notification_email { } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } #VIP1 vrrp_instanceVI_1 { } virtual_server192.168.33.100 3306 { } Mysql 从服务器配置keepalived.conf跟master一样,只需要把Realserver IP修改成real_server 192.168.33.11 ;优先级从100改成90即可。 在master、slave数据库上创建/data/sh/mysql.sh脚本,内容为: pkill keepalived 然后分别重启两台数据库上keepalived服务即可。最后测试停止master Mysql服务,是否会自动切换到Backup上。 关于Mysql集群高可用就在此告一段落,当然除了keepalived高可用之外,Mysql优化还可以进行读写分离、Mysql+DRBD、拆分表等等优化,有兴趣的童鞋可以继续深入研究。 5.8 LVS+Keepalived负载均衡 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。 LVS 简单工作原理:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。对于用户来说,看不到WEB后端具体的应用。 LVS转发方式有三种,分别是NAT、DR、TUN模式,常用算法:RR、LC、WRR、WLC模式等(RR为轮询模式,LC为最少连接模式) LVSNAT原理:用户请求LVS到达director,director将请求的报文的目标地址改成后端的realserver地址,同时将报文的目标端口也改成后端选定的realserver相应端口,最后将报文发送到realserver,realserver将数据返给director,director再把数据发送给用户。(两次请求都经过director,所以访问大的话,director会成为瓶颈) LVSDR原理:用户请求LVS到达director,director将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变), 源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver检测到目标为自己本地IP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户。(此种转发效率最高) LVSTUN原理:跟LVS DR类似,也是改变封装MAC地址,多了一层隧道加密。实施环境复杂,比LVS DR模式效率略低。 Ø LVS环境安装配置 下载LVS所需软件ipvsadm-1.2.4.tar.gz软件,编译安装: wget -c http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz ln -s/usr/src/kernels/2.6.* /usr/src/linux //IPVS模块编译进内核里,需要做软连接 tar xzvfipvsadm-1.24.tar.gz &&cd ipvsadm-1.24 && make && make install LVS安装完毕之后,需要进行配置,配置的步骤有两步,第一步为定义端口服务,第二步为添加realserver后端服务。 ipvsadm -A -t192.168.33.188:80 -s rr ipvsadm -a -t192.168.33.188:80 -r 192.168.33.12 -m -w 2 ipvsadm -a -t192.168.33.188:80 -r 192.168.33.13 -m -w 2 参数说明: -A 增加一台虚拟服务器地址。 -t 虚拟服务器提供的是tcp服务。 -s 使用的调度算法。 -a 在虚拟服务器中增加一台后端真实服务器。 -r 指定真实服务器地址。 -m 设置当前转发方式为NAT模式;-g为直接路由模式;-i 模式为隧道模式。 -w 后端真实服务器的权重。 查看LVS转发列表命令为:ipvsadm –Ln 我们会发现,如果这台LVS发生突发情况,down机了,那后端所有的应用程序都访问不了。如何避免这种问题呢,这里需要用到故障切换,也就是如果有一台备用的LVS就好了,主down了,自动切换到从,怎么实现这个需求,接下来讲解的keepalived软件就是专门用来做故障检测及切换的。 Keepalived基于三层检测(IP层,TCP层,及应用层),主要用于检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived检测到并将有故障的web服务器从系统中剔除; 当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。 需要注意一点,如果使用了keepalived.conf配置,就不需要再执行ipvs –A命令去添加均衡的realserver命令了,所有的配置都会在keepalived.conf里面,一个配置文件搞定所有,即只需要安装ipvs模块。 Ø Keepalived安装配置 官方下载keepalived相应稳定版本: cd /usr/src ;wget -c http://www.keepalived.org/software/keepalived-1.1.15.tar.gz tar -xzvf keepalived-1.1.15.tar.gz&&cd keepalived-1.1.15 && ./configure && make&& make install 安装完毕,配置keepalived服务为系统服务。 DIR=/usr/local/ cpKaTeX parse error: Expected 'EOF', got '&' at position 50: …c/rc.d/init.d/ &̲& cpDIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p /etc/keepalived&& cp $DIR/sbin/keepalived /usr/sbin/ 在MASTER上/etc/keepalived/目录创建keepalived.conf配置文件,并写入如下内容: ! Configuration File forkeepalived global_defs { notification_email { } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { } virtual_server192.168.33.188 80 { } 如上配置文件,红色标记的地方需要注意,state状态主服务器设置MASTER,从设置为BACKUP,优先级备机设置比MASTER小,例如设置90,使用TCP端口检测。 在LVS BACKUP服务器写入如下配置,需要注意的是客户端的配置要修改优先级及状态: ! Configuration Filefor keepalived global_defs { notification_email { } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 lvs_sync_daemon_inteface eth0 virtual_router_id 51 priority 90 advert_int 5 authentication { } virtual_ipaddress { } } #REAL_SERVER_1 virtual_server 192.168.33.11 80 { delay_loop 6 lb_algo wlc lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.33.130 80 { } #REAL_SERVER_2 real_server 192.168.33.131 80 { } } 如上设置,LVS 主备配置完毕,接下来需要在realserver配置LVS VIP,为什么要在realserver绑定VIP呢? 客户端访问director的VIP,director接收请求,将通过相应的算法将请求转发给相应的realserver。在转发的过程中,会修改请求包的目的mac地址,目的ip地址不变。 Realserver接收请求,并直接响应客户端。这时便出现一个问题,director此时与realserver位于同一个网络中,当director直接将请求转发给realserver时,realserver检测到该请求包的目的ip是vip而并非自己,便会丢弃,而不会响应。为了解决这个问题,所以需要在所有Realserver上都配上VIP。 为什么一定要配置在lo接口上呢? 在realserver上的lo口配置VIP,这样限制了VIP不会在物理交换机上产生MAC地址表,从而避免IP冲突。 客户端启动Realserver.sh脚本内容: #!/bin/sh #LVSClient Server VIP=192.168.33.188 case $1 in start) ;; stop) ;; *) ;; esac LVS网站故障排查经验: 如果发现主网站无法访问,首先第一步ping网站域名是否能ping通,如果域名无法访问,试着使用IP能不能访问,如果IP能访问,首先排查到域名解析问题。 如果IP也无法访问,登录LVS服务器,使用命令ipvsadm –Ln 查看当前连接状态和查看/var/log/messages日志信息,可以在LVS上访问realserver ip,进行排查。 如果LVS服务正常,后端realserver服务异常,然后查看nginx日志信息,是否有大量恶意访问,临时重启看是否能访问。 如果有恶意ip访问,找出恶意ip,经确认可以关闭后,使用iptables防火墙临时关闭即可。 LVS+keepalived+Nginx+Apache+PHP+MySQL+Memcached+Redis 5.9 Squid缓存服务器配置 Squidcache(简称为Squid)是一个流行的自由软件,它符合GNU通用公共许可证。Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据并进行缓存,也可以用在局域网中,使局域网用户通过代理上网。Squid主要设计用于在Linux一类系统运行。 简单的来说就是:用户请求www网站,经过squid,squid检查本地硬盘目录有没有这个文件的缓存;如果没有,squid则去后端真实web服务器获取该页面,返回给用户,同时在自己本地缓存一份,如果另外一个用户再访问同样请求页面时,squid直接从本地返回。 squid有 ufs, aufs, coss, diskd, null 五种存储机制,其中 ufs,aufs, diskd 都是在文件系统上面保存很多小文件, coss 是 squid 自己实现了一个简单的文件系统,可以使用一个大文件或者一个磁盘设备来存储。null 则是给不想要磁盘缓存的情况准备的,coss 看起来好像很不错, 但是以前试验并不足够稳定,因此并不推荐使用。 对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用 aufs。 Ø 正式安装squid 安装squid也非常简单,可以用源码安装,也可以使用rpm、yum安装,这里使用yum安装,根据实际经验使用,squid 2.6系列的squid比较稳定,可以考虑采用。 CentOS5.8上yum安装squid 2.6方法: yum install -y squid 其他系统源码安装squid 2.6.24版本:squid-2.6.STABLE24.tar.bz2 tar -jxfsquid-2.6.STABLE24.tar.bz2 ;cd squid-2.6.STABLE24 ./configrue–prefix=/usr/local/squid/ --enable-storeio=ufs,diskd ;make ;make install 源码安装的配置文件内容如下: http_port 80 accelvhost vport cache_peer192.168.33.12 parent 80 0 originserver name=wugk1 cache_peer192.168.33.13 parent 80 0 originserver name=wugk2 cache_peer_domain wugk1www.wugk1.com cache_peer_domain wugk2www.wugk2.com visible_hostnamelocalhost forwarded_for off via off cache_vary on acl manager protocache_object acl localhost src 127.0.0.1/32 acl to_localhost dst127.0.0.0/8 0.0.0.0/32 acl localnet src10.0.0.0/8 acl localnet src172.16.0.0/12 acl localnet src192.168.0.0/16 acl all src 0.0.0.0/0 acl CONNECT methodCONNECT http_access allowmanager localhost http_access deny manager http_access allowlocalnet http_access allowlocalhost http_access allow all acl PURGE method PURGE http_access allow PURGElocalhost http_access deny PURGE cache_mem 1000 MB maximum_object_size 8MB maximum_object_size_in_memory256 KB hierarchy_stoplistcgi-bin ? coredump_dir/usr/local/squid/var/cache refresh_pattern^ftp: 1440 20% 10080 refresh_pattern^gopher: 1440 0% 1440 refresh_pattern -i(/cgi-bin/|?) 0 0% 0 refresh_pattern .(jpg|png|gif|mp3|xml|html|htm|css|js)1440 50% 2880 ignore-reload refresh_pattern. 0 20% 4320 Yum安装squid.conf配置文件,内容如下: http_port 80 accel vhost vport cache_peer 192.168.33.130 parent 80 0originserver name=wugk1 cache_peer 192.168.33.131 parent 80 0originserver name=wugk2 cache_peer_domain wugk1 www.wugk1.com cache_peer_domain wugk2 www.wugk2.com visible_hostname localhost forwarded_for off via off cache_vary on #acl config acl manager proto cache_object acl localhost src 127.0.0.1/32 acl to_localhost dst127.0.0.0/8 0.0.0.0/32 acl localnet src10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 #RFC1918 possible internal network acl localnet src 192.168.0.0/16 #RFC1918 possible internal network acl SSL_ports port 443 acl Safe_ports port 808080 # http acl Safe_ports port21 # ftp acl Safe_ports port443 # https acl all src 0.0.0.0/0 acl CONNECT method CONNECT http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localnet http_access allow localhost http_access allow all acl PURGE method PURGE http_access allow PURGE localhost http_access deny PURGE #squid config 2014-03-25 cache_dir aufs /data/cache1 10240 16256 cache_mem 4000 MB maximum_object_size 8 MB maximum_object_size_in_memory 256 KB hierarchy_stoplist cgi-bin ? coredump_dir /var/spool/squid refresh_pattern^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|?)0 0% 0 refresh_pattern.(jpg|png|gif|mp3|xml|html|htm|css|js) 1440 50% 2880 ignore-reload refresh_pattern. 0 20% 4320 Ø Squid参数详解 #vhost和vport表示支持虚拟主机和虚拟端口,如果再加上transparent表示支持透明代理 http_port 80 accel vhost vport #cache_peer表示如果本机缓存中找不到客户端请求的数据,则与后端主机联系,以parent类型进行联系; 使用HTTP协议进行联系,联系端口是80,orginserver表示此服务器是源服务器,name表示别名。 cache_peer 192.168.33.10 parent 80 0originserver name=wugk1 cache_peer 192.168.33.11 parent 80 0originserver name=wugk2 #设置别名所对应的域名,如果cache_peer中使用域名而不是IP的话; 那么cache_peer_domain中一定要用相同的域名,否则无法访问。 cache_peer_domain wugk1 www.wugk1.com cache_peer_domain wugk2 www.wugk2.com #设置缓存服务器名称 visible_hostname localhost forwarded_for off via off cache_vary on #acl config acl manager proto cache_object acl localhost src 127.0.0.1/32 acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918possible internal network acl SSL_ports port 443 acl Safe_ports port 80 8080 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl all src 0.0.0.0/0 acl CONNECT method CONNECT http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localnet http_access allow localhost ##设置访问控制,允许所有客户端访问上面设置的两个网站 http_access allow all #支持purge方式清除缓存 acl PURGE method PURGE http_access allow PURGE localhost http_access deny PURGE #squid config 2014-03-25 #设置缓存文件夹的路径和参数,缓存机制为aufs,10240表示10G,目录下面分为16级,每级有256个目录 cache_dir aufs /data/cache1 10240 16 256 #设置缓存内存大小,最大内存为4g cache_mem 4000 MB #设置硬盘中可缓存的最大文件大小 maximum_object_size 8 MB #设置内存中可缓存的最大文件大小 maximum_object_size_in_memory 256 KB hierarchy_stoplist cgi-bin ? #当squid突然挂掉的时候,或者突然出现什么故障的时候,将squid在内存中的资料写到硬盘中 coredump_dir /var/spool/squid # #refresh_pattern用于确定缓存的类型,缓存过期时间,及百分比。 #如果希望内容缓存cache后不删除,直到被主动用purge清除,可以加ignore-reload选项 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|?) 0 0% 0 refresh_pattern.(jpg|png|gif|mp3|xml|html|htm|css|js) 1440 50% 2880 ignore-reload refresh_pattern . 0 20% 4320 Squid常用命令使用: Squidclient可以用来清理squid缓存,查看squid状态等功能。 使用方法: squidclient -p 80 -m PURGE http://www.wugk1.com/static/image/common/nv_a.png 查看缓存命中率:squidclient -p 80mgr:info |egrep “(Request Hit Ratios|Byte Hit Ratios)” vi /etc/security/limits.conf soft nproc 65535 hard nproc 65535 soft nofile 65535 hard nofile 65535 为了防止失控的进程破坏系统的性能,Unix和Linux跟踪进程使用的大部分资源,允许用户和系统管理员使用对进程的资源限制,设置的限制有两种: 硬限制和软限制: hard硬限制是可以在任何时候任何进程中设置 但硬限制只能由超级用户修改。 soft软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值,(noproc)最大线程数和(nofile)文件数。 vi /etc/sysctl.conf net.ipv4.tcp_max_tw_buckets = 6000 timewait的数量,默认是180000。 net.ipv4.ip_local_port_range = 1024 65000 允许系统打开的端口范围。 net.ipv4.tcp_tw_recycle = 1 启用timewait快速回收。 net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。 net.ipv4.tcp_syncookies = 1 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。 net.core.somaxconn = 262144 web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。 net.core.netdev_max_backlog = 262144 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.ipv4.tcp_max_orphans = 262144 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。 net.ipv4.tcp_max_syn_backlog = 262144 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。 net.ipv4.tcp_timestamps = 0 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。 net.ipv4.tcp_synack_retries = 1 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。 net.ipv4.tcp_syn_retries = 1 在内核放弃建立连接之前发送SYN包的数量。 net.ipv4.tcp_fin_timeout = 1 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。 net.ipv4.tcp_keepalive_time = 30 当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。 完整的内核优化脚本: net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter= 1 net.ipv4.conf.default.accept_source_route= 0 kernel.sysrq = 0 kernel.core_uses_pid =1 net.ipv4.tcp_syncookies= 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_max_tw_buckets= 10000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling= 1 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 16384 4194304 net.core.wmem_default= 8388608 net.core.rmem_default= 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog= 262144 net.core.somaxconn = 262144 net.ipv4.tcp_max_orphans= 3276800 net.ipv4.tcp_max_syn_backlog= 262144 net.ipv4.tcp_timestamps= 0 net.ipv4.tcp_synack_retries= 1 net.ipv4.tcp_syn_retries= 1 net.ipv4.tcp_tw_recycle= 1 net.ipv4.tcp_tw_reuse= 1 net.ipv4.tcp_mem = 94500000915000000927000000 net.ipv4.tcp_fin_timeout= 1 net.ipv4.tcp_keepalive_time= 30 net.ipv4.ip_local_port_range= 1024 65530 net.ipv4.icmp_echo_ignore_all= 1 Ø net.ipv4.tcp_max_tw_buckets错误: Sep23 04:45:54 localhost kernel: possible SYN flooding on port 80. Sendingcookies. Sep 23 04:45:55localhost kernel: TCP: time wait bucket table overflow Sep 23 04:45:55localhost kernel: TCP: time wait bucket table overflow Sep 23 04:45:55localhost kernel: TCP: time wait bucket table overflow Sep 23 04:45:55localhost kernel: TCP: time wait bucket table overflow Sep 23 04:45:55localhost kernel: TCP: time wait bucket table overflow Sep 23 04:45:55localhost kernel: TCP: time wait bucket table overflow 如上错误是由于net.ipv4.tcp_max_tw_buckets设置过小导致,如果内核有如上错误,我们需要增加net.ipv4.tcp_max_tw_buckets的值。 Ø Too many open files错误: 如果后台报错,大量的too many openfiles错误,一般主要是JAVA应用出现这类错误比较多。我们需要设置内核打开文件最大数。 ulimit -SHn 51200 临时生效,如果想永久生效,需要写入到系统内核里面: vi /etc/security/limits.conf soft nproc 65535 hard nproc 65535 soft nofile 65535 hard nofile 65535 然后exit退出,重新登录即生效,也可以写在/etc/profile文件里。 upstream tdt_wugk { } 1、upstream的 fail_timeout和max_fails,用来判断负载均衡upstream中的某个server是否失效。在fail_timeout的时间内,nignx与upstream中某个server的连接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。 2、fail_timeout默认为10秒,max_fails默认为1。是指在10秒内nginx与后端server连接失败一次,如果在10秒内nginx与后端的连接失败达到一次,nginx认为这个server已失效,在接下来的10秒内,nginx将不会分发请求到这台后端。 3、如果max_fails=0,即关闭后端服务器健康检查,如果权重一样,那么每次请求都会有机会发到后端不可用的服务器。另外,fail_timeout设置的时间对响应时间没影响,这个响应时间是用接下来的proxy_connect_timeout和proxy_read_timeout来控制。 4、proxy_connect_timeout nginx与后端连接的超时时间,单位为秒,默认为60秒。我们在nginx错误日志里面看到的(110: Connection timedout),就是指nginx与后端连接已经超时。 5、proxy_read_timeout 建立连接后,nginx等候读取后端服务器响应的时间,默认为60秒。在一些比较繁忙的后端,比如线程数经常达到峰值了的tomcat,这个值注意不要设得太低,虽然线程数已经用光,但请求已经进入待队列之中。 6、proxy_send_timeout nginx转发请求到后端的超时时间,默认为60秒,在这段时间内nginx没将请求数据发到后端将关闭连接。这个在网站有比较多像表单(post)之类的需要留意一下. 7、keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要等待keepalive_timeout秒后,才开始关闭这个连接。 worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数。 worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000; 为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。 worker_rlimit_nofile 102400; 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。 use epoll; 使用epoll的I/O模型。 worker_connections 102400; 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。 keepalive_timeout 60; keepalive超时时间。 client_header_buffer_size 4k; 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。 open_file_cache max=102400 inactive=20s; 这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。 open_file_cache_valid 30s; 这个是指多长时间检查一次缓存的有效信息。 open_file_cache_min_uses 1; open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。 浏览器缓存(Browser Caching) 是为了加速浏览并节约网络资源,浏览器在用户磁盘上对最近请求过的文档进行存储。 nginx可以通过expires 指令来设置浏览器的Header。 Expires 指令设置: location~ .(gif|jpg|jpeg|png|bmp|ico|txt|png|js|css|swf|doc)${ } 当文件被创建,修改和访问时,Linux系统会记录这些时间信息。当系统的读文件操作频繁时,记录文件最近一次被读取的时间信息,将是一笔不少的开销。 所以,为了提高系统的性能,可以在读取文件时不修改文件的atime属性。可以通过在加载文件系统时使用notime选项来做到这一点。 当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。 一般添加在/etc/fstab里面,如下配置: tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults,noatime 0 0 对于第一个问题: 随着互联网飞速的发展,用户对网站体验各方面都要求很高,所以作为网站底层承载的linux系统来说,得到大批量的应用,可以说大中型互联网公司Linux在服务器领域已经占到7-80%,而且Android手机也是基于Linux来研发定制的。未来Linux会在各行各业得到普遍的应用。 这里讨论Linux运维,如果是Linux开发的话,薪资更高,所以只要你技术熟练、精通,薪资根本不是问题,初级薪资一般都在4-5K以上,中间6-8K,高级Linux运维薪资一般都在10K+。对应Linux岗位管理方面薪资则20K+左右。所有不要再问能给有多少钱,关键是你有多熟练,你的能力在哪里? 从Linux运维领域来说,可以努力学习的方向有: 熟练Linux系统的性能优化、网络日常管理。 高性能集群架构部署及优化等。 大并发网站运维及管理。 Mysql、Oracle数据库集群管理。 自动化运维平台开发与管理 网站架构GSLB、CDN缓存等。 一个行业要想熟练、甚至精通至少要花上5-10年的时间,做一件事重在专一,即使现在不会,只要每天进步一点点,每天实践一点点,改变一点点,相信未来更美好。只有专注才能成功。 面试技巧总结 通过这样一个完整的Linux高级运维的学习,我们了解了目前企业里面使用的技术和架构信息,那接下来我们来总结一下企业一般问什么问题?以及面试的过程中要注意哪些细节? 总结日常面试的技巧(以正式讲课为准): 首先穿着要得体,最好标准的职业装面试,不能随意穿着;简单一点就是要让人一看你,就感觉清爽、能干、有活力。 要准备充分,尽量提前15分钟到面试公司,提前翻阅资料了解公司的简单背景及相关文化。 保持微笑,不要太古板,要随和,保持心态放松,不要抢话抢答;要懂礼貌,有时候细节决定成败。 在回答问题上要简单明了,不要阐述一个问题绕来绕去,把自己都绕迷糊了;要说到恰到好处。该回答的回答,不该说尽量别说,做到有的放矢。 要保持谦逊,遇到不会的题目,不知道就是不知道,不要非懂装懂; 面试通常开始会让你做自我介绍,自我介绍说些什么?多长合适? 一般自我介绍,就介绍自己叫什么名字,毕业时间学校,已经之前工作经验,自己比较熟练的技能和自己的性格和优点等等;注 介绍完毕,最后说声介绍完毕,谢谢。 面试要有自信,不要低着头,面试是双向的,你选择公司,公司也在选择你。机会是非常的多的,关键是看你自己是否能把握住,是否之前已经准备好。 面试的心态一定要保持平静,不要因为一次面试不上,就觉得自己到处都是缺点,要总结自己上次面试的不足,然后下一次改变掉,相信坚持不懈一定能找到满意的工作。 最后总结一点,做什么事情自信很重要,相信自己可以做到,然后勇敢的去做,结果一定让你倍感惊喜。 面试题目总结 你平时在公司主要做什么? 你们原来公司的网站架构是怎样的? 你对哪一块比较熟练或者精通? Squid、varnish等缓存服务器维护过吗?squid缓存代理的原理是什么?缓存命中率怎么查看及清空缓存? LVS的工作原理是什么?有哪些算法? Nginx日常的优化的参数都有哪些?Nginx动静分离做过吗?描述简单的步骤。 Linux内核优化,你都优化哪些参数? 你在维护网站的过程中,曾经遇到过什么重大的问题?怎么解决的? Shell编程熟练吗?编写一个自动化备份Mysql数据库的脚本? Mysql主从架构的原理是什么?如果主从不同步,报错了,怎么恢复? 如果备份大数据Mysql数据文件?Mysql优化有哪些步骤? FTP主被动模式的区别是什么? Apache两种工作模式的区别及优化? Nagios、cacti维护过吗?平时都监控些什么? 你们公司的网络出口带宽是多少?每天网站的PV、UV是多少? 你觉得Linux运维工程师的职责是什么? 你为什么离职,离职的原因是什么? 你未来5-10年的职业规划是什么样的?
作为一名Linux SA,日常最重要的就是保证网站正常稳定的运行,我们需要实时监控网站、服务器的运行状态,这时需要借助开源软件(cacti、nagios、zabbix等)监控来实现。
Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。
use local-service
host_name 192.168.33.10
service_description Swap Usage
check_command check_swap!20!10
}
command_namecheck_nrpe
command_line$USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
use local-service
host_name 192.168.33.10
service_description Current Load
check_command check_nrpe!check_load
}
command_name check_http_word
command_line $USER1$/check_http-I $HOSTADDRESS$ -u
}
如上配置完毕后,重启nagios服务,可以测试关闭某个服务,过一会就会收到nagios发来的报警邮件。
自此,Nagios相关的配置就到此为止,当然有兴趣的童鞋还可以进一步研究,例如nagios跟cacti如何整合,nagios如何优化等等。
随着公司业务不断增加,经常需要采购新服务器,并要求安装Linux系统,并且要求Linux版本要一致,方便以后的维护和管理,每次人工安装linux系统会浪费掉更多时间,如果我们有办法能节省一次一次的时间岂不更好呢?
配置kickstart,可以使用system-kickstart系统软件包来配置,也可以直接拷贝/root/目录下anaconda-ks.cfg 重命名为ks.cfg,并把ks.cfg拷贝至刚共享的/centosinstall目录下,赋权限为chmod 777 ks.cfg
Kickstart file automatically generated by anaconda.
parted -s /dev/sdb mklabel gpt
%end
— default gateway
Linux编程篇
4.1.1 Shell编程简介
shell是操作系统的最外层。shell合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。
Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。
在Linux Shell编程中,if、for、while、case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。下面将逐个来讲解具体的用法:echo “This DIR isexist,Please exit …..”
if [[ $scores -gt 85 ]]; then
echo “very good!”;
elif [[ $scores -gt 75 ]]; then
echo “good!”;
elif [[ $scores -gt 60 ]]; then
echo “pass!”;
else
echo “no pass!”;
fi;#!/bin/sh
for i in `seq 15`
do
echo “NUM is $i”
done
#!/bin/sh
for i in `find /var/log -name “*.log”`
do
tar–czf 2014log.tgz $i
done
pattern1)
语句1
;;
pattern2)
语句2
;;
*)
语句3
;;
monitor_log)
monitor_log
;;
archive_log)
archive_log
;;
* )
echo "Usage:{$0 monitor_log |archive_log |help }"
;;
a) 自动删除test.txt文件脚本date+%Y-%m-%d
date+%Y%m%d
Mkdir –p $DES_DIR
find $SRC_DIR -name “*.log”
tar czf $i.tgz $i
tail-n 1000 /var/log/secure |grep "Failed password"| egrep-o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort -nr | uniq -c|awk ' $1>=4 {print $2}'
echo$IP_ADDR
#查看iptables配置文件是否含有提取的IP信息
cat$IPTABLE_CONF |grep $i >/dev/null
[$? -ne 0 ];then
#判断iptables配置文件里面是否存在已拒绝的ip,如何不存在就不再添加相应条目
sed-i "/lo/a -A INPUT -s $i -m state --state NEW -m tcp -p tcp --dport22 -j DROP" $IPTABLE_CONF
#如何存在的话,就打印提示信息即可
echo "Thisis $i is exist in iptables,please exit ......"
数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n"" "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk'{print $1}'
ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n"" "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk'{print $2}'
ifconfig eth0 |egrep "HWaddr|Bcast" |tr"\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e's/Mask://g'|awk '{print $3}'
route -n|grep "UG"|awk '{print $2}'
Linux深入篇
nginx [engine x]是Igor Sysoev编写的一个HTTP和反向代理服务器,另外它也可以作为邮件代理服务器。它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括Yandex、Mail.Ru、VKontakte,以及Rambler。
首先需要安装pcre库,然后再安装Nginx:
在真实的服务器环境,为了充分利用服务器资源,一台nginx web服务器同时会配置N个虚拟域名主机,即多个域名对于同样一个80端口。然后服务器IP数量很多,也可以配置基于多个IP对应同一个端口。 listen 80;
server_name www.a.com;
#access_log logs/host.access.log main;
location / {
root html/a;
index index.html index.htm;
}
listen 80;
server_name www.b.com;
#access_log logs/host.access.log main;
location / {
root html/b;
index index.html index.htm;
}
随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数。
Nginx常用配置参数有upstream,主要用于均衡后端多个实例:
server 10.10.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.10.1.12:8080 weight=1 max_fails=2fail_timeout=30s;
Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说为了美观或者对搜索引擎友好,提高收录量及排名等。
Rsync是Unix/Linux下的一款应用软件,利用它可以使多台服务器数据保持同步一致性,第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。
下面正式来配置Rsync服务器,模拟真实环境服务器数据同步。启动服务器端RSYNC主进程,/usr/local/rsync/bin/rsync --daemon ,监听端口TCP 873
除了可以使用rsync密钥进行同步之外,还有一个比较简单的同步方法就是基于linux ssh来同步。具体方法如下:rsync -aP --delete [email protected]:/data/www/webapps /data/www/webapps ,如果想每次同步不输入密码,需要做Linux主机之间免密码登录。
在企业日常web应用中,某些特殊的数据需要要求保持跟服务器端实时同步,那我们该如何来配置呢?如何来实现呢?这里可以采用rsync+inotify来实现需求。 do
/usr/local/rsync/bin/rsync -aP --delete $src root@$ip:$des
done
在服务器端后台启动该脚本,nohup sh auto_inotify.sh & ,在服务器端目录新建或者删除,客户端都会实时进行相关操作。
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,Tomcat本身也是一个HTTP服务器,可以单独使用,apache是一个以C语言编写的HTTP服务器。Tomcat主要用来解析JSP语言。目前最新版本为8.0。
安装tomcat之前需要安装jdk (Java Development Kit) 是 Java 语言的软件开发工具包(SDK)),这里选择jdk-6u18-linux-x64-rpm.bin,bin文件安装跟sh文件方法一样,sh./ jdk-6u18-linux-x64-rpm.bin,回车即可,默认安装到/usr/java/jdk1.6.0_18目录下。
线上环境使用默认tomcat配置文件,性能很一般,为了满足大量用户的访问,需要对tomcat进行参数性能优化,具体优化的地方如下: protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="5000"
minSpareThreads="20"
acceptCount="1000"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />
Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发。
Resin同tomcat一样,都需要优化JVM参数,resin的JVM参数配置在resin.xml里面,配置最大最小内存,会话保持时间及并发数等如下所示:
为了资源最大利用,单台服务器可以配置多个resin实例,配置resin多实例的方式跟tomcat大部分一致,但还有一些区别:
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat、Resin出来动态页面。indexindex.html index.htm;
location/
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tdt_wugk;
expires 3d;
}
location~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tdt_wugk;
}
location~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root/data/www/wugk;
#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
}
LNAMP(Linux+Nginx+Apache+Mysql+PHP)架构受到很多IT企业的青睐,取代了原来认为很好的LNMP(Linux+Nginx+Mysql+PHP)架构,那我们说LNAMP到底有什么优点呢,还得从Nginx和apache的优缺点说起。
chkconfig --level 345 mysqld on
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql var
/usr/local/mysql/bin/mysqld_safe --user=mysql & listen 80;
server_name localhost;
location / {
root /usr/local/apache/htdocs;
index index.php index.html index.htm;
}
location ~ .*\.(php|jsp|cgi)?$
proxy_set_header Host $host;
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_pass http://app_lamp;
location ~.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /usr/local/apache/htdocs;
expires 3d;
}
我们每天打开的网站,他是如何来解析,并且我们怎么能得到网站的内容反馈的界面呢?那什么是DNS呢(DNS(Domain Nameservice,域名服务,主要用于因特网上作为域名和IP地址相互映射)那今天我们将来学习DNS服务器的构建,DNS服务可以算是Linux服务中比较难的一个了,尤其是配置文件书写,少一个字符都有可能造成错误。
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file"/var/named/data/named_stats.txt";
memstatistics-file"/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file"/etc/named.iscdlv.key";
managed-keys-directory"/var/named/dynamic";
channel default_debug {
file"data/named.run";
severity dynamic;
};
type hint;
file "named.ca";
type master;
file "wugk.com.zone";
allow-update { none; };
type master;
file "wugk.com.arpa";
allow-update { none; };
42 ; serial
3H ; refresh
15M ; retry
1W ; expire
1D ) ; minimum
42 ; serial
3H ; refresh
15M ; retry
1W ; expire
1D ) ; minimum
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司, 目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。随着访问量的不断增加,Mysql数据库压力不断增加,需要对mysql进行优化和架构改造,可以使用高可用、主从复制、读写分离来、拆分库、拆分表进行优化。下面我们来学习MySQL主从复制高可用如何来实现。
[email protected]
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 151
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.33.100
}
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.33.10 3306 {
weight 100
notify_down /data/sh/mysql.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
Ø LVS简介及工作原理 [email protected]
VIP1
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.33.188
}
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.33.12 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.33.13 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
VIP1
auth_type PASS
auth_pass 1111
192.168.33.11
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
ifconfig lo:0 $VIP netmask 255.255.255.255broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
exit 0
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped OK"
exit 1
echo "Usage: $0 {start|stop}"
随着网站访问人数越来越多,对体验的要求也越来越高,网站承受的并发和压力也越来越大,所以需要对网站和架构进行优化,优化的策略有很多,系统内核、程序、配置均衡、加入缓存等,目前主流缓存服务器主要有squid、varnish、nginx_cache,那今天我们来讨论使用老牌Squid对架构进行缓存优化。
*取得squid运行状态信息: squidclient -p80 mgr:info
*取得squid内存使用情况: squidclient -p80 mgr:mem
*取得squid已经缓存的列表: squidclient -p80 mgr:objects
*取得squid的磁盘使用情况: squidclient -p80 mgr:diskd
*强制更新某个url:
Nginx 是目前主流的WEB服务器发布软件,不仅可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动静分离,可以按照轮询、ip_hash、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。server 10.10.141.32:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.10.141.32:8081 weight=1 max_fails=2 fail_timeout=30s;
expires30d;
对于从事Linux岗位的童鞋们,最关注的问题莫过于这个行业到底怎么样,能不能挣钱?我以后能做什么?
Linux运维面试总结
通过全面具体的学习,我们已经正式遨游进入了Linux运维世界,接下来我们就需要正式的找一份Linux岗位的工作,很多人谈到找工作就害怕,为什么呢,害怕面试不上、面试紧张、知识准备不充分等等。
通过不断的面试,我们会总结到更多的知识和技巧,这里总结一下日常面试到的问题及简单回答方法: