Linux运维工程师面试题(2)
祝您一切顺利,找到您想要的工作。
持续学习不会被淘汰。
地球不会爆炸,我们不会休假。
机会总是留给有准备的人。
来吧,打工人!
1 访问一个网站的流程
打开浏览器并输入URL。首先查找本地缓存,如果有则打开页面,如果没有则使用DNS进行域名解析;
浏览器发出DNS 请求以递归查找网站的IP 地址。 HOSTS表——本地DNS——上层DNS(包括根DNS);
经过DNS解析后,将URL转换为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作为负载均衡服务器,支持四层和七层负载均衡,七层负载可以有效防止ddos攻击;
Nginx本身是一个反向代理服务器,也可以用作邮件代理服务器。
阿帕奇:
Apache的重写比nginx更强大,在频繁重写的情况下,使用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地址访问网站,严格设置网站目录权限,通过robot协议和HTTP_USER_AGENT优化反爬虫。防止ddos单ip并发连接控制。状态监控模块要开启等等。 limit_rate 限制上传速率。 client_max_body_size允许用户上传的文件的最大大小。
chatgpt:
调整工作进程数:Nginx默认启用的工作进程数为CPU核心数,可以根据服务器性能和应用负载情况适当调整。一般来说,工作进程的数量可以设置为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状态的连接。 TCP快速回收技术可以通过设置net.ipv4.tcp_timestamps=1来启用。
总之,在解决time_wait问题时,需要根据具体的应用场景和系统资源情况综合考虑和调整,以提高系统性能和可靠性。同时,需要注意避免错误的调整参数和配置,从而可能带来潜在的风险。
10 拿到一台新服务器后需要干什么,做哪些系统优化
更改ssh的端口,禁用公网机器上的密码登录,选择密钥登录方式;
禁止root登录,尽量使用普通用户登录系统,并添加sudo权限;
配置时间同步,设置网卡名称为eth0传统命名方式;
打开防火墙并配置防火墙规则;
优化内核参数,修改资源限制,如tcp参数优化,增加文件描述符;
配置本地yum源或国内源,安装常用软件包,如tcpdump等工具包。
chatgpt:
更新系统和软件包:首先需要将操作系统和软件包更新到最新版本,以获得最新的安全补丁和功能。
配置防火墙和安全策略:配置防火墙和安全策略可以保护服务器免受网络攻击和恶意软件的侵害。
配置远程访问:配置远程访问可以方便管理员远程管理服务器,但需要注意安全性,例如使用SSH加密连接。
安装必要的软件:安装必要的软件可以方便服务器的管理和维护,比如编辑器、日志分析工具、监控工具等。
配置系统资源限制:配置系统资源限制,防止某些进程占用过多系统资源,导致系统崩溃或性能下降。
配置系统参数:配置系统参数可以提高系统性能和可靠性,例如调整文件句柄数、内存大小、网络缓冲区等。
配置系统日志:配置系统日志可以方便管理员查看系统运行状态和错误信息,及时发现并解决问题。
配置系统备份:配置系统备份,以便在系统出现问题时恢复数据和服务,避免数据丢失和服务中断。
以上是新服务器的基本优化建议。具体的优化方法和步骤需要根据具体的应用场景和系统配置进行综合考虑和调整。
关于我
全网可搜《阿贤Linux》
CSDN、知乎、哔哩哔哩、博客园、51CTO、掘金、私服、开源中国、阿里云、腾讯云、华为云、今日头条、GitHub、个人博客