Linux运维面试题

1. apache怎么实现负载均衡
答案:
多台机器跑apache,然后其中一台跑nginx,让nginx去代理多台apache实现负载均衡

2. 一台Linux服务器负载高,连接慢,怎么查看
答案:
先用w看负载多少,用top看哪个进程占用cpu高,同时用top按M看哪个进程占用内存多,用iotop看哪个进程读写频发,用sar命令或者nload命令查看网卡流量,是否跑满带宽


3. 现有A文件,编写shell脚本判断A文件中大于5的数字,输出
答案: 
for d in `sed 's/[^0-9]//g' A`; do if [ $d -gt 5 ]; then echo $d;fi; done


4. 怎么判断文件为空的
答案:
[ ! -s filename ]


5. Linux服务器中程序经常自动停止如何处理
答案:
可以先写监控脚本,当发现进程不存在时自动启动。 然后要查各个日志,看看程序为什么会自动停止,只有找到根本原因,才能真正解决问题

6. TCP断头最小长度是___字节?    答案:20字节


7. 简述TCP三次握手的过程?

答案:

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据


简版:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了


8. dmesg命令中看到ip_conntrack: table full, dropping packet.,如何解决?

答案:

ip_conntrack表的最大值由参数ip_conntrack_max控制,查看当前设置的最大值可通过命令: cat /proc/sys/net/ipv4/ip_conntrack_max

redhat默认大小是65536,这个值的大小是有机器的内存决定的,65536是1G内存的大小,如果你的内存不止1G,那么设置的数值大小就是65536的倍数。2G是131072,4G是262144。数值可以比当前内存可设置的最大值小,但是不能超过最大值,要不然设置之后是不生效的。

要查看当前系统ip_conntrack的大小可以通过命令:

cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count

设置方法如下:

方式一:

echo 131072 >/proc/sys/net/ipv4/ip_conntrack_max 

要实现每次开机后都生效的话,要加到开机启动脚本/etc/rc.local里,其他开机自动运行的脚本也行。

方式二:

echo 'net.ipv4.ip_conntrack_max=131072'  >> /etc/sysctl.conf

sysctl -p

这样每次开机都能自动设置该参数


9. 简要描述Linux的启动过程?

答案:(这个版本有点老了,但很详细,可以帮助你复习很多知识点,面试的时候,可以简单说一下,这个答案主要是理解为主)

A. 启动第一步 加载BIOS

当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。

B. 启动第二步 读取MBR

众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。

系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。

C. 启动第三步 Boot Loader

Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。

Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader。

我们以grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多。

系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。

D. 启动第四步 加载内核

根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。

系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。

E. 启动第五步 用户层init依据inittab文件来设定运行等级

内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。

其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。

Linux的运行等级设定如下:

0:关机

1:单用户模式

2:无网络支持的多用户模式

3:有网络支持的多用户模式

4:保留,未使用

5:有网络支持有X-Window支持的多用户模式

6:重新引导系统,即重启

F. 启动第六步 init进程执行rc.sysinit

在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的脚本够你看几天的

G. 启动第七步 启动内核模块

具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

H. 启动第八步 执行不同运行级别的脚本程序

根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

I. 启动第九步 执行/etc/rc.d/rc.local

你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don’t

# want to do the full Sys V style init stuff.

rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

J. 启动第十步 执行/bin/login程序,进入登录状态

此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。

10. 在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU、内存、IO、网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核。

答案:

A. 用w命令看系统负载高不高,如果高可能是CPU不够用,进程太多运行太慢,也可能是磁盘I/O太高了。

B. 用vmstat 1命令来查看各个指标,着重分析r,b,swpd,si,so,bi,bo,us,wa. 若r列或者us列数值偏高则说明cpu有瓶颈,若b列或者wa列数值偏高同时bi或bo的数字很大,则说明磁盘有压力,若swpd一直变化,并且si和so一直不为0,则说明内存不够了。

C. 用top命令来分析哪个进程耗费cpu最多,默认按使用cpu多少排序,按M也可以按内存使用多少排序。

D. 用sar -n DEV 1 10 或者 nload 命令可以查看网卡的流量(若没有nload命令,请使用yum install epel-release; yum install -y nload 安装)

E. 用iotop命令可以查看磁盘读写速度 (yum install -y iotop 安装)


11. 在bash shell中$?,$#,$*代表什么,其中$#和$*的区别

答案:

$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

$# 是传给脚本的参数个数

$* 显示所有向脚本传递的参数

所以,$#是一个数字,而$*是一个字符串。

12. 如何使用tar命令将/tmp/abc文件夹打包为压缩文件/tmp/abc.tgz。及如何知道命令是否执行成功。

答案:

命令:tar  czvf  /tmp/abc.tgz  /tmp/abc

检测:echo $?(返回值为0,说明成功) 

13. 如何判断当前服务器的80端口是否被监听,如果被监听,怎么知道被哪个进程监听

答案:

用netstat –lnpt |grep 80 命令来查看80端口是否被监听

查看进程:上次命令结果的最后一列(不确定)或者使用命令:lsof –i :80看第一列

14. 如何查看file文件的第400-500行的内容

答案:

sed  -n  '400,500p'  file文件名

15. 写一个脚本,分析昨天一整天nginx记录某个站点的日志,统计出次数最多的前20个ip,并统计出一天所报500错误的次数。  

答案:

假如nginx昨天访问日志为/data/log/2016-10-01.access.log

前20个IP: awk ‘{print $1}’ /data/log/2016-10-01.access.log |sort -n |uniq -c|sort -nr |head -20 |awk ‘{print $2}’

500次数: 假如状态码在第8段,awk ‘$8==”500”’ /data/log/2016-10-01.access.log |wc -l

16. 简单介绍一下您所知道的减少和加速web服务器的请求的方法。

答案:

A. 针对静态的访问,做过期时间,把静态文件缓存在客户端上

B. 在前端搭建squid反向代理,把静态的文件缓存在squid上

C. 接入CDN

D. 合并js、css以及小图片

17. 办公室同事反馈网站打不开,请简述一下排查故障的思路或解决方法

答案:

A. 先ping一下域名,看看网络是否通

B. Telnet 一下服务器的80端口,看是否通

C. 查看服务器流量是否正常,借助sar或者nload

D. 查看服务器是否有负载,用w,查看服务是否开启,用ps

E. 抓包查看数据包是否正常,看是否有攻击,用tcpdump

F. 查看配置是否正确

