Skip to content

本轮 服务器运维面试题库(带答案) ​

【面试题】1. Nginx的worker_processes和worker_connections参数如何调优?线上服务器应该怎么配置? ​

【标准答案】 worker_processes建议设置为CPU核心数或auto(自动检测)。worker_connections根据服务器内存和业务并发量来定,一般设置为1024-4096。

计算公式:最大并发连接数 = worker_processes × worker_connections

具体调优思路:

  • 先看CPU核数:lscpu或cat /proc/cpuinfo
  • 再看内存:每个连接大约占4KB内存,1万连接约40MB
  • 线上配置建议:4核8G服务器设worker_processes=4,worker_connections=2048,理论并发8192
  • 同时要调系统文件描述符限制:ulimit -n 65535,并在nginx.conf里加worker_rlimit_nofile 65535

最后别忘了reload平滑生效,不影响现有连接。


【面试题】2. 线上服务器出现502 Bad Gateway,你会从哪些方面排查? ​

【标准答案】 502意味着Nginx作为代理无法从上游服务获得有效响应。排查分四步走:

第一步,看上游服务状态:后端服务挂了吗?端口还在监听吗?用netstat -tlnp或ss -tlnp确认。

第二步,看Nginx错误日志:tail -f /var/log/nginx/error.log,常见原因有:

  • connect() failed:后端没启动或端口错
  • upstream timed out:后端处理太慢,需要调proxy_read_timeout

第三步,检查SELinux或防火墙:很多情况是防火墙拦截了回环端口,临时关闭setenforce 0测试,永久关闭改配置文件。

第四步,检查后端服务进程:是不是进程数满了?是不是被OOM杀掉了?dmesg | grep -i kill查OOM记录。

定位问题后针对性解决:重启服务、调超时、放行端口、扩容资源。


【面试题】3. Nginx的location匹配规则是怎样的?优先级如何排序? ​

【标准答案】 location匹配有四种类型,优先级从高到低:

第一优先级:精确匹配 location = /path 完全相等才匹配,最高优先级。常用于根路径或特定文件。

第二优先级:前缀匹配^~ location ^~ /static/ 匹配后不再检查正则,适合静态资源路径。

第三优先级:正则匹配 location ~ \.php$ 或 location ~* \.jpg$ ~区分大小写,~*不区分大小写。正则之间按配置顺序匹配,先匹配到的生效。

第四优先级:普通前缀匹配 location /api/ 最长前缀匹配,多个都能匹配时选最长的。

记住口诀:等号最高,脱字符停,正则按序,前缀最长。

实际配置建议把精确匹配和^~放前面,正则放中间,通用匹配放最后。


【面试题】4. Linux服务器负载突然升高到20+,你如何快速定位问题? ​

【标准答案】 负载高不一定是CPU问题,可能是IO或内存瓶颈。快速定位分五步:

第一步,确认负载真实性:uptime或top看load average,1/5/15分钟趋势判断是突发还是持续。

第二步,top看进程状态:

  • CPU%高 → 计算密集型,找到进程后用top -Hp PID看线程
  • WA%高 → IO等待,磁盘瓶颈
  • 内存用满 → 可能swap频繁,看free -h

第三步,看IO情况:iostat -x 1,%util高说明磁盘压力大,iotop找罪魁祸首进程。

第四步,看连接数:netstat -an | grep ESTAB | wc -l,连接数暴增可能是攻击或业务异常。

第五步,看日志:应用日志、系统日志/var/log/messages,找到异常报错。

定位后处理:杀掉异常进程、重启服务、扩容资源、加限流熔断。重点是要先稳住服务,再查根因。


【面试题】5. Docker容器的资源限制怎么配置?生产环境要注意什么? ​

【标准答案】 Docker通过cgroups限制资源,核心参数三个:

内存限制:-m 512m或--memory=512m,配合--memory-swap限制交换内存。注意只设内存不设swap,容器可能把宿主swap吃满。

CPU限制:--cpus=1.5限制最多用1.5核,--cpuset-cpus=0,1绑定到指定CPU核心。还有--cpu-shares设置权重,相对值只在竞争时生效。

IO限制:--device-read-bps限制读速度,--device-write-iops限制写IO次数。

生产环境注意事项:

  1. 健康检查必配:HEALTHCHECK指令,配合--restart=on-failure
  2. 日志限制:--log-driver json-file --log-opt max-size=100m --log-opt max-file=3,否则日志撑爆磁盘
  3. 不要用latest标签:明确版本号,避免意外升级
  4. 资源预留:生产环境必须限制,否则一个容器故障影响整台机器
  5. 监控告警:用Prometheus + cAdvisor监控容器资源使用

【面试题】6. Keepalived + Nginx实现高可用,原理是什么?脑裂问题如何解决? ​

【标准答案】 Keepalived基于VRRP协议(虚拟路由冗余协议)实现高可用。

工作原理:

  • 两台Nginx服务器组成主备,配置相同VIP(虚拟IP)
  • Master节点周期性发送VRRP组播报文宣告自己存活
  • Backup节点超时未收到报文则认为Master故障,抢占VIP
  • 客户端只感知VIP,故障切换透明

脑裂问题:主备同时拥有VIP,原因通常是网络分区或防火墙阻断VRRP报文。

