搜索了许多linux面试的题目,但是许多都没有答案,本着分享交流的态度,把搜狐Linux运维工程师面试真题做了,答案可以有不严谨的地方,请多多指教!
题目来自:
https://blog.csdn.net/Ki8Qzvka6Gz4n450m/article/details/79119677


搜狐对Linux运维工程师招聘岗位的面试题:
~~~~~~~~~~~~~~~~~~~~~~~~~

1、如何判断 MySQL 主从是否同步?该如何使其同步?

~~~~~题目和答案分界线~~~~~

mysql> show slave status\G #查看是否都为yes
Slave_IO_Running
Slave_SQL_Running

~~~~~~~~~~~~~~~~~~~~~~~~~

2、MySQL 的 InnoDB 如何定位锁问题,MySQL 如何减少主从复制延迟?

~~~~~题目和答案分界线~~~~~
mysql的innodb如何定位锁问题:
在使用 show engine innodb status检查引擎状态时,发现了死锁问题:
在5.5中,information_schema库中增加了三个关于锁的表(MEMORY引擎):innodb_trx ## 当前运行的所有事务innodb_locks ## 当前出现的锁innodb_lock_waits ## 锁等待的对应关系

mysql如何减少主从复制延迟:
如果延迟比较大,就先确认以下几个因素:

  1. 从库硬件比主库差,导致复制延迟
  2. 主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。更高版本的mysql可以支持多线程复制
  3. 慢SQL语句过多
  4. 网络延迟
  5. master负载,主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层
  6. slave负载,一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作.
    另外, 2个可以减少延迟的参数:
    –slave-net-timeout=seconds 单位为秒 默认设置为 3600秒
    #参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
    –master-connect-retry=seconds 单位为秒 默认设置为 60秒
    #参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。
    通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟
    MySQL数据库主从同步延迟解决方案
    最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    3、OSI 七层模型,TCP三次握手过程,TCP 连接断开过程,什么情况下 TCP 进入 time_wait?

    ~~~~~题目和答案分界线~~~~~
    第一问,三次握手:
    1.建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认;
    2.服务器收到syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
    3.客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
    ~~~~~~~~~
    第二问,TCP连接断开,第四次断开,主动断开的一方进入TIME_WAIT状态。
    扩充:
    四次断开:
    1、客户端发送FIN包,进入FIN_WAIT_1状态。2、 服务器端收到FIN包,发送ACK表示确认,进入CLOSE_WAIT状态。客户端收到FIN的确认报文段,进入FIN_WAIT_2状态。3、服务器端发送FIN报文端,进入LAST_ACK状态。4、 客户端收到FIN报文端,发送FIN的ACK,同时进入TIME_WAIT状态,启动TIME_WAIT定时器,超时时间设为2MSL(最大报文段生存时间)。5、 服务器端收到FIN的ACK,进入CLOSED状态。6、客户端在2MSL时间内没收到对端的任何响应,进入CLOSED状态。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:四次断开看似很可靠,四个报文都发送完毕,直接进入CLOSE状态了,但是假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
~~~~~~~~~~~~~~~~~~~~~~~~~

4、什么是跨站脚本***,有何危害,SQL 注入***如何防范?