18. 简述一下raid0,raid1、raid5、raid10他们的优势与区别

说明:前面已经有类似的题目(5套11题)。但没有描述raid10,raid10其实就是先做raid1再做raid0,不仅加快了访问速度,还保证了数据安全。

19. 简单介绍一下自己对哪种监控系统最熟悉,并阐述一下其优缺点

答案:

对Zabbix和Nagios比较熟悉。Nagios没有使用数据库来存储历史数据,所以它不能构成图表,它重在监控的状态,它只需要告诉我们监控项目是否正常,所以一目了然。Nagios配置需要修改配置文件,总体上来说比较复杂。Zabbix使用MySQL存储历史数据,所以它可以构成图表,可以查询一个月甚至一年的历史数据。Zabbix有一个自动发现的功能,当监控大批量主机的时候,可以通过这个自助发现,快速配置。所以Zabbix适合大型服务器集群的监控。

20. 简述一下nginx的安装使用,配置,安全方面的使用配置

答案:

这问题问的太笼统了,不好回答。要说安装和配置,直接拿出你平时记录的学习笔记就够了,所以呢以后你面试的时候,可以带着你的笔记(同学们可以把自己的博客或者云笔记打印出来,面试的时候带着,面试官问这样的问题,就可以直接把笔记拍到桌子上给他看)。安全方面,着重从安全认证、防盗链、访问控制这几个方面描述。

21. 是否对php熟悉,简述一下对php的优化

答案:

对php安装和配置还算熟悉。对于php的优化,可以说说配置日志、disable_function(这个就需要同学们去描述几个非常典型的函数了,去百度查查我给你们列出的那些函数,不用全部,有5,6个就可以了)、open_basedir等

22. 是否对cdn熟悉,简单介绍一下排查某个区域访问有问题的解决方法。

答案:

首先要确定好访问有问题的区域访问到的节点ip,然后针对这个ip去排查。 比如先ping一下这个ip是否通,telnet一下这个ip的80端口是否正常。可以编辑自己电脑的hosts文件,写一条到该区域CDN的解析记录,用浏览器去访问。


23. 常见的Linux版本有哪些?你最擅长哪一种?说明你擅长哪一块?

答案:

常见的Linux发行版有,Debian, Gentoo, Ubuntu, RedHat, CentOS, Fedora,  Kali Linux, Suse等,最擅长CentOS,擅长部分命令使用,脚本编程,环境服务搭建与配置。

24. 熟悉FreeBSD吗?比如改主机名?FreeBSD的默认防火墙是什么?

答案:

一般熟悉,改主机名使用命令:vi  /etc/rc.conf,向里面加入 hostname=主机名,默认防火墙是ipfw

25. 忘记密码怎么办?

答案:

忘记密码,可以进入单用户模式或者救援模式来更改密码。

26. Linux的标准分区是什么?(内存32G,硬盘1T)

答案:

/boot 分200M,/分50G,swap 分16G,其余分到 /data 下。

27. 突然发现一台Linux系统只读,应该怎么处理,请写出详细步骤。

答案:

文件系统只读,可能是误操作,比如挂载的时候加了ro的挂载选项。也可能是文件系统损坏,这时候可以使用fsck -y 分区 来尝试修复一下,但在修复之前最好是把重要数据做一个备份以防万一。如果修复失败,那说明是磁盘损坏,这就需要更换磁盘了。

28. 简要描述Linux无盘值守安装过程。

答案:

这个不太好简述,内容太多了。大家应该好好看看扩展知识点,如果动手做了那印象会比较深刻。启动过程:PXE网卡启动-->DHCP服务器-->获得IP-->从TFTP上下载pxelinux.0、vmlinuz、initrd-->启动系统-->通过PEX去HTTP或NFS或FTP下载ks.cfg文件-->跟据ks.cfg去HTTP或NFS或FTP下载RPM包及安装系统-->完成安装。所以,我们需要安装的服务有dhcp、tftp、http/ftp、kickstart,同时也需要编辑合适的ks.cfg。这个文件就是规定安装哪些rpm包的。


29. 用一条命令截取ifconfig中看到的IP地址,尽量使用awk,sed等处理。

示例:

[root@server ~] # ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:78:85:52

          inet addr:192.168.130.128  Bcast:192.168.130.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe78:8552/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1215 errors:0 dropped:0 overruns:0 frame:0

          TX packets:984 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:134394 (131.2 KiB)  TX bytes:98708 (96.3 KiB)

答案:

ifconfig eth0|grep 'inet addr'|awk -F ' ' '{print $2}'|awk -F ':' '{print $2}'

30. Linux Shell可否实现多线程处理,有没有什么办法?

答案:

可以实现多线程。其实就是把要执行的命令丢到后台去,同时运行它们。比如,正常执行一个shell脚本是一条命令执行完成后再执行下一条命令。那如果把所有命令后面加个&,让它丢到后台去运行,则所有的命令会同时执行完。

31. 建立一个名为index.html的文件,并使其root不可写。

答案:

touch index.html

chattr  +i  index.html

32. 请写一个任务计划,(周日下午两点三十五执行update.sh),并说明前面都*分别都代表什么?

答案:

35    14    *  *  0    /bin/sh  update.sh

五个 * 分别代表 分时日月周

33. 请用iptables写一条规则(同时允许443,80,1723,22,3306,11211,25,110,dns,ntp协议,并写出默认允许或者拒绝端口的作用)

答案:

iptables -I INPUT -p tcp -m multiport --dport 443,80,1723,22,3306,11211,25,110,53,123 -j ACCEPT

iptables默认是允许所有端口开放的,如果想只放行指定某些端口,那就需要配置一下默认规则了。比如本例中,我们写完放行的端口规则后还需要写一条默认拒绝的规则iptables -P INPUT DROP 这样除了上面那规则中提到的端口可以访问外,其他端口都是拒绝的。

34. NAT协议是什么,有哪几种,请简要说明。并写一条简单的nat规则,端口13389映射到3389端口。

答案:

关于NAT的描述,在前面的问题中已经给出答案。论坛也有一篇不错的文章,看图就会很清楚了http://ask.apelearn.com/question/7255。下面是两条映射的规则:

假设本机ip为1.1.1.1,目标机器ip为2.2.2.2

iptables -t nat -I PREROUTING -d 1.1.1.1 -p tcp --dport 13389 -j DNAT --to 2.2.2.2:3389

35. 你所知道的虚拟化产品有几种?是否接触到docker?

答案:

