运维面试题
此为看尚硅谷Linux运维面试题(大厂linux面试题攻略) 的学习笔记
1. 简述Raid 0 、Raid1、Raid 5、Raid 10 的特点与原理。
分析:最好画图讲解,比较直观。
2. 软Raid与硬Raid的区别?
- 软Raid:是由操作系统模拟的Raid,一旦硬盘损坏,操作系统也会损坏,Raid会丧失作用。
- 硬Raid:是独立于硬盘之外,硬件Raid卡组成;就算硬盘损坏,也不会导致Raid卡损坏,硬盘容错才能起作用。
3. 简述Linux启动的过程
CentOS 6.x
- 加电自检,加载BOIS信息,BOIS进行系统检测
- 加载启动引导grub
- 由grub加载系统内核(这里也加载一些必要驱动)
- 内核重新自检,并加载硬件驱动
- 由内核启动系统第一个进程/sbin/init
- 由/sbin/init进程调用/etc/init/rcS.conf,进行系统初始化配置
- 由/etc/init/rcS.conf调用/etc/inittab,确认 系统默认运行级别
- 确认默认运行级别后,调用/etc/init/rc.conf配置文件
- 运行相应的运行级别目录/etc/rc[0-6].d中的配置文件
- 在启动登录界面之前,执行/etc/rc.d/rc.local中的程序
CentOS 7.x
- 加电自检,加载BOIS信息,BOIS进行系统检测
- 加载启动引导grub2
- 由grub加载系统内核(这里也加载一些必要驱动)
- 内核重新自检,并加载硬件驱动
- 内核启动系统的第一个进程,也就是systemd
- 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系统优化?
- 禁用不需要的服务
ntsysv命令最方便 - 避免直接使用root用户,普通用户通过sudo授权操作
- 通过chattr锁定重要文件,需要用的时候再解锁
/etc/passwd
/etc/shadow
/etc/grup
/etc/gshadow
/etc/inittab - 配置国内yum源,加快下载速度
- 配置系统同时打开最大文件数
vim /etc/profile
ulimit -SHn 65535 - 同步时间服务器(比如mysql主从复制就要求高度同步时间)
ntpdtae ntp1.aliyun.com
通过crond定时任务,让时间同步命令没一个小时执行一次 - 修改ssh服务的默认端口,配置ssh秘钥对登录
- 配置合理的iptables防火墙规则
- 配置SELinux安全上下文(很复杂,很多公司服务器是直接关掉的)
- 指定合理的监控策咯
- 定时备份系统重要文件
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模式:
- Apache最早的工作模式
- 子进程会提前开启准备好
- 一个线程只处理一个请求
- 此模式每个请求都非常稳定,但是消耗资源非常大
worker模式:
- 一个子进程对应多个线程,资源复用率提高了
- 并发能力比prefork模式强一些
- 但是稳定性上差一些。可能因为一个线程故障,导致它所在的子进程和子进程相关的线程都故障。
event模式:
- 相对于worker模式,多了个叫做Keepalive的线程,管理HTTP请求的保持与断开,合理分配管理网站线程资源
- 对比worke模式,更适应高并发情况使用
查看方式:
# 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的常用模块,并描述其功能
- http_ssl_module
实现服务器加密传输的模块,部署完成后可使用https://协议进行数据传输,保证数据传输过程的安全 - https_image_filter_module
通过该模块可以实现图片裁剪。将过大的图片裁剪为指定大小的图片,生成省咯图,保证传输速率,该选项默认不开启,需要认为开启
image_filter resize $h $w - http_rewrite_module
Nginx 的地址重写模块,功能同Apache的一样,可以实现通过正则匹配来完成条件判断,然后进行域名或url的重写。例如:多域名、http->https - http_proxy_module
Nginx的反响代理功能,由于Nginx的高并发特性,很多时候我们都选择使用Nginx作为网站的前置服务器,一般会和upstream模块一起使用,完成压力分摊工作。 - 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一主多从,主机宕机,如何合理切换到从库,其他从库如何处理?
- 登录所有从数据库查看post信息,使用POST最大的作为新的主库,然后将从数据库提升为主库,登录从库(新主库)执行 stop slave
- 修改my.cnf配置文件,开启log-bin并重新启动数据库服务,登录数据库执行restet master,show master status\G;查看主库信息,最后创建权同步用户与权限和网站使用数据库的用户与权限,最后修改对应服务器的IP地址等信息
- 登录其他从库,执行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语句导致数据库数据破坏,请给出回复的实际大体步骤
- 手动切割bin-log日志并记好切割好的bin-log日志文件位置,这里假设我009,备份全部binlog日志
- 找到之前全备数据最后备份到的bin-log日志文件位置并记录好位置,这里假设为005
- 用mysqladmin命令将005到008bin-log文件中的SQL语句分离出来,并找到drop库的语句将其删除
- 将之前全非数据导入mysql服务器
- 将步骤3中分离出来的SQL语句导入msyql服务器
- 将009bin-log文件删除,再次刷新bin-log日志,到此数据库恢复成功
23. 如何保证Redis能永久保存数据?
分析:
永久保存=持久化=内存里的数据保存到磁盘上
RDB方式:在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中。当Redis重启时,RDB会通过重载RDB文件来还原数据库。(保存快照时,会阻塞主进程,保证数据的一致性)
AOF方式:以协议文本的方式,将所有对数据库进行的写入操作命令记录到AOF文件,达到记录数据库的目的。类似mysql的bin-log日志。
24. 如何利用Redis对MySQL进行优化?
- Web服务器发送查询请求,会先看看Redis缓存数据库有没有此查询数据,有则直接从Redis数据库读取;
- 如果没有则再从mysql数据库读取数据;
- mysql数据库返回数据给web后,同时也在Redis数据库插入此条数据,并给此条数据设置TTL(有效时间)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具