~~~~~题目和答案分界线~~~~~
跨站脚本***(也称为XSS):指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。***者通过在链接中插入恶意代码,就能够盗取用户信息。

  1. 在 防止sql注入的时候经常会使用sql 参数化 或者是 过滤掉一些非法关键字。如果采用的是过滤一些非法关键字 如下: "and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|script|script|object|-|@|&|;|$|%|'|\|+| <|>|CR|LF|,"; 这些关键字。其中 and 这个关键字 可能在英文版本的项目中会在普通的内容中出现 这个词。如果过滤掉了 内容就不对了。 还有 中划线 “-” 因为 在sql 中 两个中划线 在一起表示注释。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    5、海量文件如何存储?

    ~~~~~题目和答案分界线~~~~~
    使用分布式存储,如mfs、hadoop等
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    6、如何重置 MySQL Root 密码?

    ~~~~~题目和答案分界线~~~~~
    一、 在已知MYSQL数据库的ROOT用户密码的情况下,修改密码的方法:
    1,shell环境下:
    ]#mysqladmin –u root –p password “新密码” 回车后要求输入旧密码
    2,mysql>环境下:
    2.1

    mysql>Update mysql.user  set  password=password(‘新密码’)  where  user=’root’ and host='localhost';
    mysql>flush  privileges;

    2.2
    mysql>grant all on *.* to root@’localhost’ identified by ‘新密码’;
    二、 如查忘记了mysql数据库的ROOT用户的密码:

    ]#systemctl stop mysqld
    ]#vim /etc/my.cnf   // [mysqld]下面添加skip-grant-table(修改完后在注释)
    ]#systemctl restart mysqld
    ]#mysql -u   root
    Mysql> update mysql.user set password=password(‘新密码’)  where
    user="root" and host="localhost";
    Mysql> flush   privileges;
    ]#vim /etc/my.cnf   // [mysqld]下面注销skip-grant-table
    ]#systemctl restart mysqld

    ~~~~~~~~~~~~~~~~~~~~~~~~~

    7、把 /data 目录及其子目录下所有以扩展名 .txt 结尾的文件中包含 magedu 的字符串全部替换为 magestudy。(脚本1)

    ~~~~~题目和答案分界线~~~~~

    [root@luc ~]# find /data -type f -name "*".txt | xargs sed -i 's/magedu/magestudy/g'

    注:| 和xargs区别:echo '--help' | cat 输出--help
    echo '--help' | xargs cat 输出为cat --help的结果
    思考:把/data目录和子目录下以扩展名 .txt 文件名中包含magedu替换成magestudy

    [root@luc ~] # find /data -type f -name "*magedu*.txt" | awk -F "magedu" '{print "mv " $1"magedu"$2 " " $1"magesudy"$2}' |sh

    注:-F "magedu" 是将magedu当作分隔符
    |sh 是将前面的输出的内容当作命令执行。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    8、创建目录/data/sohu,并且在该目录下创建文件sohu.txt,然后在文件“magedu.txt”里写入内容“inet addr : 10.1.0.8 Bcast : 10.1.0.255 Mask : 255.255.255.1 ”(不包含引号)

    ~~~~~题目和答案分界线~~~~~

    [root@luc ~] # mkdir -p /data/sohu  &&  touch /data/sohu/sodu.txt
    [root@luc ~] # echo "inet addr : 10.1.0.8 Bcast : 10.1.0.255 Mask : 255.255.255.1" > /data/sohu/magedu.txt

    注:系统命令的考察,mkdir touch
    -p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
    "&&" 表示前一条命令执行成功时,才执行后一条命令 。
    ">" 重定向输入,如果输入的文件不存在,会创建。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    9、脚本计算1+2+3…. +100=?(脚本2)

    ~~~~~题目和答案分界线~~~~~

    #! /usr/bin/bash
    for i in {1..100}
    do
         let sum+=$i
    done
    echo "$sum"

    注:方法很多,也可以用while语句,上面脚本中的let sum+=$i 可以修改成((sum+=i))
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    10、Apache 和 MySQL 两种服务能否装在同一台机器上,如何查看 Apache 和MySQL 端口和进程?

    ~~~~~题目和答案分界线~~~~~
    如果访问量不大,可以装在同一台主机上。

    ]#ss -anptu | grep :80            //httpd监听端口80
    ]# ps -C httpd
    ]# ss -anptu | grep :3306        //mysqld监听端口3306
    ]# ps -C mysqld

    ~~~~~~~~~~~~~~~~~~~~~~~~~

    11、如何在一台虚拟机上同时部署4个网站,访问域名分别是 www.sohu1.net www.sohu2.net test1.magedu.net test2.magedu.net

    ~~~~~题目和答案分界线~~~~~
    httpd配置虚拟主机:(virthost.conf,为配置文件名,可以取任意名字,但后缀名必须为.conf)

    [root@luc ~]# yum -y install httpd
    [root@luc ~]# mkdir /var/www/sohu1
    [root@luc ~]# mkdir /var/www/sohu2
    [root@luc ~]# mkdir /var/www/test1
    [root@luc ~]# mkdir /var/www/test2
    [root@luc ~]# echo "sohu1" > /var/www/sohu1/index.html
    [root@luc ~]# echo "sohu2" > /var/www/sohu2/index.html
    [root@luc ~]# echo "test1" > /var/www/test1/index.html
    [root@luc ~]# echo "test2" > /var/www/test2/index.html
    [root@luc ~]# vim /etc/httpd/conf.d/virthost.conf
    <VirtualHost *:80>
        ServerName www.sohu1.net
        DocumentRoot /var/www/sohu1
    </VirtualHost>
    <VirtualHost *:80>
        ServerName www.sohu2.net
        DocumentRoot /var/www/sohu2
    </VirtualHost>
    <VirtualHost *:80>
        ServerName test1.magedu.net
        DocumentRoot /var/www/test1
    </VirtualHost>
    <VirtualHost *:80>
        ServerName test2.magedu.net
        DocumentRoot /var/www/test2
    </VirtualHost>
    [root@luc ~]# systemctl restart httpd

    nginx配置虚拟主机:(先停systemctl stop httpd,httpd释放80端口)

    [root@luc nginx]# tar xf nginx-1.8.0.tar.gz 
    [root@luc ~]# cd /root/nginx-1.8.0/
    [root@luc nginx-1.8.0]## ./configure --prefix=/usr/local/nginx --with-http_ssl_module
    [root@luc nginx-1.8.0]## make
    [root@luc nginx-1.8.0]## make install
    [root@luc ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen  80;
        server_name www.sohu1.net;
        root sohu1;
        index index.html index.htm;
          }
    server {
        listen  80;
        server_name www.sohu2.net;
        root sohu2;
        index index.html index.htm;
          }
    server {
        listen  80;
        server_name test1.magedu.net;
        root test1;
        index index.html index.htm;
          }
    server {
        listen  80;
        server_name test2.magedu.net;
        root test2;
        index index.html index.htm;
          }
    [root@luc ~]# mkdir /usr/local/nginx/sohu1
    [root@luc ~]# mkdir /usr/local/nginx/sohu2
    [root@luc ~]# mkdir /usr/local/nginx/test1
    [root@luc ~]# mkdir /usr/local/nginx/test2
    [root@luc ~]# echo "sohu1" > /usr/local/nginx/sohu1/index.html
    [root@luc ~]# echo "sohu2" > /usr/local/nginx/sohu2/index.html
    [root@luc ~]# echo "test1" > /usr/local/nginx/test1/index.html
    [root@luc ~]# echo "test2" > /usr/local/nginx/test2/index.html
    [root@luc ~]# /usr/local/nginx/sbin/nginx 

    注:以上内容均是实验测试成功,需要关闭selinux和firewall。
    查看服务是否起来可以用命令ss或netstat

    [root@luc ~]# ss -anptu | grep :80
    tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=23716,fd=6),("nginx",pid=23715,fd=6))

    /usr/local/nginx/conf/nginx.conf 配置文件添加server是在http{}内添加,如果位置放的不正确,服务起不来。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    12、统计一下 /var/log/nginx/access.log 日志中访问量最多的前十个 IP?(脚本3)

    ~~~~~题目和答案分界线~~~~~

    [root@luc ~]# cat /var/log/httpd/access_log | awk '{a[$1]++}END{for(i in a){print a[i],i}}' |sort -rn | head -10
    [root@luc ~]# cat /var/log/httpd/access_log | awk '{print $1}' |sort -rn |uniq -c | head -10

    注:linux中实用工具awk,sort,uniq,head的使用
    方法1:数组使用,类似于键值对,键是ip,值是叠加的数字(ip出现的次数)
    方法2:主要是用uniq -c 去除重复多余的ip(去重)并统计数量
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    13、怎么查看当前系统中每个 IP 的连接数,怎么查看当前磁盘的 IO,怎么查看当前网络的 IO?

    ~~~~~题目和答案分界线~~~~~
    IP连接数:
    ]# netstat -n | awk '/^tcp/{print $4}' | awk -F : '{print $1}'|sort|uniq -c
    查看当前磁盘IO: iostat
    查看当前网络IO: iotop
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    14、写一个脚本,实现批量添加20个用户,用户名为:user1-20,密码为 user 后面跟着5个随机字符或数字。(脚本4)

    ~~~~~题目和答案分界线~~~~~
    方法1:(利用tr工具和/dev/urandom文件获取密码)

    #! /usr/bin/bash
    for i in {1..20}
    do
        pass_tmp=`tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 5`
        useradd user$i
        echo "user$pass_tmp" | passwd --stdin user$i
                echo "user$i     user$pass_tmp " >> /root/.user_pass
    done

    方法2:(利用字符串切片和求余方式获取随机密码)

    #! /usr/bin/bash
    pass_gen(){              
        key='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
        num=${#key}
        pass=“”
        for i in {1..5}
        do
                index=$[RANDOM%num]
                pass=$pass${key:index:1}
        done
        echo $pass
    }
    for i in {1..20}
    do
        useradd user$i
        p=`pass_gen`
        echo "user$p" | passwd --stdin user$i
                echo "user$i     user$p " >> /root/.user_pass
    done

~~~~~~~~~~~~~~~~~~~~~~~~~

15、dmesg 命令中看到 ip-conntrack:table full,dropping packet,如何解决?

~~~~~题目和答案分界线~~~~~

方法一:
把/proc/sys/net/netfilter/nf_conntrack_max参数设置更大,连接跟踪表被填满以后,就会发生丢包,导致网络不稳定。当这张表满了,就会在日志里面写入该信息。

[root@luc ~]# sysctl -w net.nf_conntrack_max=100000    //或者修改更大
[root@luc ~]# cat /proc/sys/net/netfilter/nf_conntrack_max

方法二:
不使用ip_conntrack,nf_conntrack_ipv4,xt_state模块
方法三:
使用 raw 表,不跟踪连接

 [root@luc ~]# iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
 [root@luc ~]# iptables -t raw -A PREROUTING -p tcp -m multiport --dport 80,81,82 -j NOTRACK
[root@luc ~]#  iptables -t raw -A PREROUTING -p tcp -m multiport --sport 80,81,82 -j NOTRACK

ip-contrack详细解释链接:
http://www.cnblogs.com/mydomain/archive/2013/05/19/3087153.html
https://testerhome.com/topics/7509
~~~~~~~~~~~~~~~~~~~~~~~~~

16、varnish nginx squid 各自缓存的优缺点

~~~~~题目和答案分界线~~~~~
Varnish
高性能、开源的反向代理服务器和内存缓存服务器。
优点:

  1. 高性能;2. 多核支持;3. 支持0-60秒的精确缓存时间。
    缺点:
  2. 不具备自动容错和恢复功能,重启后数据丢失;
  3. 在线扩容比较难。
  4. 32位机器上缓存文件大小为最大2GB;
  5. 不支持集群。
    应用场景:并发要求不是很大的小型系统和应用
    Squid
    Squid,很古老的反向代理软件,拥有传统代理、身份验证、流量管理等高级功能,但是配置太复杂。它算是目前互联网应用得最多的反向缓存代理服务器,工作于各大古老的cdn上,squid的优势在于完整的庞大的cache技术资料,和很多的应用生产环境。
    Nginx
    1.不支持带参数的动态链接
    2.Nginx缓存内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。
    3.只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
    4.Nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    17、查询 DNS 的深层结构

    ~~~~~题目和答案分界线~~~~~
    当 DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS 服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。
    ● 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 。
    ● 指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。
    ● DNS域名的指定类别。
    对于DNS 服务器,它始终应指定为Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如im.qq.com,并且指定的查询类型用于通过该名称搜索地址资源记录。
    DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他DNS 服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归。
    另外,客户机自己也可尝试联系其他的 DNS 服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代,即DNS服务器之间的交互查询就是迭代查询。
    1、在浏览器中输入www.qq.com 域名, 操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
    2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
    3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
    4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
    5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com 主机。
    6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
    从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    18、LVS 的三种模式

    ~~~~~题目和答案分界线~~~~~
    一、NAT模式(VS-NAT)
    原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。
    二、IP隧道模式(VS-TUN)
    原理:首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议所以,在RS的内核中,必须编译支持IPTUNNEL这个选项。
    三、直接路由模式(VS-DR)
    原理:负载均衡器和RS都使用同一个IP对外服务但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    19、lvs/nginx/haproxy优缺点

    ~~~~~题目和答案分界线~~~~~
    Nginx的优点是:
    1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。
    2、Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;
    3、Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
    3、可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。
    4、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
    5、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
    6、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。
    7、Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
    8、Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。
    Nginx的缺点是:
    1、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
    2、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。
    LVS
    LVS:使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
    LVS的优点是:
    1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
    2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
    3、工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived。
    4、无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
    5、应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等。
    LVS的缺点是:
    1、软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
    2、如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有WindowsServer的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
    HAProxy
    HAProxy的特点是:
    1、HAProxy也是支持虚拟主机的。
    2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
    3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
    4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以LVS+Keepalived对MySQL主从做负载均衡。
    5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种:
    ①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
    ② static-rr,表示根据权重,建议关注;
    ③leastconn,表示最少连接者先处理,建议关注;
    ④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
    ⑤ri,表示根据请求的URI;
    ⑥rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
    ⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
    ⑧rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    20、Linux 系统监控命令,查看 CPU 负载内存等情况

    ~~~~~题目和答案分界线~~~~~
    查看CPU:uptime或者top, w
    查看内存:free -h
    查看磁盘:df -h
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    21、查看网络流量的命令

    ~~~~~题目和答案分界线~~~~~
    ]# watch -n 1 "/sbin/ifconfig eth0 | grep bytes"
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    22、Docker 四中网络模式

    ~~~~~题目和答案分界线~~~~~
    1.host模式
    众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,NetworkNamespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
    例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
    2.container模式
    在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
    3.none模式
    这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
    4.bridge模式
    bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。host模式使用Docker run时使用–net=host指定 Docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip。
    扩充:
    docker常用命令

  6. docker version 查看docker的版本号,包括客户端、服务端、依赖的Go等
  7. docker info 查看系统(docker)层面信息,包括管理的images, containers数等
  8. docker search <image>在docker index中搜索image
  9. docker pull <image>从docker registry server 中下拉image
  10. docker push <image|repository>推送一个image或repository到registry
  11. docker push<image|repository>:TAG 同上,指定tag
  12. docker inspect <image|container>查看image或container的底层信息
  13. docker images 查看本机images
  14. docker images –a 列出所有的images
  15. dockerps默认显示正在运行中的container
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    23、实现高可用工具有哪些

    ~~~~~题目和答案分界线~~~~~
    hearbeat
    keepalived
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    24、MySQL 数据备份工具

    ~~~~~题目和答案分界线~~~~~
    mysqldump工具
    Mysqldump是mysql自带的备份工具,目录在bin目录下面:/usr/local/mysql/bin/mysqldump,支持基于innodb的热备份。但是由于是逻辑备份,所以速度不是很快,适合备份数据比较小的场景。Mysqldump完全备份+二进制日志可以实现基于时间点的恢复。
    基于LVM快照备份
    在物理备份中,有基于文件系统的物理备份(LVM的快照),也可以直接用tar之类的命令对整个数据库目录进行打包备份,但是这些只能进行泠备份,不同的存储引擎备份的也不一样,myisam自动备份到表级别,而innodb不开启独立表空间的话只能备份整个数据库。
    tar包备份
    percona提供的xtrabackup工具
    支持innodb的物理热备份,支持完全备份,增量备份,而且速度非常快,支持innodb存储引起的数据在不同数据库之间迁移,支持复制模式下的从机备份恢复备份恢复,为了让xtrabackup支持更多的功能扩展,可以设立独立表空间,打开 innodb_file_per_table功能,启用之后可以支持单独的表备份。
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    25、Awk 和 SED 的区别(脚本相关5)

    ~~~~~题目和答案分界线~~~~~
    简单说:
    AWK:过滤,适合按列(域)操作,
    SED:编辑,适合按行操作
    共同点:逐行处理
    (grep 用于搜索某些字符串,显示整行; awk比grep搜索的更精细,可以搜索到行的某个字段。)