Kvm、Xen、vmware(workstation/esxi)、virtualbox。在自己电脑上搞过workstation和virtualbox,在服务器上配置过kvm。

接触过docker,在线上服务器使用docker跑过php环境,使用docker可以很方便地部署好环境,节省了部署和配置的时间。

36. 网站HTTPS证书认证需要那几个文件?分别是什么?什么作用?

答案:

HTTPS证书需要有两个文件,一个是crt,一个是key。crt文件就是公钥文件,用来加密的。而key文件是私钥文件,是用来解密的。

 


37. 请简述CDN原理。

答案:

在描述CDN的实现原理,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别:

用户提交域名→浏览器对域名进行解释→得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复

由上可见,用户访问未使用CDN缓存网站的过程为:

1) 用户向浏览器提供要访问的域名;

2) 浏览器调用域名解析函数库对域名进行解析,以得到此域名对应的IP地址;

3) 浏览器使用所得到的IP地址,向域名的服务主机发出数据访问请求;

4) 浏览器根据域名主机返回的数据显示网页的内容。

通过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。CDN网络是在用户和服务器之间增加Cache层,如何将用户的请求引导到Cache上获得源服务器的数据,主要是通过接管DNS实现,下面让我们看看访问使用CDN缓存后的网站的过程:

 

通过上图,我们可以了解到。

使用了CDN缓存后的网站的访问过程变为:

1) 用户向浏览器提供要访问的域名;

2) 浏览器调用域名解析库对域名进行解析,由于CDN对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的CNAME记录,为了得到实际IP地址,浏览器需要再次对获得的CNAME域名进行解析以得到实际的IP地址;在此过程中,使用的全局负载均衡DNS解析,如根据地理位置信息解析对应的IP地址,使得用户能就近访问。

3) 此次解析得到CDN缓存服务器的IP地址,浏览器在得到实际的IP地址以后,向缓存服务器发出访问请求;

4) 缓存服务器根据浏览器提供的要访问的域名,通过Cache内部专用DNS解析得到此域名的实际IP地址,再由缓存服务器向此实际IP地址提交访问请求;

5) 缓存服务器从实际IP地址得得到内容以后,一方面在本地进行保存,以备以后使用,另一方面把获取的数据返回给客户端,完成数据服务过程;

6) 客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。

通过以上的分析我们可以得到,为了实现既要对普通用户透明(即加入缓存以后用户客户端无需进行任何设置,直接使用被加速网站原有的域名即可访问,又要在为指定的网站提供加速服务的同时降低对ICP的影响,只要修改整个访问过程中的域名解析部分,以实现透明的加速服务。

下面是CDN网络实现的具体操作过程。

1) 作为ICP,只需要把域名解释权交给CDN运营商,其他方面不需要进行任何的修改;操作时,ICP修改自己域名的解析记录,一般用cname方式指向CDN网络Cache服务器的地址。

2) 作为CDN运营商,首先需要为ICP的域名提供公开的解析,为了实现sortlist,一般是把ICP的域名解释结果指向一个CNAME记录;

3) 当需要进行sortlist时,CDN运营商可以利用DNS对CNAME指向的域名解析过程进行特殊处理,使DNS服务器在接收到客户端请求时可以根据客户端的IP地址,返回相同域名的不同IP地址;

4) 由于从cname获得的IP地址,并且带有hostname信息,请求到达Cache之后,Cache必须知道源服务器的IP地址,所以在CDN运营商内部维护一个内部DNS服务器,用于解释用户所访问的域名的真实IP地址;

5) 在维护内部DNS服务器时,还需要维护一台授权服务器,控制哪些域名可以进行缓存,而哪些又不进行缓存,以免发生开放代理的情况。

38. 构建简单网站架构模型

设备:13台服务器,要求:有负载均衡和数据库主从

答案:

架构:Keepavlied + lvs + nginx/php + NFS + mysql + redis

keepalived+lvs 使用2台

Nginx+php-fpm使用5台

NFS 使用1台

Mysql双主,并使用keepalived构建高可用 使用2台

Redis 使用1台,用来存session

备份机器使用1台

监控机器使用1台

39. Linux的安全如何做?从哪些方面入手,请简要说明步骤。

答案:

A. 关闭不用的服务

B. 用iptables限定规则,只开放22,80等常用端口

C. 禁止root用户直接登录服务器,只允许密钥验证,配置合适的sudo规则

D. 限定登录服务器的ip白名单

E. Apache/nginx配置文件中配置web认证、访问控制、限定某些目录禁止解析等操作

F. 设置php.ini,禁掉高危函数,配置合适的open_basedir

40. 集群服务器中有一台发生故障,导致网站时好时坏。如果是你,你该如何处理,请简要说明步骤和方法。

答案:

首先要找到出问题的服务器,可以简单写个for循环,针对集群中多有机器用curl命令来测试网站能否访问。定位到故障服务器后,要在分发器上把故障机器踢掉。有一种情况,不太好处理,比如某个服务器访问网站比较慢,但也能访问。这样就不太容易找到出问题的服务器,这时候可以给所有服务器设置一个自定义header,通过curl命令可以很清楚地定位到具体的服务器。只要定位到服务器,然后再针对它去排查访问慢的原因。


41. 常用Linux命令

答案:

显示指定工作目录下的内容: cd ; 复制 cp ; 移动 mv ;删除 rm ;

查看服务器负载:top/(w) ;查看本地网卡信息:ifconfig  -a ;查看文档: cat ;

显示磁盘使用情况:  df ;编辑文本:vim ;查看当前系统内存使用情况:free;

查看占用80端口的进程:netstat –lnp|grep 80 ;

打印file 1 文件的第一行到第三行: cat file 1|sed ‘1,3’p –n ;

将/home/tong/test 目录下大于100K的文件转移到/tmp目录:

find /home/tong/test -type f -szie +100k |xargs -i mv {} /tmp/

42. 名词解释

Swap: Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

Raid:磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。

chmod: linux系统命令,用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取,写入,执行3种一般权限来区分,另有3种特殊权限可供运用,再搭配拥有者与所属群组管理权限范围。您可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。

ps aux|grep pid:过滤出进程名字中含有pid的进程

iptables: linux系统防火墙名字叫做 netfilter,而iptables 只是它的一个实现工具。Iptables 可以用来设置、维护和检查Linux内核的IP包过滤规则的。


43.Apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式?

说明:这个问题在前面已经有过介绍。相信后续的笔试题还会出现。所以我从网上总结一些比较好的答案写在这里,帮助大家理解。

