Linux运维工程师面试题(2)
祝各位小伙伴们早日找到自己心仪的工作。
持续学习才不会被淘汰。
地球不爆炸,我们不放假。
机会总是留给有有准备的人的。
加油,打工人!
1 访问一个网站的流程
- 打开浏览器,输入网址。首先查找本地缓存,如果有就打开页面,如果没有,利用DNS做域名解析;
- 浏览器发出DNS请求,递归查询网站的IP地址。HOSTS表 --> 本地DNS --> 上层DNS(包括根DNS);
- 经过了DNS解析,将网址转换为IP地址,通过IP地址找到指定的Web服务器,与服务器建立 tcp 三次握手;
- 握手成功后浏览器发出HTTP请求,默认请求的是index.html;
- 服务器接收到请求后将网页文件发回给浏览器;
- 浏览器接收到服务器返回的网页文件后,浏览器会解析html文件,将渲染后的网页文件呈现给用户。
- 浏览器将发回的数据及状态码存入 Cache 以便后续快速访问。
2 TCP 三次握手,四次挥手
三次握手
- 客户端向服务器端发送请求报文,报文中包含有随机生成的seq序列号(x),并且还将报文中SYN字段置为1,表示需要建立TCP连接请求;
- 服务器端接收请求后回复请求报文,报文中包含随机生成的seq(y)序列号,并且将回复报文的SYN字段置1,表示也需要建立连接请求,双向确认。而且会产生ACK验证字段,将ACK确认报文字段置为1,ACK验证字段数值是在客户端发过来的seq(x)序列号基础上加1进行回复,即回复ack(x+1)确认号字段,以便客户端收到信息时,知晓自己的TCP建立请求已得到了确认,ack也可以理解为期望下次客户端发送的seq序列号的值;
- 客户端收到服务端发送的建立TCP连接请求后,会使自己的原有序列号(x)加1进行再次发送序列号seq(x+1),同时回复ACK验证请求,将ACK字段标记为1,在服务器端发送过来的seq(y)基础上加1,即回复ack确认控制字段(y+1),以便服务器端收到信息时,知晓自己的TCP建立请求已经得到了确认,同样ack也可以理解为期望下次服务器端发送的seq序列号的值。
三次握手的目的是确保两端的序列号同步,并且双方都可以发送和接收数据。如果第一次握手失败,客户端会重复发送SYN包;如果第二次握手失败,服务器也会重复发送SYN+ACK包;如果第三次握手失败,客户端会重新发送ACK包。
四次挥手
- 客户端主动向服务器端发送关闭连接请求,此时的序列号seq为u,将报文中的FIN字段标记为1,表示要关闭TCP连接;
- 服务器端收到报文后会发送ACK报文验证,将ACK置为1,同时发送ack(u+1)确认字段,此时的序列号seq为v,此次报文表示已经收到了结束请求;
- 此时服务器可能还有数据需要发送,因此需要等待一段时间。当服务器完成数据发送后,会发送一个FIN包,表示已经结束TCP连接,将FIN标记为1,ACK标记为1,此时的序列号seq为w,确认号ack为u+1;
- 客户端收到FIN包后,会回应一个ACK包,表示已经收到了结束请求,将ACK置为1,序列号seq为u+1,ack为w+1,并进入TIME_WAIT状态。等待一段时间后,客户端关闭连接。服务器收到ACK包后,也关闭连接。
四次挥手的目的是确保两端都知道对方已经关闭了连接,并且不会再发送数据。如果客户端发出FIN包后没有收到ACK包,可以重发FIN包;如果服务器发出FIN包后没有收到ACK包,可以重新发送FIN包。如果客户端在TIME_WAIT状态结束之前收到了重复的FIN包,可以忽略它。
3 apache 和 nginx 有哪几种虚拟主机
- 基于IP地址的虚拟主机
- 基于域名的虚拟主机
- 基于端口号的虚拟主机
4 TCP 和 UDP 的区别
- TCP是一种面向连接的协议,而UDP是无连接的协议。TCP是一对一传输,UDP支持一对一、一对多、多对一和多对多的交互通信;
- TCP提供可靠的数据传输,保证数据能够完整、有序地到达目的地,而UDP不提供可靠性保证,数据传输可能会丢失、重复或者乱序。
- TCP将数据分成一些数据段,每个数据段都有一个序列号,可以保证数据的有序性和完整性。而UDP将数据封装成数据报,每个数据报都是独立的,可能会丢失、重复或者乱序。
- TCP是面向字节流的,即把应用层传来的报文看成字节流,将字节流拆分成大小不等的数据块,并添加TCP首
部;UDP是面向报文的,对应用层传下来的报文不拆分也不合并,仅添加UDP首部; - UDP比TCP快,因为它没有TCP的可靠性保证和复杂的流量控制和拥塞控制机制。
- UDP适用于传输量较小但传输速度要求高的应用,例如视频、音频和游戏等;而TCP适用于传输量较大但对可靠性和完整性要求较高的应用,例如文件传输、邮件等。
- TCP支持传输可靠性的多种措施,包括保证包的传输顺序、重发机制、流量控制和拥塞控制;UDP仅提供最基本的数据传输能力。
5 nginx 和 apache 的区别
Nginx:
- 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源;
- 抗并发,nginx 以 epoll 和 kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象;
- nginx 处理静态文件好,静态处理性能比 apache 高三倍以上;
- nginx 的设计高度模块化,编写模块相对简单;
- nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃;
- nginx 作为负载均衡服务器,支持 4 层和 7 层负载均衡,七层负载可以有效的防止ddos攻击;
- nginx 本身就是一个反向代理服务器,也可以作为邮件代理服务器来使用。
Apache:
- apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache;
- apache 发展到现在,模块超多,基本想到的都可以找到;
- apache 更为成熟,少 bug ,nginx 的 bug 相对较多;
- apache 对 PHP 支持比较简单,nginx 需要配合其他后端用;
- apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向;
- apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区。
两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程。
需要稳定用apache,需要高性能用nginx
6 什么是反向代理,什么是正向代理,区别是什么?
反向代理和正向代理都是代理服务器的一种应用形式,它们的主要区别在于代理的方向和代理对象不同。
正向代理是在客户端和目标服务器之间设置代理服务器,以代替客户端向目标服务器发送请求,客户端无法直接访问目标服务器。正向代理服务器一般用于加密、缓存、控制访问、内容过滤等功能。例如,翻墙工具就是一种常见的正向代理应用。
反向代理是在目标服务器和客户端之间设置代理服务器,以代替目标服务器向客户端提供服务,客户端无法直接访问目标服务器,所有的请求都要经过反向代理服务器。反向代理服务器可以根据客户端的请求选择不同的目标服务器,从而实现负载均衡和高可用性。例如,一些大型网站和应用程序就会使用反向代理服务器进行负载均衡和缓存。
两者的主要区别在于代理的方向不同。正向代理是代理客户端,把客户端的请求转发到目标服务器;而反向代理是代理服务器端,把目标服务器的响应转发给客户端。
7 cookie和session的区别
- 存储位置:Cookie保存在客户端浏览器上,而Session保存在服务器端。
- 安全性:由于Cookie保存在客户端浏览器上,因此可以被窃取和篡改,存在一定的安全风险;而Session保存在服务器端,相对来说更加安全。
- 存储容量:Cookie的存储容量有限,一般只能保存4KB左右的数据;而Session的存储容量没有限制,可以保存更多的数据。
- 作用范围:Cookie的作用范围是整个域名下的所有页面,可以在多个页面之间共享数据;而Session的作用范围是当前用户与服务器之间的会话,只能在同一会话期间内共享数据。
- 有效期:Cookie可以设置有效期,可以长期保存在客户端浏览器上;而Session一般会在用户关闭浏览器或者一定时间内没有操作时自动失效。
综上所述,Cookie适合保存一些不敏感的数据,如用户的偏好设置、购物车信息等;而Session适合保存一些敏感的数据,如用户的登录状态、权限信息等。在实际开发中,通常会根据具体的应用场景和需求来选择合适的机制。
8 nginx 调优
工作进程绑定,最大上传文件大小,事件驱动模型优化,文件描述符优化,防盗链优化,隐藏软件名称和版本号,对于404、502等默认页面的优化,从而对用户友好展示,禁止恶意域名解析,禁止通过IP地址访问网站,严格设置web站点目录的权限,通过robot协议以及HTTP_USER_AGENT防爬虫优化。防止ddos单ip并发连接的控制。status监控模块得开启等等。limit_rate限制上传速率。client_max_body_size允许用户上传的文件最大大小。
chatgpt:
- 调整工作进程数:Nginx默认开启的工作进程数是CPU核心数,可以根据服务器性能和应用负载情况进行适当调整。一般情况下,可以将工作进程数设置为2倍或3倍的CPU核心数。
- 调整文件句柄限制:Nginx默认的文件句柄限制是1024,可以根据实际情况进行适当调整。可以通过修改系统参数或者在Nginx配置文件中设置"worker_rlimit_nofile"参数来调整文件句柄限制。
- 启用TCP优化参数:Nginx提供了一些TCP优化参数,可以通过设置"tcp_nopush"、"tcp_nodelay"、"keepalive_timeout"等参数来提高TCP连接性能和可靠性。
- 启用Gzip压缩:启用Gzip压缩可以减少网络传输的数据量,提高页面加载速度。可以在Nginx配置文件中设置"gzip"参数来启用Gzip压缩。
- 启用HTTP缓存:启用HTTP缓存可以减少服务器负载和页面加载时间,可以在Nginx配置文件中设置"proxy_cache_path"参数来启用HTTP缓存。
- 调整Nginx内存占用:Nginx默认的内存占用较低,可以通过设置"worker_processes"、"worker_connections"等参数来调整Nginx内存占用,提高性能和可靠性。
9 系统出现大量的 time_wait 问题怎么解决
一次意外,服务器遭受了ddos攻击,对我们造成了极大的影响,虽然我们把前端用户访问入口关闭暂停了ddos攻击,但是服务器端出现了大量的time-wait,导致的结果就是新建连接失败,而且占用了系统大量的资源,我们的临时解决方法就是这样的。
在系统配置 sysctl.conf
里面添加两个参数
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 300
net.ipv4.tcp_syncookies = 1
改成1之后,并执行 sysctl -p
命令立即生效,然后就慢慢下来了。
chatgpt:
time_wait是TCP协议的一种状态,表示一个TCP连接已经关闭,但是还需要一段时间等待一些延迟的数据包到达。如果系统中存在大量的time_wait状态的连接,可能会导致系统资源的浪费和性能下降。以下是一些解决方案:
- 调整TCP参数:可以通过调整TCP参数来控制time_wait的数量和时间,如修改tcp_tw_recycle、tcp_tw_reuse等参数。但是需要注意的是,不建议在生产环境中调整这些参数,因为会带来潜在的风险。
- 增加服务器资源:time_wait状态连接的数量与系统资源有关,增加服务器资源可以降低系统中time_wait状态连接的数量,如增加内存、CPU、网络带宽等。
- 使用连接池:可以使用连接池来复用已经建立的TCP连接,避免频繁的建立和关闭连接。连接池可以降低time_wait状态连接的数量,并且可以提高系统的性能。
- 使用TCP快速回收技术:TCP快速回收技术是一种基于时间戳的技术,可以让系统快速回收time_wait状态的连接。可以通过设置net.ipv4.tcp_timestamps=1来启用TCP快速回收技术。
总之,在解决time_wait问题时,需要根据具体的应用场景和系统资源情况综合考虑和调整,以提高系统的性能和可靠性。同时,需要注意避免不正确的调整参数和配置,造成潜在的风险。
10 拿到一台新服务器后需要干什么,做哪些系统优化
更改ssh的端口,在公网的机器禁用密码登录,选择密钥登录的方式;
禁止root登录,尽量使用普通用户登录系统,添加sudo权限;
配置时间同步,设置网卡名称为 eth0 传统命名方式;
开启防火墙,配置好防火墙规则;
优化内核参数,修改资源限制,比如tcp参数优化,调大文件描述符;
配置本地yum源或者国内源,安装常用软件包,比如tcpdump等工具包。
chatgpt:
- 更新系统和软件包:首先需要更新操作系统和软件包到最新版本,以获取最新的安全补丁和功能。
- 配置防火墙和安全策略:配置防火墙和安全策略可以保护服务器免受网络攻击和恶意软件的侵害。
- 配置远程访问:配置远程访问可以方便管理员远程管理服务器,但是需要注意安全性,如使用SSH加密连接。
- 安装必要的软件:安装必要的软件可以方便服务器的管理和维护,如编辑器、日志分析工具、监控工具等。
- 配置系统资源限制:配置系统资源限制可以避免某些进程占用过多的系统资源,导致系统崩溃或性能下降。
- 配置系统参数:配置系统参数可以提高系统的性能和可靠性,如调整文件句柄数、内存大小、网络缓冲区等。
- 配置系统日志:配置系统日志可以方便管理员查看系统的运行情况和错误信息,及时发现和解决问题。
- 配置系统备份:配置系统备份可以在系统出现问题时恢复数据和服务,避免数据丢失和服务中断。
以上是对新服务器的基本优化建议,具体的优化方法和步骤需要根据具体的应用场景和系统配置情况综合考虑和调整。
关于我
全网可搜《阿贤Linux》
CSDN、知乎、哔哩哔哩、博客园、51CTO、掘金、思否、开源中国、阿里云、腾讯云、华为云、今日头条、GitHub、个人博客
公众号:阿贤Linux
个人博客:blog.waluna.top
https://blog.waluna.top/
原文链接: Linux运维工程师面试题(2).