0. 正向代理 vs 反向代理

核心区别只有一个:代理的对象不同

  • 正向代理:代理的是客户端。客户端主动配置代理服务器再去访问目标站点,目标站点看不到真实客户端。
  • 反向代理:代理的是服务端。客户端直接访问代理服务器,代理再转发给后端业务服务器,客户端看不到真实后端。

一句话:代理哪一端,就隐藏哪一端。

正向代理

  • 访问流程:客户端 -> 代理服务器 -> 目标服务器
  • 场景:科学上网、企业统一外网出口

反向代理

  • 访问流程:客户端 -> 反向代理(Nginx)-> 后端服务器集群
  • 场景:负载均衡、统一入口、隐藏后端、SSL 终止

Nginx 反向代理示例:

location / {
  proxy_pass http://127.0.0.1:8080;
}

通俗解释:
把 Nginx 当成商场前台。顾客只和前台打交道,前台再把事情分给不同柜台处理。


1. Nginx 负载均衡有哪些策略

常见策略:

  • 轮询(默认):按顺序分发请求。
  • 权重(weight):机器性能强就给更高权重。
  • ip_hash:同一来源 IP 尽量落到同一台机器。
  • least_conn:优先分配给当前连接数最少的机器。

轮询 / 权重示例

upstream backend {
  server 127.0.0.1:8080 weight=1;
  server 127.0.0.1:8081 weight=2;
  server 127.0.0.1:8082 weight=3;
}

ip_hash 示例

upstream backend {
  ip_hash;
  server 127.0.0.1:8080;
  server 127.0.0.1:8081;
  server 127.0.0.1:8082;
}

least_conn 示例

upstream backend {
  least_conn;
  server 127.0.0.1:8080;
  server 127.0.0.1:8081;
  server 127.0.0.1:8082;
}

补充说明:

  • fair(按响应时间)通常是第三方模块能力,不是 Nginx 官方默认内置策略。
  • ip_hash 不是绝对“性能低”,它的主要问题是扩缩容时重映射影响会话,且对 NAT 场景不够友好;现代系统更常用无状态登录(JWT/Token)配合共享会话存储。

通俗解释:
负载均衡像餐厅分桌。轮询是按顺序排号,权重是给大桌多安排人,least_conn 是看哪桌人最少先安排。


2. Nginx 是什么,有什么特点

Nginx 是高性能 HTTP 服务器、反向代理服务器,也可做负载均衡和邮件代理。

特点:

  • 内存占用小,并发能力强
  • 异步非阻塞,事件驱动
  • 适合做反向代理、动静分离、负载均衡
  • 稳定性和扩展性高

通俗解释:
Nginx 适合做“入口网关”,让后端应用专注业务逻辑。


3. Nginx 为什么高并发、高性能

  • 多进程 + 事件驱动模型(Linux 常见是 epoll)
  • master 管理进程,worker 处理请求
  • 每个 worker 单线程也能同时处理大量连接
  • 避免频繁创建线程/进程,减少系统开销

通俗解释:
它不是“一个请求一个线程”那种重模式,而是一个人同时盯很多请求,谁准备好了就先处理谁。


4. Nginx 的 master 和 worker 进程作用

  • master:读取配置、管理 worker、接收信号(重载配置、平滑重启)
  • worker:真正处理网络请求和响应

通俗解释:
master 像调度主管,worker 像一线客服。


5. 什么是动静分离,Nginx 如何做

将静态资源(html/css/js/img)和动态接口分开处理。

  • 静态资源:Nginx 直接返回
  • 动态请求:Nginx 转发给 Java/SpringBoot 等后端服务

示例:

location ~ .*\.(html|css|js|jpg|png)$ {
  root /static;
  expires 7d;
}

location /api/ {
  proxy_pass http://backend;
}

通俗解释:
图片、样式这些“现成货”前台直接给;要查数据库的“定制单”再交后厨。


6. Nginx 如何实现高可用

  • 部署多台 Nginx
  • 用 Keepalived 提供 VIP(虚拟 IP)
  • 主节点故障时自动切换到备节点
  • 下游继续用 upstream 做业务负载均衡

通俗解释:
像双机热备,一个入口挂了,另一个立刻顶上。