答案:Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。它们分别是prefork,worker和event,它们同时也代表这Apache的演变和发展。使用httpd -V 命令查看。在configure配置编译参数的时候,可以使用 --with-mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:--enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM。

1、Prefork MPM

Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。

2、Worker MPM

和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。

3、Event MPM

这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。

 

44.有文件file1

1. 查询file1里面空行所在的行号;
 
答:grep -n ‘^$’ file1
 
2. 查询file1中以abc结尾的行;
 
答:grep ‘abc$’ file1
 
3. 打印file1 文件的第一到三行;
 
答:sed  -n ‘1,3’p file1
 
45.写一条192.168.10.0网段从网关192.168.9.1出去的路由

答:route add -net 192.168.10.0/24 gw 192.168.9.1

 

46.写一条放行80端口的防火墙规则。

答:iptables -I INPUT -p tcp --dport 80 -j ACCEPT

 

47. 每天早上6点到12点,每隔2小时执行一次/usr/bin/httpd.sh怎么实现

答:crontab -e 然后添加一行

0 6,8,10,12 * * * /bin/bash /usr/bin/httpd.sh

 

48.编写个shell脚本判断根目录下有没有abc目录,如果没有就发邮件给[email protected]

答:#!/bin/bash

if [ ! -d /abc ]

then

echo “Director /abc is gone, please check.”| mail -s ‘directory /abc is gone’ [email protected]

fi


49.备份mysql数据库test库

答:mysqldump -uroot -p’passwd’ test > /data/test.sq


50.ftp的几种模式比较。

答:主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。被动模式只需要服务器端开放端口给客户端连接就行了。

主动FTP:  

命令连接:客户端 >1024端口 -> 服务器 21端口  

数据连接:客户端 >1024端口 <- 服务器 20端口

被动FTP:

命令连接:客户端 >1024端口 -> 服务器 21端口

数据连接:客户端 >1024端口 -> 服务器 >1024端口

 

52. 你公司监控(如zabbix)系统监控了哪些项目。

答:监控了CPU使用率、内存剩余、磁盘使用空间、网卡流量、web服务、mysql主从、访问日志等

 

53. 使用nginx做负载均衡;后端一主一备;测试发现主正常的情况下,会有10%左右的流量访问备,请分析原因。

答:可能是nginx配置文件的max_fails(失败超过指定次数会暂停或请求转往其它服务器)太小。

 

54. lvs与nginx负载均衡的区别。

答:

1)nginx工作在网络的七层,所以他可以针对http应用本身来做分流策略,比如针对域名,目录等,而lvs并不具备这些功能,所以nginx这点可利用的地方就多余lvs,但因为这些功能使其调整度高于lvs,需要经常触碰,触碰多了,出问题的几率就会增加,而lvs配置性不高,没有太多的可配置选项,除了增减服务器,并不需要经常去触碰他,大大减少人为出错。

2)nginx对网络的依赖性比较小,理论上只要能ping通,网页访问正常,nginx就能连的通,lvs比较依赖于网络环境,至少需要一个公网ip来做VIP

3)nginx测试可以查看错误日志,而lvs出错,很多都是网络问题,没有错误日志,解决比较麻烦

4)nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。lvs的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚 好在上传过程中出现故障,nginx会把上传切到另一台服务器重新处理,而lvs就直接断掉了

 

55. apache与nginx的区别。

答:

1)nginx 轻量级,同样web 服务,比apache 占用更少的内存及资源 抗高并发能力大约是apache的10倍以上,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

2)nginx的静态处理性能力比apache强,nginx处理动态不行,一般动态请求要apache去做,nginx只适合静态和反向,

3)核心区别,apache是同步多进程,一个连接对应一个进程,nginx是异步的,很多很多个连接可以对应一个进程

  

56. 你是如何学习linux,用得什么编辑器,用什么软件做技术文档。

答:

在这里我要强调一下,不建议大家说是通过参加培训学习的Linux,因为这样说,面试者会觉得你学的技能都是培训来的没有实战经验。但实际上,你所学到的东西,大多都是实战经验。你可以说,你的Linux技能是在工作中不断总结学到的,这时候你可以说一下自己的博客或者用你的手机给他展示一下你的学习笔记也是可以的。当然,如果你有打印出来的厚厚的一打笔记也是蛮厉害的。如果是应届毕业生,你可以说你在大学里参加了一个计算机社团,团长有给你分享很多学习资料,并且还跟着他参加过几个项目,这时候就可以吹一吹自己做过的“项目”了,其实是你之前做的实验。用的vim编辑器,你就说技术文档写到了自己博客里,或者说写到了自己的云笔记里。

 

57. 网站做了负载均衡,发现有些用户访问的时候经常需要重新登录,是什么原因,怎么处理?

答:

这是因为用户登录后,他的请求被分发到了另外一台服务器上。默认,服务存用户的session是在/tmp/下面,本来已经在A服务器上保存了session,可下次访问到了B服务器,而B服务器又不存在刚才保存的session信息,所以就会显示未登录。要解决这个问题很容易,比较简单的做法是,做一个会话保持。比如可以设定1小时内用户的请求固定在一台服务器上。如果是nginx也可以设置ip_hash。当然最好的解决方案是,使用redis存取session,实现session共享。


61. linux引导加载的先后顺序是BIOS kernel GRUB MBR RAID?

答案:BIOS -> RAID -> MBR -> GRUB -> kernel

62、进程间通信方式主要有哪几种方式?

答案:1管道 2命名管道 3信号 4消息队列 5共享内存 6信号量 7套接字

63、简要说明你对内核空间和用户空间的理解?

答案:这个问题有点偏开发,大家不明白没有关系,了解一下即可。操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。大家可以看看这个文章http://www.go-gddq.com/html/QianRuShiXiTong-JiShu/2012-07/1031748.htm

64.文件描述符FD的数量与TCP连接数有什么关系?

答案:对于服务器来讲,每一个连接到本机上面的tcp连接都要产生一个socket,每一个socket就是一个文件描述符。所以tcp连接数和文件描述符是一样的。下面我从网上找了一篇文章,帮助大家理解tcp连接数。

在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?

在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。

client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。(注意这个说的是client,也就是客户端)

server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。

上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。在默认2.6内核配置下,经过试验,每个socket占用内存在15~20k之间。

对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的,国外 Urban Airship 公司在产品环境中已做到 50 万并发 。在实际应用中,对大规模网络应用,还需要考虑C10K 问题。

