Skip to content

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

生成时间:2026-05-23 15:57


【面试题】1. Nginx的upstream模块支持哪些负载均衡策略?请说明各策略的适用场景及配置方式。 ​

【标准答案】

Nginx upstream支持5种主流负载均衡策略:

1)轮询(默认) - 按顺序依次分配请求

nginx
upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
}

适用:后端服务器性能相近,请求量均匀的场景。

2)权重(weight) - 按权重比例分配

nginx
upstream backend {
    server 192.168.1.10 weight=3;
    server 192.168.1.11 weight=1;
}

适用:服务器性能差异大,新机器上线逐步切流。

3)IP哈希(ip_hash) - 同一IP固定访问同一服务器

nginx
upstream backend {
    ip_hash;
    server 192.168.1.10;
    server 192.168.1.11;
}

适用:需要会话保持,如无独立Session存储的传统应用。

4)最少连接(least_conn) - 优先分配给连接数最少的服务器

nginx
upstream backend {
    least_conn;
    server 192.168.1.10;
    server 192.168.1.11;
}

适用:请求处理时间差异大,如长连接场景。

5)fair(第三方) - 按响应时间动态分配,需安装nginx-upstream-fair模块。 适用:对响应时间敏感的业务。

实际生产中,权重策略最常用,配合健康检查实现灰度发布和故障摘除。


【面试题】2. Tomcat出现大量请求超时,经排查发现线程池已满,请说明如何进行线程池调优。 ​

【标准答案】

Tomcat线程池调优分三步:

第一步:定位问题

bash
# 查看当前线程状态
jstack <pid> | grep "http-nio"
# 统计线程数
ps -eLf | grep tomcat | wc -l

发现线程池打满,说明并发请求超过处理能力或处理时间过长。

第二步:调整server.xml配置

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调优

bash
# 调整堆内存,避免频繁GC导致线程阻塞
JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

关键经验:

  • maxThreads不是越大越好,过多线程会争抢CPU,反而降低吞吐量
  • 先排查慢接口和数据库慢查询,优化业务才是根本
  • 配合监控观察TPS和响应时间,找到最优值

【面试题】3. 生产服务器磁盘满了,如何紧急处理并排查根因? ​

【标准答案】

紧急处理流程:

bash
# 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

排查根因:

bash
# 查看已删除但未释放空间的文件
lsof | grep deleted

# 找到占用进程后重启
kill -HUP <pid>

预防措施:

  • 配置日志轮转:/etc/logrotate.d/
  • 设置监控告警:磁盘使用率>80%报警
  • 日志定期清理脚本 + crontab

【面试题】4. Nginx配置HTTPS时,如何优化SSL/TLS性能并保证安全性? ​

【标准答案】

安全配置:

nginx
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;
}

性能优化:

nginx
# 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;

证书更新自动化:

bash
# 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(数据采集)

bash
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(数据存储)

yaml
# 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.yml

3. 配置告警规则

yaml
# 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配置钉钉通知

yaml
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. 确认容器资源使用

bash
docker stats <container_id>
# 查看实时资源占用,确认内存持续增长

2. 进入容器分析进程

bash
docker exec -it <container_id> bash
# 查看进程内存
ps aux --sort=-%mem | head -10

3. 生成堆转储分析(Java应用)

bash
# 找到Java进程PID
jps -l
# 生成heap dump
jmap -dump:format=b,file=/tmp/heap.hprof <pid>
# 使用MAT或VisualVM分析内存对象

4. 限制容器资源

bash
# 启动时限制内存
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配置

yaml
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模式,性能最优):

bash
# 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 1

Keepalived配置:

conf
# /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
        }
    }
}

故障切换流程:

  1. Master故障 → VIP自动漂移到Backup
  2. 恢复后 → VIP自动切回Master
  3. Nginx节点故障 → Keepalived自动摘除

关键优势:

  • LVS工作在内核态,性能可达百万级并发
  • DR模式请求不经LVS返回,网络开销最小
  • Keepalived秒级故障切换,业务无感知

【面试题】8. 用户反馈网站访问出现502 Bad Gateway错误,请说明排查思路和解决方案。 ​