详细解释:
AWK:通过指定分隔符将一行(一条记录)划分为多个字段,以字段为单位处理文本。
格式:awk [选项] 'BEGIN{指令} 条件{指令} END{指令}' 文件
选项: -F 指定分隔符 , -v 变量名=值
条件:
/正则/ 对整行匹配 模糊匹配
$1~/正则/ 匹配 对第一列
$1!~/正则/ 不匹配
== != > >= < <= 精确匹配(字符,数字)
&& || $1=="root" && $7~/bash/
+-/% ++ -- += = /=
指令: print $1 $2 NF NR x++

SED:是一个非交互性文本编辑器。
格式:sed 【选项】 ‘条件指令’ 文件
选项:-i 修改源文件 ,-n 屏蔽默认输出,-r 支持扩展正则
条件:没有(所有行),行号3p;5p,/正则/
指令:p 打印print,d 删除delete,s 替换substitution s/old/new/ 三个分隔符不能少
a 追加append,i 插入insert,c 替换change
~~~~~~~~~~~~~~~~~~~~~~~~~

26、介绍 CDN 的作用

~~~~~题目和答案分界线~~~~~
CDN加速简单的来说,就是把原服务器上数据复制到其他服务器上,用户访问时,那台服务器近访问到的就是那台服务器上的数据。CDN加速优点是成本低,速度快。可以用CDN best的CDN进行加速,免费,可部署私有,公有CDN系统。可以实现宕机检测,自动切换ip,分线路,分组解析。也就是
CDN加速的主要作用就是保证网站的正常访问,及加快网站访问速度和响应速度,防止网站因******,DNS解析劫持故障等导致的网站服务器的宕机状况的出现。
~~~~~~~~~~~~~~~~~~~~~~~~~