65. 你用过或测试过哪些 linux/unix文件系统?

答案:centos5默认是ext3,centos6为ext4,centos7为xfs

66. linux中每周六的04点20分 删除/tmp/log_*文件,怎么实现?

答案:20 4 * * 6  /bin/rm -f /tmp/log_*

67. linux服务器会在哪些方面产生瓶颈?如何排查出这些瓶颈?

答案:答案在前面的题目中查找。

68. 如何查看当前多核CPU负载情况?

答案:top 之后按1 切换

69. 怎样用命令查看3天前的CPU分核的负载数据?

答案:sar -f /var/log/sa/(三天前日期)  

70. 某命令CPU负载显示以下各段,分别是什么? 10.6%us,6.6%sy, 0.0%ni 74.4%id 0.0%wa

答案:us 用户cpu百分比  sy内核cpu百分比  ni进程占用百分比  id 空闲百分比 wa io等待占用的百分比

71. 列举你知道的linux下的压力测试程序

答案:测试web的工具:http_load,ab

专业的测试工具loadrunner

72. 描述linux系统下创建软RAID5的命令和步骤

答案:假如有四块硬盘 /dev/sda,/dev/sdb,/dev/sdc,/dev/sdd,分别给他们分一个主分区sda1,sdb1,sdc1和sdd1,然后创建RAID设备名为md0, 级别为RAID5,使用3个设备建立RAID,空余一个做备用.

命令如下:

mdadm --create /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd[a-d]1

使用下面命令查看raid详细信息

mdadm --detail /dev/md0

73. linux发行版rhel和centos在使用上有什么区别

答案:RHEL一直都提供源代码的发行方式,CentOS 就是将 RHEL 发行的源代码从新编译一次,形成一个可使用的二进制版本。由于 LINUX 的源代码是 GNU,所以从获得 RHEL 的源代码到编译成新的二进制,都是合法。只是 REDHAT 是商标,所以必须在新的发行版里将 REDHAT 的商标去掉。

REDHAT 对这种发行版的态度是:“我们其实并不反对这种发行版,真正向我们付费的用户,他们重视的并不是系统本身,而是我们所提供的商业服务。”

所以,CentOS 可以得到 RHEL 的所有功能,甚至是更好的软件。但 CentOS 并不向用户提供商业支持,当然也不负上任何商业责任。

如果是单纯的业务型企业,购买RHEL软件并购买相应服务比较合适。这样可以节省IT管理费用,并可得到专业服务。一句话,选用 CentOS 还是 RHEL,取决于你所在公司是否拥有相应的技术力量。

在RHEL5和RHEL6版本上是无法使用yum的,因为REDHAT只给付费用户提供这个软件。


74. 不小心在系统下执行了chmod -x /bin/chmod 怎么办?

答案:

/lib64/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod   64位

/lib/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod     32位

75. linux文件的权限位x对目录和文件有何不同?

答案:

x位对目录来说,如果用户不配备x权限,则不能进入此目录,更别谈修改里面的文件了

x位对文件来说,如果文件具有x,则可以被执行他,比如脚本可以执行

76. 找出/taomee目录下的所有常规文件并设置权限644

答案:find taomee/ -type f |xargs -i chmod 644 {}

77. 如何查找某一文件被哪个进程打开?

答案:lsof|grep file

78. 新增一块存储设备,lvm操作的命令如何写

答案:

将物理硬盘格式化成pv              pvcreate /dev/sdb

创建卷组(VG)并将pv加到VG中    vgcreate vg1 /dev/sdb

基于VG创建逻辑卷(LV)              lvcreate -n mylvm -L 20G vg1 

79. 给主机host:172.16.0.2 增加gateway10.0.0.1

答案: route add 172.16.0.2 gw 10.0.0.1或者网卡配置文件更改

80. socket和tcp访问mysql的区别?

答案:socket访问是通过服务器上的一个socket文件来和mysql服务通信,速度快,但是只能在同一台服务器连接。tcp是通过网络来通信,可以在另外的机器连接。

81. 使用awk打印出 welcome to taomee

答案:echo 1|awk '{print "welcome to taome"}'

82. 如何将一个文件中的taomee、******、peoplenet中的*内容进行替换成network(*的内容不同)

答案:sed -i ‘s/taomee、******、peoplenet/taomee、network、peoplenet/g’ file

83. 找出access.log中访问top 10的ip地址

答案:awk '{print $1}' access.log | sort -n| uniq -c | sort -nr | head -n 10

84. 打印1-100奇数

答案:

seq 1 2 100

85. 删除一个文件中行号为奇数的行

答案:sed '1~2’d  file

86. 替换某一个文件的字符串

答案:sed -i 's/root/qwer/g' file

87. exec和souce区别

答案:

source就是让script在当前shell内执行、而不是产生一个sub-shell来执行。exec也是让script在同一个行程上执行,但是原有行程则被结束了。 简而言之:原有行程会否终止,就是exec与source/fork的最大差异了。

参考文档http://blog.sina.com.cn/s/blog_4da051a60102uwd8.html

88. 显示24小时前的内容

find /tmp/ -mtime +1

89. 简述linux的优化

【硬件方面】

1. cpu

2. 内存  (增加内存)

3. 存储 (使用raid,使用ssd)

4. 网卡 (使用千兆网卡,或者双网卡绑定)

【系统方面 】

1. 内核参数优化(网络相关、内存相关、缓冲缓存相关)

2. 文件系统方面(分区调优,格式化时根据存储文件特性,指定合适的块大小,noatime,日志隔离,软raid,有效使用/dev/shm,关闭不必要的服务)

3. cpu优化 (进程绑定,中断绑定)

numa架构cpu:  http://blog.csdn.net/jollyjumper/article/details/17168175

taskset 把进程和cpu绑定  http://blog.csdn.net/ttyttytty12/article/details/11726569

【应用程序方面】

1. nginx、apache、php-fpm、mysql、tomcat、squid等应用,是可以通过调节各个参数获得性能优化的。

2. web优化,比如可以把用户请求合并(js、css合并),使用cdn加速静态页访问速度,把图片文档压缩减少带宽传输,

3. 优化网站程序

【架构方面】

1. 使用简单并且稳定的架构方案

2. 多使用缓存

10. iptables表和链

filter    INPUT FORWARD OUTPUT

nat      PREROUTING  POSTROUTING OUTPUT

mangle  PREROUTING INPUT FORWARD OUTPUT POSTROUTING


