服务器运维面试题库(带答案)
生成时间:2026-05-23 15:57
【面试题】1. Nginx的upstream模块支持哪些负载均衡策略?请说明各策略的适用场景及配置方式。
【标准答案】
Nginx upstream支持5种主流负载均衡策略:
1)轮询(默认) - 按顺序依次分配请求
upstream backend {
server 192.168.1.10;
server 192.168.1.11;
}适用:后端服务器性能相近,请求量均匀的场景。
2)权重(weight) - 按权重比例分配
upstream backend {
server 192.168.1.10 weight=3;
server 192.168.1.11 weight=1;
}适用:服务器性能差异大,新机器上线逐步切流。
3)IP哈希(ip_hash) - 同一IP固定访问同一服务器
upstream backend {
ip_hash;
server 192.168.1.10;
server 192.168.1.11;
}适用:需要会话保持,如无独立Session存储的传统应用。
4)最少连接(least_conn) - 优先分配给连接数最少的服务器
upstream backend {
least_conn;
server 192.168.1.10;
server 192.168.1.11;
}适用:请求处理时间差异大,如长连接场景。
5)fair(第三方) - 按响应时间动态分配,需安装nginx-upstream-fair模块。 适用:对响应时间敏感的业务。
实际生产中,权重策略最常用,配合健康检查实现灰度发布和故障摘除。
【面试题】2. Tomcat出现大量请求超时,经排查发现线程池已满,请说明如何进行线程池调优。
【标准答案】
Tomcat线程池调优分三步:
第一步:定位问题
# 查看当前线程状态
jstack <pid> | grep "http-nio"
# 统计线程数
ps -eLf | grep tomcat | wc -l发现线程池打满,说明并发请求超过处理能力或处理时间过长。
第二步:调整server.xml配置
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="500" <!-- 最大工作线程,建议CPU核心数×200-500 -->
minSpareThreads="50" <!-- 最小空闲线程 -->
acceptCount="200" <!-- 等待队列长度 -->
maxConnections="10000" <!-- 最大连接数,受系统文件描述符限制 -->
connectionTimeout="20000"
executor="tomcatThreadPool"/>
<Executor name="tomcatThreadPool"
namePrefix="tomcat-http-"
maxThreads="500"
minSpareThreads="50"
maxIdleTime="60000"/>第三步:配合JVM调优
# 调整堆内存,避免频繁GC导致线程阻塞
JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"关键经验:
- maxThreads不是越大越好,过多线程会争抢CPU,反而降低吞吐量
- 先排查慢接口和数据库慢查询,优化业务才是根本
- 配合监控观察TPS和响应时间,找到最优值
【面试题】3. 生产服务器磁盘满了,如何紧急处理并排查根因?
【标准答案】
紧急处理流程:
# 1. 快速定位大文件目录
df -h # 确认哪个分区满
du -sh /* | sort -rh | head -10 # 找出根目录下最大的文件夹
# 2. 定位具体大文件
du -sh /var/* | sort -rh | head -10
# 3. 常见清理动作
# 日志文件(最常见)
> /var/log/nginx/access.log # 清空日志(保留文件)
find /var/log -name "*.log" -mtime +7 -delete # 删除7天前日志
# 临时文件
rm -rf /tmp/*
rm -rf /var/tmp/*
# 包缓存
yum clean all # CentOS
apt clean # Ubuntu
# 4. 验证释放效果
df -h排查根因:
# 查看已删除但未释放空间的文件
lsof | grep deleted
# 找到占用进程后重启
kill -HUP <pid>预防措施:
- 配置日志轮转:/etc/logrotate.d/
- 设置监控告警:磁盘使用率>80%报警
- 日志定期清理脚本 + crontab
【面试题】4. Nginx配置HTTPS时,如何优化SSL/TLS性能并保证安全性?
【标准答案】
安全配置:
server {
listen 443 ssl http2;
server_name example.com;
# 证书配置
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 协议版本(禁用不安全的SSLv3、TLS1.0/1.1)
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件(优先使用强加密)
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# HSTS(强制HTTPS访问)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}性能优化:
# 1. 开启Session复用(减少握手开销)
ssl_session_cache shared:SSL:10m; # 10MB约存储4万个session
ssl_session_timeout 1d;
ssl_session_tickets on;
# 2. OCSP Stapling(避免客户端查询CA)
ssl_stapling on;
ssl_stapling_verify on;
# 3. 开启HTTP/2(多路复用,减少连接)
listen 443 ssl http2;
# 4. 开启SSL硬件加速(如有专用卡)
ssl_engine engine_id;证书更新自动化:
# Let's Encrypt自动续期
certbot renew --dry-run
# 配置crontab每月检查
0 0 1 * * /usr/bin/certbot renew --quiet面试加分: 提到TLS1.3相比1.2减少了1个RTT,首次握手更快;提到证书链完整配置避免客户端额外请求。
【面试题】5. 如何使用Prometheus + Grafana搭建一套完整的服务器监控系统?
【标准答案】
架构设计:
[Node Exporter] → [Prometheus] → [Grafana]
[MySQL Exporter] ↗ ↓
[Nginx VTS] ↗ [Alertmanager] → 钉钉/邮件部署步骤:
1. 安装Node Exporter(数据采集)
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz
tar xvf node_exporter*.tar.gz
./node_exporter &
# 默认监听9100端口2. 配置Prometheus(数据存储)
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['192.168.1.10:9100', '192.168.1.11:9100']
# 告警规则
rule_files:
- /etc/prometheus/alert.rules.yml3. 配置告警规则
# alert.rules.yml
groups:
- name: server-alert
rules:
- alert: HighCPU
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU使用率超过80%"4. Alertmanager配置钉钉通知
route:
receiver: 'dingtalk'
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'http://dingtalk-webhook:8060/dingtalk/robot/send'5. Grafana可视化
- 导入官方模板:Node Exporter Full (ID: 1860)
- 自定义Dashboard展示CPU、内存、磁盘、网络
生产经验:
- Prometheus数据默认保留15天,通过--storage.tsdb.retention.time=90d调整
- 大规模监控考虑Thanos或VictoriaMetrics做长期存储
【面试题】6. Docker容器中运行的应用出现内存泄漏,如何排查并限制资源使用?
【标准答案】
排查步骤:
1. 确认容器资源使用
docker stats <container_id>
# 查看实时资源占用,确认内存持续增长2. 进入容器分析进程
docker exec -it <container_id> bash
# 查看进程内存
ps aux --sort=-%mem | head -103. 生成堆转储分析(Java应用)
# 找到Java进程PID
jps -l
# 生成heap dump
jmap -dump:format=b,file=/tmp/heap.hprof <pid>
# 使用MAT或VisualVM分析内存对象4. 限制容器资源
# 启动时限制内存
docker run -d \
--name myapp \
--memory="2g" \ # 最大内存2G
--memory-swap="2g" \ # 禁用swap
--memory-reservation="1g" \ # 内存软限制
--cpus="1.5" \ # CPU限制
--pids-limit=100 \ # 进程数限制
myimage:latest
# 已运行容器更新限制
docker update --memory="2g" --cpus="1.5" <container_id>5. docker-compose配置
services:
app:
image: myimage
deploy:
resources:
limits:
cpus: '1.5'
memory: 2G
reservations:
memory: 1G预防措施:
- 设置健康检查:HEALTHCHECK --interval=30s CMD curl -f http://localhost/health
- 监控容器指标:cAdvisor + Prometheus
- 定期重启策略:适用于无法快速修复的内存泄漏
【面试题】7. 如何设计一个基于LVS + Keepalived + Nginx的高可用负载均衡架构?
【标准答案】
架构拓扑:
[客户端]
↓
[VIP: 192.168.1.100]
/ \
[LVS-Master] [LVS-Backup]
Keepalived Keepalived
↓ ↓
[Nginx集群 - 3台]
↓
[后端服务器集群]LVS配置(DR模式,性能最优):
# ipvsadm配置(Master节点)
ipvsadm -A -t 192.168.1.100:80 -s wrr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g -w 3
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g -w 2
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.13:80 -g -w 1Keepalived配置:
# /etc/keepalived/keepalived.conf (Master)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100 # Master优先级高于Backup
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
# 健康检查
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.1.11 80 {
weight 3
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}故障切换流程:
- Master故障 → VIP自动漂移到Backup
- 恢复后 → VIP自动切回Master
- Nginx节点故障 → Keepalived自动摘除
关键优势:
- LVS工作在内核态,性能可达百万级并发
- DR模式请求不经LVS返回,网络开销最小
- Keepalived秒级故障切换,业务无感知
【面试题】8. 用户反馈网站访问出现502 Bad Gateway错误,请说明排查思路和解决方案。
【标准答案】
502错误本质: Nginx作为反向代理,无法从上游服务器(如PHP-FPM、Tomcat)获取有效响应。
排查步骤:
1. 确认上游服务状态
# 检查后端服务是否运行
systemctl status php-fpm
systemctl status tomcat
netstat -tlnp | grep 9000
# 检查服务进程
ps aux | grep php-fpm2. 检查Nginx错误日志
tail -100 /var/log/nginx/error.log常见错误信息:
connect() failed (111: Connection refused)→ 服务未启动或端口错误upstream timed out→ 后端处理超时recv() failed (104: Connection reset by peer)→ 后端进程崩溃
3. 检查连接队列
# 查看连接队列溢出
netstat -s | grep "listen queue"
# 或
ss -lnt | grep <port>针对性解决:
场景一:后端服务未启动
systemctl start php-fpm
systemctl enable php-fpm场景二:后端处理慢,超时
# nginx.conf调整超时时间
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;场景三:后端进程数不足
# php-fpm.conf
pm = dynamic
pm.max_children = 50 # 增加进程数
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20场景四:端口耗尽
# 查看端口使用
netstat -n | awk '/^tcp/ {print $NF}' | sort | uniq -c
# 调整系统参数
sysctl -w net.ipv4.ip_local_port_range="10000 65535"预防措施: 监控后端服务健康状态,配置健康检查自动摘除故障节点。
【面试题】9. Nginx的location匹配规则有哪些?优先级如何确定?
【标准答案】
5种匹配类型:
# 1. 精确匹配(最高优先级)
location = /login {
# 只匹配/login,不匹配/login/
}
# 2. 前缀匹配(优先级高,匹配后停止正则搜索)
location ^~ /static/ {
# 匹配/static/开头的请求,不继续检查正则
}
# 3. 正则匹配(区分大小写)
location ~ \.php$ {
# 匹配.php结尾的请求
}
# 4. 正则匹配(不区分大小写)
location ~* \.(gif|jpg|png)$ {
# 匹配图片文件,忽略大小写
}
# 5. 普通前缀匹配(优先级最低)
location / {
# 匹配所有请求
}优先级排序(从高到低):
=精确匹配^~前缀匹配(匹配后停止正则搜索)~和~*正则匹配(按配置文件顺序,先匹配者优先)- 无修饰符的普通前缀匹配(最长匹配优先)
实战案例:
server {
location = / {
# 首页精确匹配,最高优先级
proxy_pass http://homepage;
}
location ^~ /static/ {
# 静态资源前缀匹配,不检查正则
alias /var/www/static/;
}
location ~ \.php$ {
# PHP文件交给FastCGI
fastcgi_pass unix:/tmp/php-fpm.sock;
}
location / {
# 其他请求转发到后端
proxy_pass http://backend;
}
}常见坑:
- 正则location按配置顺序匹配,建议把具体的规则放前面
^~匹配到后不再检查正则,静态资源处理用这个性能更好=精确匹配必须完全一致,/login不匹配/login/
【面试题】10. 如何对Linux服务器进行SSH安全加固?请列出关键措施。
【标准答案】
核心加固措施:
1. 修改默认端口
# /etc/ssh/sshd_config
Port 2222 # 改为非22端口,减少扫描攻击2. 禁用root登录
PermitRootLogin no
# 必须先创建普通用户并配置sudo
useradd -m admin
echo "admin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers3. 密钥认证替代密码
# 客户端生成密钥对
ssh-keygen -t ed25519 -C "admin@example.com"
# 公钥上传到服务器
ssh-copy-id -p 2222 admin@server_ip
# 禁用密码认证
PasswordAuthentication no
PubkeyAuthentication yes4. 限制登录用户和IP
# 只允许特定用户登录
AllowUsers admin@192.168.1.0/24
# 或使用AllowGroups
AllowGroups ssh-users5. 配置登录超时和重试
LoginGraceTime 60 # 登录超时60秒
MaxAuthTries 3 # 最多尝试3次
MaxStartups 3:50:10 # 限制并发连接6. 启用Fail2ban防暴力破解
# 安装
yum install fail2ban -y
# 配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
findtime = 600
bantime = 3600
systemctl enable fail2ban
systemctl start fail2ban7. 双因素认证(可选,高安全要求)
yum install google-authenticator -y
google-authenticator
# /etc/pam.d/sshd 添加
auth required pam_google_authenticator.so8. 其他安全配置
# 禁用空密码
PermitEmptyPasswords no
# 禁用X11转发
X11Forwarding no
# 只使用SSH2协议
Protocol 2验证生效:
sshd -t # 检查配置语法
systemctl restart sshd加固后测试新连接成功再关闭当前窗口,避免锁定!