nginx面试题
1. Nginx 是什么?有什么特点?
nginx就是一个轻量级的http web服务器【直接对外提供静态资源(HTML/CSS/JS/ 图片)服务】、反向代理服务器【隐藏后端服务器】,可以做负载均衡【反向代理服务器所以可以请求分发】,支持高并发,因为异步非阻塞呗
2. Nginx 为什么高并发、高性能?
同步阻塞:就像一个服务员(进程 / 线程)服务一桌客人,必须等这桌点单、上菜、结账全部完成,才能去服务下一桌,效率极低;
异步非阻塞:Nginx 就像一个「大堂经理」(master 进程)+ 几个「全能服务员」(worker 进程),服务员接了客人的需求(比如请求一个文件),不用站在原地等厨房(磁盘 / 后端服务)出餐,而是先去服务其他客人,等厨房喊 "好了"(事件就绪),再回来处理这个需求。
答案:
- 采用多进程 + 异步非阻塞事件驱动模型(epoll/kqueue)
- 一个 master 进程管理多个 worker 进程
- 每个 worker 单线程处理大量请求,不阻塞
- 内存占用极低,连接复用好
- 处理请求不创建新进程 / 线程,开销极小
3. 什么是反向代理?Nginx 如何实现?
反向代理的由来:
部署的时候,后端是打成jar包,请求太多的时候,一台服务器搞不定了,就需要让jar包放到两台甚至多台服务器上,但随之就会出现很多问题,每台服务器的ip是不同的 ,用户咋可能记得这么多ip,为了能让用户的请求平均达到每一台服务器上,所以需要有一个反向代理的功能,就是不再去请求部署项目的主机,而是只固定请求一台主机(nginx),请求是打到nginx上,nginx能实现反向代理负载均衡,相当于一个请求转发器,把对应的请求发到不同的主机上(类似平均分配)
反向代理:用户直接给代理服务器发请求,它压根不知道后端服务器的ip
正向代理:用户知道后端服务器的ip,但不直接给他发请求,还是给代理服务器发,让代理服务器给后端服务器发
其实二者的核心区别只有一个:代理的对象不同
正向代理:代理客户端,客户端主动配置代理服务器,通过代理访问目标服务器,目标服务器无法得知真实客户端的 IP,隐藏了客户端,例如vpn,这里可以讲一下vpn的流程
- 客户端与VPN代理服务器建立链接 2.请求转发 3.目标服务器回传数据 4.客户端获取信息
反向代理:代理服务器端 ,客户端直接访问代理服务器,由代理服务器转发请求至后端真实服务器,客户端无法得知真实服务器的 IP,隐藏了服务器集群,Nginx 的核心应用就是反向代理。
简单总结:代理哪端,就隐藏哪端
4. Nginx 负载均衡有哪些策略?
答案:
- 轮询:多个服务器,按照顺序去访问,这样的话,每个服务器都能获得相同的请求次数。
- 随机:根据随机算法获取目标服务器地址,进行请求。
- 一致性hash:根据客户端的ip进行哈希算法,得到指定的服务器
- 最小连接数:将请求转发给连接数最少的目标服务器。
1、轮询(默认):如果目标服务器性能相同,一般使用轮询。 默认不修改即可
2、权重:如果目标服务器性能不同,一般使用权重。
upstream tomcat-nginx{
# 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=3; }
3、ip哈希 同一个客户端访问同一个目标服务器。 根据客户端的ip进行哈希算法,得到指定的服务器。 作用:会话保持。
upstream tomcat-nginx{
# 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器
ip_hash; 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哈希,因为性能较低。使用token进行会话跟踪。
4、最少连接数:将请求转发给连接数最少的目标服务器。
upstream tomcat-nginx{
# 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器
least_conn;
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=3; }
4、响应时间最少(第三方):统计目标服务器的处理请求的平均时长,谁的时间短给谁。
upstream tomcat-nginx{
# 负载均衡服务器设置:主要用于负载均衡和设置一系列的后端服务器
fair;
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=3;}
5. Nginx 常用优化配置
答案:
- 调整 worker_processes:设为 CPU 核心数
- worker_connections:增大最大连接数
- 开启 keepalive 长连接
- 开启 gzip 压缩
- 设置 expires 缓存静态资源
- 隐藏 Nginx 版本号
- 限制请求速率、并发连接防攻击
6. Nginx 常用命令
答案:
- 启动:
nginx - 停止:
nginx -s stop - 优雅停止:
nginx -s quit - 重新加载配置:
nginx -s reload - 测试配置:
nginx -t - 查看版本:
nginx -v
7. Nginx 和 Apache 区别
答案:
- Nginx:异步非阻塞,高并发强,轻量,适合静态、反向代理
- Apache:同步多进程,稳定,模块丰富,适合动态请求
- 高并发场景:Nginx 远优于 Apache
8. Nginx 集群问题是什么?如何解决?
答案:
惊群:多个 worker 同时争抢同一个连接,造成资源浪费。
Nginx 解决方案:
- 采用互斥锁(accept_mutex)
- 同一时间只有一个 worker 去 accept 连接
Docker面试题
1. Docker 是什么?
答案:
Docker 是一个开源的应用容器引擎
可以将打包的应用及其所需要的依赖 形成一个轻量级、可移植的镜像 ,可以迁移到任意Linux操作系统,实现一次封装,到处运行。
2. 容器 vs 虚拟机(必问)
答案:
-
传统虚拟机是 虚拟化硬件(cpu,内存,硬盘),在虚拟硬件上安装完整的操作系统,然后再系统上安装软件,每个虚拟机都有独立内核
-
容器是 虚拟化操作系统(软件呗),容器没有自己的内核,共享宿主机的内核 (容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了)
-
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

3. Docker 三大核心概念
答案:
- 镜像(Image):只读模板,用来创建容器。
- 容器(Container):镜像的运行实例。
- 仓库(Repository):存放镜像的地方(Docker Hub、私有仓库)。
4. Docker 为什么快?
答案:
- 容器共享宿主机内核,不需要启动完整 OS
- 容器是进程级启动,秒级启动
- 联合文件系统(UnionFS),分层存储,复用层
5. Docker 常用命令(必背)
答案:
plaintext
# 搜索/拉取/查看/删除镜像
docker search
docker pull
docker images
docker rmi
# 容器操作
docker run # 创建并启动
docker ps # 查看运行中容器
docker ps -a # 所有容器
docker start/stop/restart 容器ID
docker rm # 删除容器
docker exec -it 容器ID /bin/bash # 进入容器
docker logs 容器ID # 查看日志
6. docker run 常用参数
答案:
-d:后台运行-p:端口映射 宿主机:容器-P:随机端口--name:指定容器名-v:挂载目录--restart=always:开机自启-e:设置环境变量
7. Docker 数据卷(Volume)是什么?
答案:
数据卷是宿主机目录 / 文件,直接挂载到容器内部。
那说白了就是 持久化容器数据+容器与宿主机/容器 共享数据(都可以访问数据卷呗)
作用:
- 数据卷将容器数据存储在宿主机上,容器删除、重建时,数据依然保留。(容器数据持久化)
- 容器与宿主机共享数据
- 多个容器共享数据:多个容器可以挂载同一个数据卷,实现数据共享(比如多个 Web 容器共享同一个静态资源目录)。
8. Docker 网络模式(看一眼)
答案:
四种常用网络模式:
- bridge:默认,独立网络,端口映射
当你运行一个容器而不指定 -network参数时,就是用的bridge
工作原理:docker在宿主机上默认创建一个名为docker0的虚拟网桥(网关),docker会给每个容器分配一个独立的IP(比如172.17.0.2,那虚拟网桥的ip就是172.17.0.1呗)
-
容器间要通信,需要通过docker0这个虚拟网桥转发
-
外部访问,必须使用-p 8080:8080做端口映射,把容器的端口映射到宿主机上(宿主机 IP + 映射端口)

2.host:与宿主机共享网络
-
容器直接使用宿主机的IP地址,不在有自己独立的IP
-
外部访问,不需要做端口映射。(容器监听的端口,比如8080,直接暴露在宿主机上,直接用宿主的ip呗 宿主机ip+容器端口)
3.none:无网络
4.container:与另一个容器共享网络
https://developer.aliyun.com/article/1688008 这个很重要
9. Dockerfile 是什么?
答案:
Dockerfile 是构建镜像的脚本文件,包含一条条指令。
通过 docker build 自动构建镜像。
10. Dockerfile 常用指令
答案:
plaintext
FROM # 基础镜像
MAINTAINER # 作者
RUN # 构建时执行命令
CMD # 容器启动默认命令
ENTRYPOINT # 固定启动命令
EXPOSE # 暴露端口
ENV # 环境变量
ADD/COPY # 拷贝文件
VOLUME # 数据卷
WORKDIR # 工作目录
11. CMD vs ENTRYPOINT
答案:
-
CMD:可被命令行参数覆盖
-
ENTRYPOINT
:不会被覆盖,一定会执行
常配合使用:
ENTRYPOINT + CMD
12.如何优化 Docker 镜像体积?
-
选择体积小的基础镜像;
-
合并 RUN 命令;
-
删除无用缓存;
-
使用
.dockerignore; -
使用多阶段构建。
13.镜像和容器的区别
镜像是静态的模板,用于创建容器。只能读
容器是镜像的运行实例,可读可写
工作目录
------
## 11. CMD vs ENTRYPOINT
**答案:**
- **CMD**:可被命令行参数覆盖
- ENTRYPOINT
:不会被覆盖,一定会执行
常配合使用:
ENTRYPOINT + CMD
## 12.如何优化 Docker 镜像体积?
1. 选择体积小的基础镜像;
2. 合并 RUN 命令;
3. 删除无用缓存;
4. 使用 `.dockerignore`;
5. 使用多阶段构建。
## 13.镜像和容器的区别
镜像是静态的模板,用于创建容器。只能读
容器是镜像的运行实例,可读可写
多个容器可以共享同一个镜像。