Skip to content

服务器运维面试题库 ​

生成时间:2026-05-22 23:06


【面试题】1. Nginx的upstream健康检查机制有哪些方式?生产环境怎么选? ​

【标准答案】Nginx原生支持被动健康检查:max_fails设置最大失败次数,fail_timeout设置失败后暂停时间。比如max_fails=3 fail_timeout=30s,连续3次失败后把节点标记为不可用,30秒后再尝试。主动健康检查需要第三方模块nginx_upstream_check_module,支持HTTP/TCP主动探测,能实时感知节点状态,配置如check interval=3000 rise=2 fall=3 timeout=1000 type=http。生产环境建议:核心业务用主动检查(感知更快),简单场景用被动检查(开销小)。如果是Nginx商业版,自带active health check功能,配置health_check指令即可。

【面试题】2. 请解释Linux的load average三个数值分别代表什么?什么情况下load很高但CPU利用率不高? ​

【标准答案】load average三个数分别是1分钟、5分钟、15分钟内系统平均负载,即处于R(运行中)和D(不可中断睡眠)状态的进程数之和。load高但CPU利用率不高,典型原因是大量进程处于D状态——即等待磁盘IO完成,不可中断睡眠也被计入负载。常见场景:磁盘IO瓶颈(大量读写等待)、NFS挂载卡住、网络存储响应慢。排查方法:vmstat 1看b列(不可中断睡眠进程数),iostat -x 1看%util和await,确认是磁盘问题。另外CPU密集型短任务也可能导致load瞬间跳高但平均CPU不高。

【面试题】3. Tomcat的Connector三种线程模型NIO/BIO/APR有什么区别?生产环境怎么选? ​

【标准答案】BIO(Blocking IO):一个连接一个线程,并发高时线程数暴增,Tomcat 8.5后已移除。NIO(Non-blocking IO):基于Java NIO,用少量线程处理大量连接,通过Poller线程轮询事件,Tomcat 8.5+默认模型。APR(Apache Portable Runtime):调用操作系统原生IO库,性能最优但需要额外安装APR库和tomcat-native。生产选型:没有APR环境就用NIO(默认配置就够),追求极致性能且能装APR就用APR。配置示例:<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" .../>。注意Tomcat 9+默认就是NIO,不需要额外改protocol。

【面试题】4. 线上服务器502 Bad Gateway和504 Gateway Timeout分别怎么排查?根本原因有什么区别? ​

【标准答案】502表示Nginx收到了无效的上游响应,根因是后端服务不可用或返回了非法响应。排查步骤:(1)先确认后端进程是否存活ps aux|grep java;(2)检查后端端口是否在监听ss -tlnp;(3)查后端应用日志看是否OOM或崩溃重启;(4)查Nginx error.log确认具体upstream返回了什么。504表示Nginx等待上游响应超时,根因是后端处理太慢。排查步骤:(1)查后端是否有慢SQL、死锁、GC停顿;(2)检查proxy_read_timeout等超时设置是否合理;(3)用strace或arthas追踪后端线程卡在哪里。关键区别:502是后端挂了或响应非法,504是后端还活着但太慢。临时应急:502可以检查upstream健康检查配置,504可以适当调大超时参数但要找到根因。

【面试题】5. 如何用iptables实现只允许特定IP访问SSH端口22,其他全部拒绝? ​

【标准答案】三条规则搞定:iptables -A INPUT -s 10.0.0.100 -p tcp --dport 22 -j ACCEPT允许指定IP,iptables -A INPUT -p tcp --dport 22 -j DROP拒绝其他所有SSH访问,iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT放行已建立连接。关键注意点:规则顺序很重要,匹配即停止,所以允许规则必须在拒绝规则前面;操作前先确保有其他管理通道(如console),防止把自己锁在外面;生产环境建议用-I INPUT插入而非-A追加,确保规则在正确位置;持久化用iptables-save > /etc/sysconfig/iptables。如果用firewalld更简单:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" port port="22" protocol="tcp" accept',然后firewall-cmd --permanent --remove-port=22/tcp移除默认放行。

【面试题】6. Keepalived+Nginx高可用方案中,如何防止Master节点Nginx挂了但Keepalived还在的情况(脑裂)? ​