27、KeepAlive 的工作原理和如何做到健康检查

~~~~~题目和答案分界线~~~~~
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
Keepalived健康检查方式配置
HTTP_GET|SSL_GET
HTTP_GET | SSL_GET
{
url {
path /# HTTP/SSL 检查的url可以是多个
digest <STRING> # HTTP/SSL 检查后的摘要信息用工具genhash生成
status_code 200# HTTP/SSL 检查返回的状态码
}
connect_port 80 # 连接端口
bindto<IPADD>
connect_timeout 3 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 2 #连接间隔时间
}
~~~~~~~~~~~~~~~~~~~~~~~~~

28、Squid 的默认缓存大小是多少?

~~~~~题目和答案分界线~~~~~
1024M
~~~~~~~~~~~~~~~~~~~~~~~~~

29、查看 Linux 系统的所有配置的命令(除了 CPUInfo 和 MEInfo)

~~~~~题目和答案分界线~~~~~
常用命令:
查看CPU信息:cat/proc/cpuinfo ; lscpu
查看内存信息:cat /proc/meminfo ; free -h ; vmstat
查看系统体系结构:uname -a
查看系统硬盘信息和使用情况:fdisk – l ; df -h
查看系统挂载情况:lsblk
查看网卡分配ip和流量使用情况:ifconfig