【标准答案】

502错误本质: Nginx作为反向代理,无法从上游服务器(如PHP-FPM、Tomcat)获取有效响应。

排查步骤:

1. 确认上游服务状态

bash
# 检查后端服务是否运行
systemctl status php-fpm
systemctl status tomcat
netstat -tlnp | grep 9000

# 检查服务进程
ps aux | grep php-fpm

2. 检查Nginx错误日志

bash
tail -100 /var/log/nginx/error.log

常见错误信息:

  • connect() failed (111: Connection refused) → 服务未启动或端口错误
  • upstream timed out → 后端处理超时
  • recv() failed (104: Connection reset by peer) → 后端进程崩溃

3. 检查连接队列

bash
# 查看连接队列溢出
netstat -s | grep "listen queue"
# 或
ss -lnt | grep <port>

针对性解决:

场景一:后端服务未启动

bash
systemctl start php-fpm
systemctl enable php-fpm

场景二:后端处理慢,超时

nginx
# nginx.conf调整超时时间
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;

场景三:后端进程数不足

ini
# php-fpm.conf
pm = dynamic
pm.max_children = 50    # 增加进程数
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

场景四:端口耗尽

bash
# 查看端口使用
netstat -n | awk '/^tcp/ {print $NF}' | sort | uniq -c
# 调整系统参数
sysctl -w net.ipv4.ip_local_port_range="10000 65535"

预防措施: 监控后端服务健康状态,配置健康检查自动摘除故障节点。


【面试题】9. Nginx的location匹配规则有哪些?优先级如何确定? ​

【标准答案】

5种匹配类型:

nginx
# 1. 精确匹配(最高优先级)
location = /login {
    # 只匹配/login,不匹配/login/
}

# 2. 前缀匹配(优先级高,匹配后停止正则搜索)
location ^~ /static/ {
    # 匹配/static/开头的请求,不继续检查正则
}

# 3. 正则匹配(区分大小写)
location ~ \.php$ {
    # 匹配.php结尾的请求
}

# 4. 正则匹配(不区分大小写)
location ~* \.(gif|jpg|png)$ {
    # 匹配图片文件,忽略大小写
}

# 5. 普通前缀匹配(优先级最低)
location / {
    # 匹配所有请求
}

优先级排序(从高到低):

  1. = 精确匹配
  2. ^~ 前缀匹配(匹配后停止正则搜索)
  3. ~ 和 ~* 正则匹配(按配置文件顺序,先匹配者优先)
  4. 无修饰符的普通前缀匹配(最长匹配优先)

实战案例:

nginx
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. 修改默认端口

bash
# /etc/ssh/sshd_config
Port 2222    # 改为非22端口,减少扫描攻击

2. 禁用root登录

bash
PermitRootLogin no
# 必须先创建普通用户并配置sudo
useradd -m admin
echo "admin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

3. 密钥认证替代密码

bash
# 客户端生成密钥对
ssh-keygen -t ed25519 -C "admin@example.com"

# 公钥上传到服务器
ssh-copy-id -p 2222 admin@server_ip

# 禁用密码认证
PasswordAuthentication no
PubkeyAuthentication yes

4. 限制登录用户和IP

bash
# 只允许特定用户登录
AllowUsers admin@192.168.1.0/24

# 或使用AllowGroups
AllowGroups ssh-users

5. 配置登录超时和重试

bash
LoginGraceTime 60        # 登录超时60秒
MaxAuthTries 3           # 最多尝试3次
MaxStartups 3:50:10      # 限制并发连接

6. 启用Fail2ban防暴力破解

bash
# 安装
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 fail2ban

7. 双因素认证(可选,高安全要求)

bash
yum install google-authenticator -y
google-authenticator
# /etc/pam.d/sshd 添加
auth required pam_google_authenticator.so

8. 其他安全配置

bash
# 禁用空密码
PermitEmptyPasswords no

# 禁用X11转发
X11Forwarding no

# 只使用SSH2协议
Protocol 2

验证生效:

bash
sshd -t    # 检查配置语法
systemctl restart sshd

加固后测试新连接成功再关闭当前窗口,避免锁定!