运维面试题

此为看尚硅谷Linux运维面试题(大厂linux面试题攻略) 的学习笔记

1. 简述Raid 0 、Raid1、Raid 5、Raid 10 的特点与原理。

分析:最好画图讲解,比较直观。


2. 软Raid与硬Raid的区别?
  • 软Raid:是由操作系统模拟的Raid,一旦硬盘损坏,操作系统也会损坏,Raid会丧失作用。
  • 硬Raid:是独立于硬盘之外,硬件Raid卡组成;就算硬盘损坏,也不会导致Raid卡损坏,硬盘容错才能起作用。

3. 简述Linux启动的过程

CentOS 6.x

  1. 加电自检,加载BOIS信息,BOIS进行系统检测
  2. 加载启动引导grub
  3. 由grub加载系统内核(这里也加载一些必要驱动)
  4. 内核重新自检,并加载硬件驱动
  5. 由内核启动系统第一个进程/sbin/init
  6. 由/sbin/init进程调用/etc/init/rcS.conf,进行系统初始化配置
  7. 由/etc/init/rcS.conf调用/etc/inittab,确认 系统默认运行级别
  8. 确认默认运行级别后,调用/etc/init/rc.conf配置文件
  9. 运行相应的运行级别目录/etc/rc[0-6].d中的配置文件
  10. 在启动登录界面之前,执行/etc/rc.d/rc.local中的程序

CentOS 7.x

  1. 加电自检,加载BOIS信息,BOIS进行系统检测
  2. 加载启动引导grub2
  3. 由grub加载系统内核(这里也加载一些必要驱动)
  4. 内核重新自检,并加载硬件驱动
  5. 内核启动系统的第一个进程,也就是systemd
  6. systemd开始调用默认单元组(default.target),并按照默认单元组开始运行子单元组
    • systemd调用sysinit.target单元组,初始化系统。
    • systemd调用basic.target单元组,准备操作系统。
    • systemd调用multi-user.tartget单元组,启动字符界面所需程序。
    • systemd调用multi-user.target单元组中的/etc/rc.d/rc.local文件,执行文件中的命令。
    • systemd调用multi-user.target单元组中的getty.tartget单元组。初始化本地终端(tty)及登陆界面,如果字符集界面启动,到此启动完成。

CentOS 6.x 与CentOS 7.x的启动区别
前者到第5步开始线性的一个进程调用一个进程来启动;
后者到第5步调用第一个进程后开始并发式(瀑布式)的调用所需启动的进程。


4. 如何进行Linux系统优化?
  1. 禁用不需要的服务
    ntsysv命令最方便
  2. 避免直接使用root用户,普通用户通过sudo授权操作
  3. 通过chattr锁定重要文件,需要用的时候再解锁
    /etc/passwd
    /etc/shadow
    /etc/grup
    /etc/gshadow
    /etc/inittab
  4. 配置国内yum源,加快下载速度
  5. 配置系统同时打开最大文件数
    vim /etc/profile
    ulimit -SHn 65535
  6. 同步时间服务器(比如mysql主从复制就要求高度同步时间)
    ntpdtae ntp1.aliyun.com
    通过crond定时任务,让时间同步命令没一个小时执行一次
  7. 修改ssh服务的默认端口,配置ssh秘钥对登录
  8. 配置合理的iptables防火墙规则
  9. 配置SELinux安全上下文(很复杂,很多公司服务器是直接关掉的)
  10. 指定合理的监控策咯
  11. 定时备份系统重要文件

5. 哪些设置能够提升SSH远程管理的安全等级?
  • ssh的登录验证
            通过密钥对登录
  • ssh端口与监听
          vim /etc/ssh/sshd_config
            Port 22222
            ListtenAdress <u>本机本地IP</u>
            #通过监听自己本地IP地址,来实现限制外网登录。也可以通过防火墙来指定访问IP,推荐使用白名单

  • ssh的登录用户限制
            vim /etc/ssh/sshd_config
            #PermitRootLogin no                 #不让root用户远程登录
  • ssh的超时限制
            vim /etc/profile            #在文件最末加入以下。配置完加载一下
            export TMOUT=300   #默认为s
  • ssh的最大登录失败设置
            vim /etc/ssh/sshd_config
            #MaxAuthTries 6

6. ssh连接时认证时间过长如何解决?
vim /etc/ssssh/ssssshd_config
#UsseDns  no  #取消ssh登录时DNS域名解析功能

7. scp和rsync进行远程文件复制有什么区别
备份方式 数据形式 传输方式 消耗资源
scp 全量备份 文件级传输 加密传输 资源消耗少
rsync 差异对比,增量备份 分块校验,部分传输 非加密传输 资源消耗高(零散文件较多)

8. 公司里有一台服务器,需要在上面跑两个网站,并且其中一个网站需要更换新域名,请问如何处理?