7. Nginx 常用优化配置

  • worker_processes 一般设为 CPU 核数
  • worker_connections 按并发需求调大
  • 启用 keepalive 长连接
  • 启用 gzip 压缩
  • 对静态资源设置 expires
  • 隐藏版本号(server_tokens off;
  • 加限流限连(如 limit_reqlimit_conn

通俗解释:
优化本质上是三件事:少建连接、少传字节、少被恶意请求拖垮。


8. Nginx location 匹配规则

常见优先级(高到低):

  1. = 精确匹配
  2. ^~ 前缀匹配(命中后不再走正则)
  3. ~ 区分大小写正则
  4. ~* 不区分大小写正则
  5. 普通前缀匹配

通俗解释:
先看“完全一致”,再看“强前缀”,再看“正则”,最后才是普通前缀。


9. Nginx 如何实现 Rewrite 重写

使用 rewrite 指令,按正则改 URI。

常见场景:

  • 旧地址跳新地址
  • 伪静态
  • HTTP 跳转 HTTPS

示例:

rewrite ^/old/(.*)$ /new/$1 permanent;

通俗解释:
Rewrite 就是“地址翻译器”,对外看是新地址,对内可映射到旧逻辑。


10. Nginx 和 Apache 区别

  • Nginx:异步非阻塞,反向代理与高并发场景更强
  • Apache:生态历史久,模块丰富,传统动态场景经验多
  • 大并发静态与网关场景常优先 Nginx

通俗解释:
Nginx 像高速分发器,Apache 像功能齐全的老牌全能选手。


11. Nginx 惊群问题是什么,如何解决

惊群:多个 worker 同时被唤醒去抢同一个连接,只有一个成功,其余白忙。

常见缓解思路:

  • accept_mutex 让连接接收更有序
  • 新版本和不同系统机制下,内核层面也有优化

通俗解释:
像一个电话响了,所有客服都去抢,最后只有一个接到,其他人白跑。


12. Nginx 如何配置 HTTPS

基本步骤:

  • 申请 SSL 证书
  • 监听 443 ssl
  • 配置证书和私钥
  • 可选:80 强制跳转到 443

示例:

server {
  listen 443 ssl;
  server_name example.com;
  ssl_certificate cert.pem;
  ssl_certificate_key cert.key;
}

通俗解释:
HTTPS 就是给网站通信加“防窃听的加密通道”。


13. Nginx 适用场景总结

  • 静态资源服务
  • 反向代理
  • 负载均衡
  • 动静分离
  • API 网关与转发
  • HTTPS 接入层

Docker 面试题

1. Docker 是什么

Docker 是开源容器平台,用来把应用和依赖打包成容器,实现跨环境一致运行。

通俗解释:
像把应用连同运行环境一起装进“标准集装箱”,搬到哪都能跑。


2. 容器 vs 虚拟机

  • 虚拟机:每个实例都有完整 Guest OS,隔离强但更重
  • 容器:共享宿主机内核,启动快、占用小

一句话:虚拟机是操作系统级隔离,容器是进程级隔离。

通俗解释:
虚拟机像“一人一套房”,容器像“同楼不同房间”。


3. Docker 三大核心概念

  1. 镜像(Image):只读模板。
  2. 容器(Container):镜像运行后的实例。
  3. 仓库(Repository/Registry):存放镜像。

通俗解释:
镜像像“菜谱”,容器像“做出来的菜”,仓库像“菜谱库”。


4. Docker 工作原理 / 架构

  • Client:你输入命令的客户端
  • Docker Daemon:后台服务,负责真正执行
  • Registry:镜像仓库

核心流程:拉镜像 -> 启容器 -> 运行应用。

通俗解释:
你下单(Client),后厨执行(Daemon),食材库供货(Registry)。


5. Docker 为什么快

  • 共享宿主机内核,不必启动完整 OS
  • 容器本质是受限进程,启动秒级
  • 分层文件系统提高复用率

通俗解释:
不是重装一台电脑再运行程序,而是直接拉起一个隔离进程。


6. UnionFS(联合文件系统)是什么

UnionFS 是分层文件系统思想,镜像由多层只读层组成,容器运行时再叠加一层可写层。

通俗解释:
像透明塑料片一层层叠起来,最终看到的是合成结果。


7. 镜像分层有什么好处

  • 层复用,节省存储
  • 只重建变化层,加快构建
  • 已有层不重复下载,加快分发

通俗解释:
改了一页就只重新打印那一页,不用整本重印。


8. Docker 容器生命周期状态

  • created
  • running
  • paused
  • exited/stopped
  • removed

说明:面试中常说“deleted”,更准确的术语是 removed

通俗解释:
容器也有“创建、运行、暂停、停止、删除”的生命周期。


9. Docker 常用命令

# 镜像操作
docker search nginx
docker pull nginx
docker images
docker rmi nginx

# 容器操作
docker run -d --name web -p 80:80 nginx
docker ps
docker ps -a
docker start web
docker stop web
docker rm web
docker logs web
docker exec -it web sh

补充:docker exec -it <容器> /bin/bash 在某些精简镜像(如 Alpine)可能没有 bash,用 sh 更通用。


10. docker run 常用参数

  • -d:后台运行
  • -p:端口映射(宿主机:容器)
  • -P:随机映射到宿主机高位端口
  • --name:容器名
  • -v:挂载卷
  • --restart=always:重启策略
  • -e:环境变量

通俗解释:
docker run 就是“创建+配置+启动”一次完成。


11. Docker 数据卷(Volume)是什么

卷是独立于容器生命周期的数据存储方式,可挂载到容器目录中。

作用:

  • 数据持久化
  • 容器与宿主机共享数据
  • 多容器共享数据

通俗解释:
容器可以删,但数据放在“外置硬盘”(Volume)里不会丢。


12. Docker 网络模式

常见模式:

  1. bridge:默认模式,容器在独立网桥网络里
  2. host:共享宿主机网络命名空间
  3. none:不配置网络
  4. container:<name|id>:与另一容器共享网络栈

通俗解释:
就是给容器选择“怎么连网”的不同方案。


13. Dockerfile 是什么

Dockerfile 是镜像构建脚本,按指令逐层构建镜像。

通俗解释:
像自动化做菜步骤,按顺序执行,最后产出镜像。


14. Dockerfile 常用指令

FROM         # 基础镜像
RUN          # 构建时执行命令
CMD          # 默认启动命令(可被覆盖)
ENTRYPOINT   # 固定入口命令
EXPOSE       # 声明端口
ENV          # 环境变量
COPY         # 复制文件(推荐)
ADD          # 复制+自动解压等增强能力
VOLUME       # 声明卷挂载点
WORKDIR      # 工作目录

补充:MAINTAINER 已废弃,建议用 LABEL maintainer="xxx"


15. CMD vs ENTRYPOINT

  • CMD:提供默认参数/默认命令,运行时容易被覆盖
  • ENTRYPOINT:固定主命令,运行参数通常追加在后面

常见组合:ENTRYPOINT + CMD

通俗解释:
ENTRYPOINT 像“主程序”,CMD 像“默认参数”。


16. ADD vs COPY

  • COPY:纯复制,行为简单可控,推荐优先
  • ADD:额外支持自动解压本地压缩包等能力

说明:ADD 虽然功能多,但可读性和可控性较差,面试里回答“优先 COPY,需要额外能力再 ADD”更稳。


17. Docker Compose 是什么

Compose 是多容器编排工具,用一个 YAML 文件定义多个服务并统一启动。

  • 常见文件:compose.yml(也兼容 docker-compose.yml
  • 常见命令:docker compose up -d

通俗解释:
以前一个个起容器,现在一条命令“整套系统一起起”。


18. Docker 如何实现隔离

  • Namespace:做资源视图隔离(进程、网络、挂载等)
  • Cgroups:做资源配额和限制(CPU、内存、IO)

通俗解释:
Namespace 负责“看见什么”,Cgroups 负责“最多能用多少”。


19. Cgroups 作用

  • 限制 CPU、内存、磁盘 IO
  • 防止单个容器吃光机器资源

通俗解释:
给每个容器设“资源上限”,避免互相抢死。


20. Docker 镜像为什么只读

镜像做成只读分层,便于复用、分发和保证一致性;容器运行时再叠加可写层。

通俗解释:
基础模板不改,改动都写在临时层,便于回滚和复用。


21. 容器退出数据为什么会丢

默认写入容器可写层,容器被删除时可写层一起删除,所以数据会丢。

解决方式:

  • 用 Volume
  • 或 bind mount(-v /host:/container

通俗解释:
数据写在“临时沙盘”里,沙盘扔了数据就没了。


22. Docker 安全注意点

  • 尽量不用 root 运行容器
  • 使用可信镜像来源并定期扫描漏洞
  • 镜像最小化,减少攻击面
  • 加资源限制
  • 及时更新 Docker 与基础镜像

通俗解释:
容器不是天然绝对安全,最关键是最小权限和持续更新。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