90. 检测某个端口所占用的进程,比如3306

答案:netstat -lnp |grep 3306  

91. 对于linux主机的cpu负载使用,什么情况下user的比例升高,什么情况下system的比

例升高,请联系实际举例。

答案:在Linux系统里面跑的用户安装服务比较忙的时候,会导致user的比例升高,比如mysql服务、php服务等。同样,当进程比较忙,比如php使用非常频繁,子进程非常多的时候,会导致进程切换频繁,system的比例就会升高。

92、在不umount的情况下,如何重新设置mount的参数。

答案:mount -o remount

93. 说一下公司多少台服务器,是什么架构

答案:有7台服务器,lnmp+nginx负载+keepalived,其中2台keepalived+2台nginx/php-fpm+2台mysql(一主一从)+NFS(上面兼着跑监控、备份)

94. Nginx有哪些优化参数

答案:

A. worker_processes 8;   nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。

B. worker_cpu_affinity 00000001 0000001000000100 00001000 00010000 00100000 01000000 10000000;   为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

C. worker_rlimit_nofile 65535; 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除,现在在linux2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

D. useepoll;

使用epoll的I/O模型

E. Worker_connections 65535;  每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

F. keepalive_timeout 60;   keepalive超时时间。

G. client_header_buffer_size 4k;客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。

H. open_file_cachemax=65535 inactive=60s;这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

I.  Open_file_cache_valid  80s;这个是指多长时间检查一次缓存的有效信息。

J.  open_file_cache_min_uses  1;   open_file_cache 指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

95. 提高性能和并发数,需要优化哪些内核参数

答案:

net.ipv4.tcp_max_tw_buckets = 6000  //timewait的数量,默认是180000。

net.ipv4.ip_local_port_range = 1024 65000  //允许系统打开的端口范围。

net.ipv4.tcp_tw_reuse = 1 //允许将TIME-WAIT sockets 重新用于新的TCP 连接。

net.ipv4.tcp_syncookies = 1 //开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理。

net.ipv4.tcp_max_orphans = 262144 //系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_max_syn_backlog = 262144  //记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_synack_retries = 1  //为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。

net.ipv4.tcp_syn_retries = 1  //在内核放弃建立连接之前发送SYN 包的数量。

net.ipv4.tcp_keepalive_time = 30 //当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时。

96. Nginx和lvs负载均衡比较

1)lvs的特点:

A. 抗负载能力强,因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的 lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和 cpu方面基本无消耗。

B. 配置性低,这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。

C. 工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定的。

D. 无流量,上面已经有所提及了。lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。

E. 基本上能支持所有应用,因为lvs工作在4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等等。

另:lvs也不是完全能判别节点故障的,譬如在wlc分配方式下,集群里有一个节点没有配置VIP,会使整个集群不能使用,这时使用wrr分配方式则会丢掉一台机。目前这个问题还在进一步测试中。所以,用lvs也得多多当心为妙。

2) Nginx的特点是:

A. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。

B. Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;

C. Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。

D. 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。

E. Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。

F. Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。

G. Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。

H. Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。

I. Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。

J. Nginx新版本已经支持代理tcp各种协议,不再仅仅局限在代理http、https以及email。

97. zabbix监控哪些项目,模板是不是自己写的,触发报警有哪些,阀值都是多少

答案:

监控了CPU使用、系统负载、内存剩余、磁盘使用百分比、mysql主从、mysql队列数量、网站访问量、网卡流量、web状态码,有自己写的自定义监控脚本。触发报警的有系统负载(当高于20报警)、磁盘使用百分比(高于90%报警)、mysql主从是否正常(不正常告警)、mysql队列数量(高于400报警)、网卡流量(高于100M报警)等等。


10. php优化参数有哪些,fastcgi设置是多少,动态还是静态

答:

A. php.ini安全配置,禁掉危险的函数

disable_functions(exec,system,passthru,error_log,ini_alter,dl,openlog,syslog,readlink,    symlink,link,leak,fsockopen,proc_open,popepassthru,chroot,scandir,    chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,popen)

B. php.ini配置日志

display_errors =   默认Off    [On]  打开错误日志

error_log=/usr/local/php/logs/php_errors.log

error_reporting=E_ALL & ~E_NOTICE

C. Php.ini中定义open_basedir = /data/www:/tmp    白名单目录

D. Php-fpm.conf中配置慢执行日志

E. Php-fpm.conf定义max_children

F. 问题中的fastcgi指的就是这个fpm配置,最大进程数(max_children)为300,动态(dynamic)

11. TCP有哪些了解,TCP连接状态中“TIME_WAIT”是什么意思,影响什么

答:关于tcp有点复杂,直接上图吧,更直观


状态描述:

CLOSED: 这个没什么好说的了,表示初始状态。

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状 态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

ESTABLISHED:这个容易理解了,表示连接已经建立了。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

 

12. 网站出现500,502,400,403,404都是什么意思,怎么排查和解决

答案:

500:服务器内部错误,因为服务器上的程序写的有问题,需要打开错误日志,查看日志,分析错误信息。

502:网关错误,服务器作为网关或代理,从上游服务器收到无效响应。Nginx出现最多,出现502要么是nginx配置的不对,要么是php-fpm资源不够,可以分析php-fpm的慢执行日志,优化php-fpm的执行速度。

400:错误请求,服务器不理解请求的语法。这可能是用户发起的请求不合理,需要检查客户端的请求。

403:服务器拒绝请求。检查服务器配置,是不是对客户端做了限制。

404:未找到请求的资源。检查服务器上是否存在请求的资源,看是否是配置问题。

 

13. 从运维角度讲一下怎么预防cc攻击和ddos攻击

答案:先来说一下什么是cc攻击和ddos攻击。

1) CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库就越大,被访问的频率也越高,占用的系统资源也就相当可观。

一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。

CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。

防御CC攻击可以通过多种方法,比如,可以分析攻击的请求头信息,分析它的特点,然后针对这些请求做一些限制。也可以分析请求的ip,利用iptables来限制ip。将网站做成静态页面,也可以有效降低服务器资源使用。另外,还可以限制连接数量,修改最大超时时间等。