网站1:www.a.com
网站2:www.b.com(旧) www.d.com(新)

分析:

  • 访问旧的地址跳转到新的地址;
  • 虚拟主机实现一台服务器跑多个网站;
  • 如果新的地址有支付功能等,需要https加密的。http端口80 —》https端口443,就需要rewrite地址重写功能来实现 ;

虚拟主机的三种方式:

  • 基于IP的虚拟主机(少用,浪费IP)

  • 基础IP+端口的虚拟主机(访问时需要加端口,客户不可能记得端口,所以不太常用)

  • 基于域名的虚拟主机(常用)

#此处省略通过DNS域名解析服务器配置www.a.com、www.b.com、www.d.com的过程。也可用hosts来简单的配置实验环境

# vim /etc/httpd/conf/httpd.conf

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /www/aaa
    ServerName www.a.com
    ErrorLog logs/1-error_log
   CustomLog logs/1-access_log common
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /www/bbb
    ServerName www.b.com
    ErrorLog logs/2-error_log
   CustomLog logs/2-access_log common
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /www/ddd
    ServerName www.d.com
    ErrorLog logs/1-error_log
   CustomLog logs/1-access_log common
</VirtualHost>

# systemctl restart  httpd


再基于虚拟主机的基础上,通过配置rewrite实现访问访问www.b.com跳转到www.d.com

# vim /etc/httpd/conf/httpd.com

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /www/aaa
    ServerName www.a.com
    ErrorLog logs/1-error_log
   CustomLog logs/1-access_log common
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /www/bbb
    ServerName www.b.com
    ErrorLog logs/2-error_log
   CustomLog logs/2-access_log common
   
   <IfModule mod_rewrite.c>  #在指定网站目录下调用rewrite模块
        RewriteEngine on          
        RewriteCond %{HTTP_HOST} ^www.b.com   
        RewriteRule ^(.*)$ http://www.d.com/$1 [R=301,L]      
   </IfModule>
  
   
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /www/ddd
    ServerName www.d.com
    ErrorLog logs/1-error_log
   CustomLog logs/1-access_log common
</VirtualHost>

# systemctl restart  httpd

解析:

   <IfModule mod_rewrite.c>  #在指定网站目录下调用rewrite模块
        RewriteEngine on          #开启rewrite功能
        RewriteCond %{HTTP_HOST} ^www.b.com   #吧www.b.com开头的内容复制给HTTP_HOST变量
        RewriteRule ^(.*)$ http://www.d.com/$1 [R=301,L]      
        # ^(.*)$指代客户端要访问的资源
        #$1  吧。*所指代的内容复制到$1变量中
        #R=permanent 永久重定向 =301
        #L 指定该规则为最后一条生效的规则,以后的不在生效
   </IfModule>

9. 简述Apache的三种工作模式?

prefork模式:

  1. Apache最早的工作模式
  2. 子进程会提前开启准备好
  3. 一个线程只处理一个请求
  4. 此模式每个请求都非常稳定,但是消耗资源非常大
graph TD A[主进程] --> B[子进程] A --> C[子进程] A --> D[子进程] B --> E[线程] C --> F[线程] D --> G[线程]

worker模式:

  1. 一个子进程对应多个线程,资源复用率提高了
  2. 并发能力比prefork模式强一些
  3. 但是稳定性上差一些。可能因为一个线程故障,导致它所在的子进程和子进程相关的线程都故障。
graph TD A[主进程] --> B[子进程] A --> C[子进程] B --> E[多个线程...] C --> F[线程] C --> G[线程] C --> H[线程]

event模式:

  1. 相对于worker模式,多了个叫做Keepalive的线程,管理HTTP请求的保持与断开,合理分配管理网站线程资源
  2. 对比worke模式,更适应高并发情况使用
graph TD A[主进程] --> B[子进程] A --> C[子进程] B --> E[多个线程...] C --> F[线程] C --> G[线程] C --> H[线程] E --> I[分配&管理线程] I --> J[HTTP请求]

查看方式:
# httpd -V |grep -i "server mpm"
指定方式:
在编译时,在选项中指定, --with-mpm=xxx


10. 请写出工作中常见的Apache优化策咯

考虑两方面1:安全; 2:效率

  • 日志的轮替
    利用Apache自带的rotatelogs工具进行日志切割,保证单个日志不会过大
    access_log 访问日志
    error_log 错误日志
vim /etc/httpd/conf/http.conf
...
CustomLog "|/bin/rotatelogs -l /wwwlog/access_%Y%m%d.log 8640" combined
#把内容通过管道符传给rotatelogs,每天的日志都分成一个日志文件,8640是一天的秒数
...
  • 内化错误页面
    可以将404、500等错误信息页面重定向到网站首页或其他页面,提升用户体验