不常用:
查看主板的序列号: dmidecode | grep -i ’serialnumber’
查看板卡信息:cat /proc/pci ; lspci
查看显卡/声卡信息:lspci |grep-i 'VGA'
查看网卡信息:lspci | grep -i 'eth'
查看键盘和鼠标:cat /proc/bus/input/devices
查看各设备的中断请求(IRQ):cat /proc/interrupts

~~~~~~~~~~~~~~~~~~~~~~~~~

30、用 Shell 脚本或命令将/opt目录下的大于15KB的文件都移到/tmp目录下。(脚本6)

~~~~~题目和答案分界线~~~~~
方法1:(判断文件和判断文件大小分开)

#! /usr/bin/bash
for i in `ls /opt`
do
        if test -f $i ; then
                if test `ls -l /opt/$i | awk '{print $5}'` -gt 15000 ;then
                       mv /opt/$i  /tmp
                fi
        fi
done

方法2:(判断文件和判断大小在同一条命令里)
注:grep -v ^d 不能改成grep -v ^- 因为 ls -l 显示的第一个字段的首个字母不一定是-,还可能是l链接等文件类型 。

#! /usr/bin/bash
for i in `ls -l /opt |grep -v ^d |awk '{if($5>15000){print $9}}'`
do
        mv /opt/$i  /tmp
done

扩展:
用find命令可以查找/opt整个目录下包含子目录下的所有于15k的文件,
而上面两种方法用的是ls -l命令,仅仅是对/opt目录下(不包括子目录)的文件操作。

[root@luc ~]# find /opt -type f -size +15k -exec mv {} /tmp \;

~~~~~~~~~~~~~~~~~~~~~~~~~
31、写过哪些 Python 脚本?(脚本7)
用python写测试192.168.1.0/24网段的哪些主机在线,哪些不在线。

#! /usr/bin/python
# coding:utf-8
import subprocess
import threading

# define function myping 
def myping(ip):
    x = subprocess.call('ping -i0.1 -w1 -c2 %s &>/dev/null' % ip, shell=True)
    if x == 0:
        print "%s is up" % ip
    else:
        print "%s is down" % ip

l = ['192.168.1.%d' % i for i in range(1, 255)]
for i in l:
    t = threading.Thread(target=myping, args=[i])
    t.start()

共勉:I hear and I forget , I see and I remember, I do and I understand!

网络参看资料:
http://www.magedu.com/73536.html