2) ddos攻击的方式有很多种,最基本的ddos攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。单一的ddos攻击一般是采用一对一方式的,当攻击目标CPU速度低、内存小或者网络带宽小等等各项指标不高的性能,它的效果是明显的。随着计算机与网络技术的发展,计算机的处理能力迅速增长,内存大大增加,同时也出现了千兆级别的网络,这使得DoS攻击的困难程度加大了-目标对恶意攻击包的"消化能力"加强了不少。这时候分布式的拒绝服务攻击手段(ddos)就应运而生了。ddos就是利用更多的傀儡机(肉鸡)来发起进攻,以比从前更大的规模来进攻受害者。

简单的ddos,比如cc,我们可以通过限定ip来解决攻击。但有时候攻击量很大,甚至可以把机房的网络攻击瘫痪,这时候只能临时在上层网络把目标IP封掉,这样牺牲单个ip而保全大局。也可以接入第三方的防ddos攻击的cdn。


2. 简要叙述下列端口锁运行的服务?

21  22   23  25  110  143  873  3306

答案:分别是ftp sshd telnet smtp pop3 imap rsync  mysql

3. 列出当前linux服务器所有监听的端口以及进程号。

答案:netstat -lnp

4. 让某普通用户能进行 cp /dir1/file1 /dir2的命令时,请说明dir1 file1最小具有什么权限

答案:dir1 005   file1 000

5. 简述tcp三次握手的过程?

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

6. 如何显示testing文件的第100行?

答案:sed -n '100p' testing

7. 如何查看占用端口8080的进程?

答案:lsof -i :8080

8. 简述 raid0 1 5 三种工作模式的工作原理?

答案参考第5套11题

9. 你使用过监控软件吗?说说其特点?

答案参考第13套第9题

10.你认为系统调优方面都包括哪些工作,已linux为例,请阐述,并举一些参数为例?

答案参考第6套9题

11. 如何查看当前linux系统的状态如cpu使用,内存使用,负载情况,看到swap使用量大时,是不是意味着物理内存已不够用?

答案:top命令就可以看cpu使用、内存使用以及负载情况,当swap使用率大时,不一定是内存不够,如果swap容量固定不变,那内存就不是瓶颈。用vmstat 1命令看,si so两列的数值在不断变化时,内存就不够了。

13. 如何修改ip主机名DNS?

答案:

修改ip和DNS在配置文件/etc/sysconfig/network-scripts/ifcfg-eth0中修改,修改主机名,在/etc/sysconfig/network中修改。

14. 如何查看PID为29394的进程的环境变量?

答案: cat /proc/29394/environ

15. 请找出 /home下所有5天前以.log结尾的文件列表?

答案:find /home/ -name “*.log”  -mtime +5

16. linux软链接和硬链接的区别?

答案:软链接相当于windows的快捷方式,源文件删除软链接不可用,硬链接的文件对应同一个inode,源文件删除硬链接的文件可以用。软链接支持目录,硬链接不支持。

17. 当io出现瓶颈时,应该查看哪个参数,为什么?

答案: vmstat 1 查看wa列,wa列表示处于等待状态的cpu百分比,当IO比较慢时,CPU会有大量的wait。

18. 在 bash 里 $0  $?  $*  $@各表示什么意思?

答案:

$0 Shell本身的文件名

$?最后运行的命令的返回值

$*所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数

$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

1.linux如何挂在windows下的共享目录
mount.cifs //192.168.1.3/server /mnt/server -o user=administrator,pass=123456

 

linux 下的server需要自己手动建一个  后面的user与pass 是windows主机的账号和密码 注意空格 和逗号

 

2.查看http的并发请求数与其TCP连接状态
    
netstat -n | awk '/^tcp/ {++b[$NF]} END {for(a in b) print a, b[a]}'


还有ulimit -n 查看linux系统打开最大的文件描述符,这里默认1024,不修改这里web服务器修改再大也没用。若要用就修改很几个办法,这里说其中一个:

修改/etc/security/limits.conf

* soft nofile 10240
* hard nofile 10240
 

重启后生效

 

3.用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -5 


4.查看当前系统每个IP的连接数
   

ls /var/log/ -lR| grep "^-" |wc -l

 


5.查看当前系统每个IP的连接数

    
netstat -n | awk '/^tcp/ {print $5}'| awk -F: '{print $1}' | sort | uniq -c | sort -rn

6.shell下32位随机密码生成
    
cat /dev/urandom | head -1 | md5sum | head -c 32 >> /pass

将生成的32位随机数 保存到/pass文件里了

 

7.统计出apache的access.log中访问量最多的5个IP
    
 cat access_log | awk  '{print $1}' | sort | uniq -c | sort -n -r | head -5

8.如何查看二进制文件的内容

我们一般通过hexdump命令 来查看二进制文件的内容。

hexdump -C XXX(文件名)  -C是参数 不同的参数有不同的意义

-C  是比较规范的 十六进制和ASCII码显示

-c  是单字节字符显示

-b  单字节八进制显示

-o  是双字节八进制显示

-d  是双字节十进制显示

-x  是双字节十六进制显示
 

等等等等

 

9.ps aux 中的VSZ代表什么意思,RSS代表什么意思

VSZ:虚拟内存集,进程占用的虚拟内存空间

RSS:物理内存集,进程战用实际物理内存空间

 

10.检测并修复/dev/hda5

fsck用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查,用法:

 
11.Linux系统的开机启动顺序
 

加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者5,3是多用户命令行,5是界面)–>init进程执行rc.syninit–>启动内核模块–>执行不同级别运行的脚本程序–>执行/etc/rc.d/rc.local(本地运行服务)–>执行/bin/login,就可以登录了。

 

12.符号链接与硬链接的区别

我们可以把符号链接,也就是软连接 当做是 windows系统里的 快捷方式。
硬链接 就好像是 又复制了一份.

ln -s 3.txt 4.txt  这是软连接,相当于快捷方式。修改4,3也会跟着变,若删除3,4就坏掉了。不可以用了。

 

13.保存当前磁盘分区的分区表

dd 命令是以个强大的命令,在复制的同时进行转换
   
dd if=/dev/sda of=./mbr.txt bs=1 count=512

14..没有14题,我自己来个简单的,如何在文本里面进行复制、粘贴,删除行,删除全部,按行查找和按字母查找。

以下操作全部在命令行状态操作,不要在编辑状态操作。
在文本里 移动到想要复制的行  按yy  想复制到哪就移动到哪,然后按P  就黏贴了
删除行  移动到改行 按dd
删除全部  dG  这里注意G一定要大写

按行查找  :90 这样就是找到第90行

按字母查找 /path  这样就是 找到path这个单词所在的位置,文本里可能存在多个,多次查找会显示在不同的位置。

 