vim /etc/httpd/conf/httpd.conf
...
ErrorDocument 404 http://www.a.com
ErrorDocument 500 http://www.a.com/500.html
···
  • 屏蔽Apache的版本信息,防止别人获取Apache的相应版本,利用其漏洞
  • 配置静态缓存,减少对服务器的访问压力
  • 禁止解析指定目录下的页面程序,比如upload。禁止解析用户上传的脚本文件
  • ......

11. 有哪些技术可以提高网站的安全和效率?

答:CDN技术


12. Apache 和Nginx的各有什么优缺点,应该如何选择?

Apache的优缺点:
优点:

  • Apache的rewrite功能比nginx的要强大
  • 模块非常多,基本想要的功能都能找到对应的模块,直接在配置文件调用就行了
  • 存在时间较长,文献较全,bug也相对比较少
  • 动静态解析都超级稳定
    缺点:
    - 由于工作模式是同步阻塞型,导致资源消耗比较高,并发能力较差

nginx的优缺点:
优点:
- 轻量级服务,比Apache 占用更少的内存及资源
- 并发能力强,nginx处理请求是异步非阻塞的,而Apache测试阻塞型的,在高并发下的nginx能保持资源低消耗高性能
- 高度模块化的设计,编写模块相对简单
- 社区活跃,各种高性能模块产出迅速
缺点:
- 动态处理需要使用fastcgi连接PHP的FPM服务,相对比Apache不占优势

Apache和Nginx的选择

Nginx适合做静态处理,简单,效率高
Apache适合做动态处理,稳定功能强
并发较高的情况下尽量选择Nginx,并发要求不高的情况下两者都可以,规模稍大的可以使用Nginx作为反响代理,然后将动态请求负载到后端的Apache上。


13. 为什么Nginx的并发能力强,消耗资源低?

解析:
同步:客户端发送请求后,只要客户端没有断开请求,就算在不用处理事务时,服务器也一直等待着
异步:客户端发送请求后,只有要为客户端处理事务的时候,才会开启线程

阻塞:除了处理此客户端的请求什么都不做
非阻塞:在处理此次请求的事务的间歇,可以处理其他事务

答:因为Nginx是以异步非阻塞型的方式工作,过程如下:

  • 客户端发送request(请求),服务器分配work进程来处理
  • 能立即处理完的,处理后work进程释放资源,进行下一个request
  • 不能立即处理完的work进程注册成返回事件,然后接着去处理其他的request
  • 当之前的request结果返回后,触发返回事件,由空闲work进程接着处理
    通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的

14. 写出几个Nginx的常用模块,并描述其功能
  1. http_ssl_module
    实现服务器加密传输的模块,部署完成后可使用https://协议进行数据传输,保证数据传输过程的安全
  2. https_image_filter_module
    通过该模块可以实现图片裁剪。将过大的图片裁剪为指定大小的图片,生成省咯图,保证传输速率,该选项默认不开启,需要认为开启
    image_filter resize $h $w
  3. http_rewrite_module
    Nginx 的地址重写模块,功能同Apache的一样,可以实现通过正则匹配来完成条件判断,然后进行域名或url的重写。例如:多域名、http->https
  4. http_proxy_module
    Nginx的反响代理功能,由于Nginx的高并发特性,很多时候我们都选择使用Nginx作为网站的前置服务器,一般会和upstream模块一起使用,完成压力分摊工作。
  5. http_upstream_module
    Nginx 的负载均衡模块,一般和http_proxy模块一起使用,用来对后台服务器的任务调度及分配,分配原则可以通过算法进行控制。常见模式:Nginx+Apache、Nginx+

15. 请解释Nginx是如何连接PHP进行页面解析的

Nginx收到客户端的请求,然后通过fastcgi模块访问php-fpm服务,来实现php页面解析


16. 请描述Nginx和Tomcat之间的数据传输过程

可以nginx反响代理一个或多个Tomcat,并可以只把动态请求转发给Tomcat来处理,静态请求转发给静态服务器就好了。


17. 请列举几个你常见的http状态码

HTTP状态码的是5个不同的类别:
1:信息,服务器收到请求,需要请求继续执行操作
2
:成功,操作被成功接收并处理
3:重定向,需要进一步的操作以完成请求
4
:客户端错误,请求包含语法错误或无法完成请求
5**:服务器错误,服务器在处理请求的过程中发生了错误

五个类别的响应状态码的第一个数字是唯一代表。


18. MySQL一主多从,主机宕机,如何合理切换到从库,其他从库如何处理?
  1. 登录所有从数据库查看post信息,使用POST最大的作为新的主库,然后将从数据库提升为主库,登录从库(新主库)执行 stop slave
  2. 修改my.cnf配置文件,开启log-bin并重新启动数据库服务,登录数据库执行restet master,show master status\G;查看主库信息,最后创建权同步用户与权限和网站使用数据库的用户与权限,最后修改对应服务器的IP地址等信息
  3. 登录其他从库,执行change master同步操作,查看同步状态