【标准答案】这就是典型的"脑裂"或"VIP漂移失败"问题。核心方案:写一个检测脚本定时检查Nginx状态,如果Nginx挂了就主动停止Keepalived让VIP漂移。脚本逻辑:killall -0 nginx或curl -s http://127.0.0.1/health > /dev/null,失败则systemctl stop keepalived。Keepalived配置中用vrrp_script和track_script关联:vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight -20 fall 3 rise 2 },然后在vrrp_instance中track_script { chk_nginx }。防脑裂还要注意:设置nopreempt避免抢占导致VIP来回跳;用authentication配置VRRP认证防止非法节点;网络层面用unicast_peer指定对端IP避免广播风暴;添加仲裁机制如网关可达性检测。

【面试题】7. Docker容器资源限制怎么做?一个容器把宿主机内存吃满了怎么办? ​

【标准答案】Docker通过cgroup限制容器资源。内存限制:docker run -m 2g --memory-swap=2g nginx限制最大2G且禁用swap;CPU限制:--cpus=1.5限制最多1.5核,--cpu-shares=512设置相对权重;IO限制:--device-write-bps /dev/sda:10mb限制磁盘写入速率。如果容器把宿主机内存吃满,说明没设资源限制。处理步骤:(1)docker stats查看各容器资源占用;(2)找到异常容器docker inspect看是否设了limit;(3)紧急处理docker update -m 2g --memory-swap 2g 容器ID在线调整限制;(4)如果已经OOM导致宿主机卡死,docker kill该容器后重新启动并加limit。生产建议:所有容器必须设内存和CPU限制,用docker-compose的deploy.resources.limits统一管理;配置--oom-kill-disable=false让内核在内存不足时杀掉容器而不是整机卡死。

【面试题】8. Prometheus的Pull模型和Zabbix的Push模型各有什么优劣?什么场景选哪个? ​

【标准答案】Prometheus Pull模型:服务端主动拉取指标,优势是不需要在被监控端装Agent(只需暴露/metrics接口),服务端掌控采集频率,天然支持服务发现(K8s环境自动发现Pod),劣势是跨网络/NAT场景不好拉取,短生命周期任务指标可能丢失。Zabbix Push模型(也支持Pull):Agent主动上报,优势是跨网络友好(Agent主动连接Server),配置灵活支持复杂触发器,企业级权限管理完善,劣势是Agent部署维护成本高,大规模时Server压力大。选型建议:云原生/K8s环境选Prometheus+Grafana,天然适配;传统IDC/混合环境选Zabbix,兼容性好管理方便;两者也可以混用,Zabbix管基础监控,Prometheus管应用监控。关键看团队技术栈和监控规模。

【面试题】9. 解释Linux文件描述符限制,高并发服务器如何调优? ​

【标准答案】文件描述符(fd)是内核为进程打开文件/套接字分配的整数标识。系统级限制:cat /proc/sys/fs/file-max查看,sysctl -w fs.file-max=1000000修改,持久化写入/etc/sysctl.conf。进程级限制:ulimit -n查看,ulimit -n 65535临时修改,持久化在/etc/security/limits.conf加* soft nofile 65535和* hard nofile 65535。高并发调优完整步骤:(1)系统级调大file-max到100万+;(2)进程级调大nofile到65535+;(3)Nginx配置worker_rlimit_nofile 65535;(4)内核TCP参数优化:sysctl -w net.ipv4.tcp_tw_reuse=1复用TIME_WAIT,net.core.somaxconn=65535增大全连接队列,net.ipv4.tcp_max_syn_backlog=65535增大半连接队列;(5)检查/proc/sys/fs/inotify/max_user_instances和max_user_watches如果用到inotify。还要注意systemd管理的服务需要在service文件中设LimitNOFILE=65535,limits.conf对systemd不生效。

【面试题】10. LVS的DR模式工作原理是什么?为什么DR模式性能最好?有什么限制? ​

【标准答案】DR(Direct Routing)模式原理:客户端请求到达Director(负载调度器),Director修改数据帧的目标MAC地址为后端RealServer的MAC地址,然后通过局域网转发给RealServer;RealServer直接将响应数据包发回客户端,不经过Director。性能最好的原因:响应流量不经过Director,只有请求流量走Director,而通常响应数据量远大于请求,所以Director的吞吐量瓶颈被大幅突破,能处理极高并发。配置要点:RealServer需要在lo接口配置VIP(ifconfig lo:0 VIP netmask 255.255.255.255),并抑制ARP响应(arp_ignore=1, arp_announce=2),防止VIP冲突。主要限制:(1)Director和RealServer必须在同一物理网段(二层可达),不能跨VLAN;(2)RealServer的VIP配置和ARP抑制容易出错;(3)不支持端口映射,Director监听端口和RealServer端口必须一致;(4)跨网段场景需要用TUN模式或NAT模式。生产中DR模式用得最多,NAT模式适合跨网段,TUN模式适合异地机房。