解决方案:

  1. 检查网络配置:确保主备间网络通畅,VRRP报文(协议号112)未被防火墙拦截
  2. 配置vrrp_script检测脚本:不仅检测Keepalived进程,还要检测Nginx进程,Nginx挂了也要触发切换
  3. 使用双机心跳线:主备间用交叉线直连,避免网络分区误判
  4. 调整优先级和抢占模式:nopreempt配置不抢占模式,或调整advert_int心跳间隔更敏感
  5. 监控报警:两边都绑定时立即告警

【面试题】7. Linux文件描述符限制如何查看和修改?为什么服务器需要调大这个参数? ​

【标准答案】 文件描述符是Linux对打开文件的索引,网络连接、文件读写都占用fd。

查看限制:

  • 软限制(当前生效):ulimit -n
  • 硬限制(最大值):ulimit -Hn
  • 进程级别:cat /proc/<PID>/limits
  • 系统级别:cat /proc/sys/fs/file-nr(已分配/未使用/最大值)

临时修改:ulimit -n 65535,仅当前shell生效

永久修改(两处都要改):

  1. /etc/security/limits.conf:
* soft nofile 65535
* hard nofile 65535
  1. /etc/sysctl.conf:fs.file-max = 200000,然后sysctl -p生效

为什么要调大:

  • Nginx/Apache等高并发服务器,每个连接占用一个fd
  • 数据库连接池、缓存连接都消耗fd
  • 默认1024对于生产环境太小,高并发场景轻松超限导致Too many open files错误

配置后需重启服务生效,建议生产环境至少65535起步。


【面试题】8. Tomcat线程池参数怎么调优?Connector的maxThreads、acceptCount、maxConnections有什么区别? ​

【标准答案】 这是Tomcat性能调优的核心问题,三个参数作用不同:

maxThreads:处理请求的最大工作线程数,决定了并发处理能力。默认200,CPU密集型设CPU核数×2,IO密集型可设到500-1000。设太大会增加上下文切换开销。

maxConnections:最大连接数,TCP层面能接受的最大连接。NIO模式下默认10000,APR模式8192。超过这个数新连接会被拒绝。

acceptCount:等待队列长度,所有工作线程都在忙时,新请求进等待队列排队。默认100,队列满返回连接拒绝。

处理流程: 请求进来 → 未超过maxConnections则接受 → 工作线程有空闲则处理 → 无空闲则进acceptCount队列 → 队列满则拒绝

调优建议:

  • 先压测确定最佳线程数:maxThreads = (RT × QPS目标) / 安全系数
  • acceptCount设为maxThreads的1-2倍,避免队列太长导致超时
  • 高并发场景配合executor线程池统一管理
  • 监控currentThreadCount和currentThreadsBusy指标判断瓶颈

【面试题】9. Prometheus + Grafana监控体系怎么搭建?核心指标有哪些? ​

【标准答案】 这是云原生监控的事实标准。搭建分三块:

架构组成:

  • Prometheus:时序数据库,主动拉取指标,支持PromQL查询
  • Grafana:可视化面板,对接Prometheus数据源,配置告警
  • Exporter:指标采集器,node_exporter采集主机,各种应用有对应exporter

部署步骤:

  1. 安装Prometheus:下载二进制或Docker,配置prometheus.yml定义抓取目标
  2. 部署Exporter:被监控节点装node_exporter,应用暴露/metrics接口
  3. 配置Grafana:添加Prometheus数据源,导入现成Dashboard(如Node Exporter Full)
  4. 配置告警规则:在Prometheus配置alerting_rules.yml

核心监控指标:

  • 主机层:CPU使用率、内存使用率、磁盘IO、网络流量、系统负载
  • 应用层:QPS、响应时间、错误率、活跃连接数、线程池状态
  • 业务层:订单量、用户活跃数、交易成功率(自定义指标暴露)

告警规则示例:

yaml
- alert: HighCPU
  expr: 100 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 > 80
  for: 5m

重点是先建立监控,再配置告警,最后根据数据优化。


【面试题】10. 服务器被DDoS攻击,你如何应急处理? ​

【标准答案】 DDoS攻击特点是流量巨大、来源分散。应急处理分三个阶段:

第一阶段:快速止损

  1. 启用CDN/WAF:如果有接入,立即开启高防模式,清洗流量
  2. 封禁攻击IP:分析access_log找出攻击特征IP,iptables -I INPUT -s x.x.x.x -j DROP批量封禁
  3. 限制连接数:Nginx配置limit_conn_zone和limit_req_zone限制单IP并发和请求频率
  4. 临时扩容:增加带宽和服务器节点分散流量

第二阶段:深度分析

  1. 分析攻击类型:SYN Flood、HTTP Flood、CC攻击?
  2. 提取攻击特征:User-Agent、Referer、请求URL特征
  3. tcpdump -i eth0 -w attack.pcap抓包分析

第三阶段:防护加固

  1. 接入高防服务:阿里云DDoS高防、腾讯云大禹等
  2. 配置防火墙策略:iptables限制SYN频率,sysctl调TCP参数
  3. 应用层防护:验证码、频率限制、黑名单机制
  4. 架构优化:前后端分离、静态资源CDN、数据库读写分离

关键是平时就要有预案,攻击发生时从容应对,不要等被打瘫了才想办法。


生成时间:2026-05-21 23:53