19. 简述一下mysql主从服务器的原理

技术点:bin-log日志(记录主服务器的关于数据库修改的SQL语句)
开启主服务器的bin-log日志记录功能,将主服务器的bin-log日志传到从服务器,从服务器根据日志内容将数据还原到本地。

主从服务器:
从服务器主动把从服务器上的数据同步到本地(备份)


20. 单台MySQL达到性能瓶颈时,如何击碎性能瓶颈?

使用数据库代理工具,比如Amoeba。Amoeba致力于MySQL的分布式数据库前段代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层开发。具有负载均衡、高可用、SQL过滤、读写分离、可路由相关的目标数据库、可并发请求多台数据库合并结果。通过Amoeba你能够完成多数数据的高可用、负载均衡、数据切片的功能。

tip:为了防止Amoeba突然宕机,所以企业可以随时备着另一台没有在使用的Amoeba备用机。


21. MySQL什么时候需要建立索引?

分析考察点:
什么是索引?
索引的分类
索引的劣势
什么时候需要建立索引
什么时候不要建立索引

什么是索引?
索引的本质是数据结构,排序好的快速查找数据结构,可以提高查找效率。比如新华字典里的目录。数据库执行查询的时候,如果那张表设置了索引,则数据库会先访问索引表,然后通过一些特殊的算法实现快速的查找。

索引的分类

  • 主键索引
  • 单值索引,一个索引包含一个列,一个表可以有多个单列索引。如果字段会被经常用来检索就可以用单值索引
  • 复合索引,一个索引包含多个列,如电话簿上姓+名。最好不要超过5个字段
  • 唯一索引,所有列的值必须唯一,但允许空值
  • 普通索引和唯一索引可以称为铺助索引

劣势是什么?

  • 实际上索引也是一张表,该表保存了主键和所有字段,并指向实体表的记录,索引列也是要占用空间的
  • 虽然所有达达提高了查询速度,但是会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表示,MySQL不仅要保存数据,还要保存一下所以文件每次更新添加了所以列的字段,都会调整因为更新所带来的键值变化后的索引信息
  • 索引只是提高效率的一个因素,如果MySQL有大数据量的表,就 需要花时间研究建立最优秀的所以,或优化查询。

什么时候需要创建索引

  • 主键 自动建立唯一索引
  • 频繁作为查询条件的字段应该创建索引
  • 查询中与其他表关联的字段,外键关系建立索引
  • 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
  • where条件里用不到的字段不创建索引
  • 单键/组合索引的选择问题,在并发下倾向创建组合索引
  • 查询中排序的字段,排序字段若通过索引去访问将大大提升排序速度
  • 查询中统计或者分组字段(group by)

什么时候不需要创建索引

  • 表记录太少,如果才几万条数据,不要建索引。三百万条数据量创索引
  • 频繁更新的字段不合适创建索引,因为每次更新不单单是更新了记录还会索引
  • 性别,国际字段。有选择性的字段。

22. 误操作drop语句导致数据库数据破坏,请给出回复的实际大体步骤
  1. 手动切割bin-log日志并记好切割好的bin-log日志文件位置,这里假设我009,备份全部binlog日志
  2. 找到之前全备数据最后备份到的bin-log日志文件位置并记录好位置,这里假设为005
  3. 用mysqladmin命令将005到008bin-log文件中的SQL语句分离出来,并找到drop库的语句将其删除
  4. 将之前全非数据导入mysql服务器
  5. 将步骤3中分离出来的SQL语句导入msyql服务器
  6. 将009bin-log文件删除,再次刷新bin-log日志,到此数据库恢复成功

23. 如何保证Redis能永久保存数据?

分析:
永久保存=持久化=内存里的数据保存到磁盘上

RDB方式:在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中。当Redis重启时,RDB会通过重载RDB文件来还原数据库。(保存快照时,会阻塞主进程,保证数据的一致性)

AOF方式:以协议文本的方式,将所有对数据库进行的写入操作命令记录到AOF文件,达到记录数据库的目的。类似mysql的bin-log日志。


24. 如何利用Redis对MySQL进行优化?

  1. Web服务器发送查询请求,会先看看Redis缓存数据库有没有此查询数据,有则直接从Redis数据库读取;
  2. 如果没有则再从mysql数据库读取数据;
  3. mysql数据库返回数据给web后,同时也在Redis数据库插入此条数据,并给此条数据设置TTL(有效时间)
posted @ 2020-04-19 19:21  蛮子Jay  阅读(1165)  评论(0编辑  收藏  举报