15.手动安装grub

grub-install /dev/sda

16.修改内核参数

vi /etc/sysctl.conf  这里修改参数
sysctl -p  刷新后可用

 

17.在1-39内取随机数

echo $[$RANDOM%39]

RANDOM 随机数

%39 取余数

 

18.限制apache每秒新建连接数为1,峰值为3

每秒新建连接数 一般都是由防火墙来做,apache本身好像无法设置每秒新建连接数,只能设置最大连接:    
iptables -A INPUT -d 172.16.100.1 -p tcp –dport 80 -m limit –limit 1/second  -j ACCEPT

硬件防火墙设置更简单,有界面化,可以直接填写数字。。。

最大连接 apache本身可以设置

MaxClients 3  ,修改apache最大连接 前提还是要修改系统默认tcp连接数。我博客里也说了,这就不说了。

 

19.FTP的主动模式和被动模式

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XX端口,你过来连接我”。于是服务器从20端口向客户端的 XX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XX端口,你过来连接我”。于是客户端向服务器的XX端口 发送连接请求,建立一条数据链路来传送数据。
 

从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完 全不同。

 

20.显示/etc/inittab中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行
    

grep "^# \{1,\}[^ ]" /etc/inittab

 


21.显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行
    grep "\:[0-9]\{1\}\:" /etc/inittab

22.怎么把脚本添加到系统服务里,即用service来调用

在脚本里加入  
#!/bin/bash
# chkconfig: 345 85 15
# description: httpd

然后保存

chkconfig httpd –add  创建系统服务

现在就可以使用service 来 start or restart

 

 

23.写一个脚本,实现批量添加20个用户,用户名为user1-20,密码为user后面跟5个随机字符

#!/bin/bash
#description: useradd
for i in `seq -f"%02g" 1 20`;do
useradd user$i
echo "user$i-`echo $RANDOM|md5sum|cut -c 1-5`"|passwd –stdinuser$i >/dev/null 2>&1
done

24.写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线
    
#!/bin/bash
for ip in `seq 1 255`
  do
    {
     ping -c 1 192.168.1.$ip > /dev/null 2>&1
     if [ $? -eq 0 ]; then
          echo 192.168.1.$ip UP
     else
          echo 192.168.1.$ip DOWN
     fi
   }&
done
wait

25.写一个脚本,判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出其它任何键可以通过vim打开这个指定的脚本

    
[root@localhost tmp]# cat checksh.sh
#!/bin/bash
read -p "please input check script->" file
if [ -f $file ]; then
    sh -n $file > /dev/null 2>&1
if [ $? -ne 0 ]; then
    read -p “You input $file syntax error,[Type q to exit or Type vim toedit]” answer
    case $answer in
    q | Q)
exit 0
;;
vim)


26、写一个脚本:(26包括3个小题)

1、创建一个函数,能接受两个参数:

1)第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置;

2)如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本;

3)如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则返回0给调用脚本,否则,返回52给调用脚本;

    
[root@localhost tmp]# cat downfile.sh
#!/bin/bash
url=$1
dir=$2
download()
  {
    cd $dir >> /dev/null 2>&1
    if [ $? -ne 0 ];then
        read -p "$dir No such file or directory,create?(y/n)" answer
    if [ "$answer" == "y" ];then
        mkdir -p $dir
        cd $dir
        wget $url 1> /dev/null 2>&1
    if [ $? -ne 0 ]; then
        return "52"
    fi
    else
    return "51"
    fi
    fi
}
download $url $dir
echo $?

27、写一个脚本:(27包括2个小题)

1、创建一个函数,可以接受一个磁盘设备路径(如/dev/sdb)作为参数;在真正开始后面步骤之前提醒用户有危险,并让用户选择是否继续;而后将此磁盘设备上的所有分区清空(提示,使用命令dd if=/dev/zero of=/dev/sdb bs=512 count=1实现,注意其中的设备路径不要写错了;

如果此步骤失败,返回67给主程序;

接着在此磁盘设备上创建两个主分区,一个大小为100M,一个大小为1G;如果此步骤失败,返回68给主程序;
格式化此两分区,文件系统类型为ext3;如果此步骤失败,返回69给主程序;

如果上述过程都正常,返回0给主程序;

2、调用此函数;并通过接收函数执行的返回值来判断其执行情况,并将信息显示出来;
local Darray=(`ls /dev/sd[a-z]`) for i in ${Darray};do [[ "$i" == "$1" ]] && Sd=$i &&break done else return66 fi #当匹配成功,进入选择,告诉用户,是否继续,输错的话进入无限循环,当用户选择Y,则清空目标分区,且跳出while循环 
    
local Darray=(`ls /dev/sd[a-z]`)
for i in ${Darray};do
  [[ "$i" == "$1" ]] && Sd=$i &&break
done
  else
  return66
  fi
#当匹配成功,进入选择,告诉用户,是否继续,输错的话进入无限循环,当用户选择Y,则清空目标分区,且跳出while循环
while :;do
    read -p "Warning!!!This operation will clean $Sd data.Next=y,Quit=n [y|n]:" Choice
    case $Choice in
y)
   dd if=/dev/zero of=$Sd bs=512 count=1 &> /dev/null &&break || return 67 ;;
n)
   exit 88 ;;
*)
   echo "Invalid choice,please choice again." ;;
esac
done

#使用echo传递给fdisk进行分区,如果此命令失败,则跳转出去,错误值68,需要注意的是,有时候这个返回值很诡异,笔者之前成功与否都是返回的1,后来重启之后,就好了,如果慎重的话,可以对创建的分区,进行判断,不过就需要使用其他工具截取相关字段了,虽有些小麻烦,但无大碍
  
echo-e "n\np\n1\n\n+100M\nn\np\n2\n\n+1024M\nw\n"|fdisk /dev/sdb&> /dev/null || return 68

#格式化之前,让内核重新读取磁盘分区表,值得注意的是,有的系统版本,使用partprobe无效,譬如笔者的环境是rhel5.8,而rhel6.0以后,这个命令就很危险了,而使用partx -a /dev/sdb则效果更好…此项需慎重,如果格式化失败,则告知把失败的分区定义成变量,且跳出函数,并带出错误值69  
`partprobe`
Part=`fdisk -l /dev/$Sd|tail -2|cut -d” ” -f1`
for M in ${Part};do
   mke2fs -j $M &> /dev/null && ErrorPart=$M &&return 69
done
  return 0
}

你可能感兴趣的:(linux)