本轮 服务器运维面试题库(带答案)
【面试题】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次数。
生产环境注意事项:
- 健康检查必配:
HEALTHCHECK指令,配合--restart=on-failure - 日志限制:
--log-driver json-file --log-opt max-size=100m --log-opt max-file=3,否则日志撑爆磁盘 - 不要用latest标签:明确版本号,避免意外升级
- 资源预留:生产环境必须限制,否则一个容器故障影响整台机器
- 监控告警:用Prometheus + cAdvisor监控容器资源使用
【面试题】6. Keepalived + Nginx实现高可用,原理是什么?脑裂问题如何解决?
【标准答案】 Keepalived基于VRRP协议(虚拟路由冗余协议)实现高可用。
工作原理:
- 两台Nginx服务器组成主备,配置相同VIP(虚拟IP)
- Master节点周期性发送VRRP组播报文宣告自己存活
- Backup节点超时未收到报文则认为Master故障,抢占VIP
- 客户端只感知VIP,故障切换透明
脑裂问题:主备同时拥有VIP,原因通常是网络分区或防火墙阻断VRRP报文。
解决方案:
- 检查网络配置:确保主备间网络通畅,VRRP报文(协议号112)未被防火墙拦截
- 配置vrrp_script检测脚本:不仅检测Keepalived进程,还要检测Nginx进程,Nginx挂了也要触发切换
- 使用双机心跳线:主备间用交叉线直连,避免网络分区误判
- 调整优先级和抢占模式:
nopreempt配置不抢占模式,或调整advert_int心跳间隔更敏感 - 监控报警:两边都绑定时立即告警
【面试题】7. Linux文件描述符限制如何查看和修改?为什么服务器需要调大这个参数?
【标准答案】 文件描述符是Linux对打开文件的索引,网络连接、文件读写都占用fd。
查看限制:
- 软限制(当前生效):
ulimit -n - 硬限制(最大值):
ulimit -Hn - 进程级别:
cat /proc/<PID>/limits - 系统级别:
cat /proc/sys/fs/file-nr(已分配/未使用/最大值)
临时修改:ulimit -n 65535,仅当前shell生效
永久修改(两处都要改):
/etc/security/limits.conf:
* soft nofile 65535
* hard nofile 65535/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
部署步骤:
- 安装Prometheus:下载二进制或Docker,配置
prometheus.yml定义抓取目标 - 部署Exporter:被监控节点装
node_exporter,应用暴露/metrics接口 - 配置Grafana:添加Prometheus数据源,导入现成Dashboard(如Node Exporter Full)
- 配置告警规则:在Prometheus配置
alerting_rules.yml
核心监控指标:
- 主机层:CPU使用率、内存使用率、磁盘IO、网络流量、系统负载
- 应用层:QPS、响应时间、错误率、活跃连接数、线程池状态
- 业务层:订单量、用户活跃数、交易成功率(自定义指标暴露)
告警规则示例:
- alert: HighCPU
expr: 100 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 > 80
for: 5m重点是先建立监控,再配置告警,最后根据数据优化。
【面试题】10. 服务器被DDoS攻击,你如何应急处理?
【标准答案】 DDoS攻击特点是流量巨大、来源分散。应急处理分三个阶段:
第一阶段:快速止损
- 启用CDN/WAF:如果有接入,立即开启高防模式,清洗流量
- 封禁攻击IP:分析access_log找出攻击特征IP,
iptables -I INPUT -s x.x.x.x -j DROP批量封禁 - 限制连接数:Nginx配置
limit_conn_zone和limit_req_zone限制单IP并发和请求频率 - 临时扩容:增加带宽和服务器节点分散流量
第二阶段:深度分析
- 分析攻击类型:SYN Flood、HTTP Flood、CC攻击?
- 提取攻击特征:User-Agent、Referer、请求URL特征
tcpdump -i eth0 -w attack.pcap抓包分析
第三阶段:防护加固
- 接入高防服务:阿里云DDoS高防、腾讯云大禹等
- 配置防火墙策略:iptables限制SYN频率,
sysctl调TCP参数 - 应用层防护:验证码、频率限制、黑名单机制
- 架构优化:前后端分离、静态资源CDN、数据库读写分离
关键是平时就要有预案,攻击发生时从容应对,不要等被打瘫了才想办法。
生成时间:2026-05-21 23:53