Nginx 常见面试题总结
什么是 Nginx ?
俄罗斯的工程师 Igor Sysoev,在 Rambler Media 工作期间使用 C 语言开发并开源了 Nginx。
Nginx 同 Apache 一样都是 WEB 服务器,不过,Nginx 更加轻量级,它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。并且,Nginx 可以作为反向代理服务器使用,支持 IMAP/POP3/SMTP 服务。
Web 服务器:负责处理和响应用户请求,一般也称为 HTTP 服务器。
Nginx 的特点是有哪些?
- 内存占用非常少 :一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发连接的基础。
- 高并发 : 单机支持 10 万以上的并发连接
- 跨平台 :可以运行在 Linux,Windows,FreeBSD,Solaris,AIX,Mac OS 等操作系统上。
- 扩展性好 :第三方插件非常多!
- 安装使用简单 :对于简单的应用场景,我们很快就能够上手使用。
- 稳定性好 :bug 少,不会遇到各种奇葩的问题。
- 免费 :开源软件,免费使用。
- ......
Nginx 能用来做什么?
静态资源服务器
Nginx 可以将服务器上的静态文件(如 HTML、CSS、JS、图片)缓存下来,通过 HTTP 协议展现给客户端。因此,我们可以使用 Nginx 搭建静态资源 Web 服务器/缓存服务器。不过,要记得使用 gzip 压缩静态资源来减少网络传输。
当客户端第一次请求静态资源的时候,会从服务器直接返回,Nginx 同时也会缓存一份静态资源。如果后续客户端请求相同的静态资源,只要对应的缓存未被清理且没有过期,就可以直接从 Nginx 缓存中取出返回给客户端了。

反向代理
客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。
举个例子:公司内网部署了 3 台服务器,客户端请求直接经过代理服务器,由代理服务器将请求转发到内网服务器并最终决定哪一台服务器处理客户端请求。

反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。
Nginx 支持配置反向代理,通过反向代理实现网站的负载均衡。
正向代理
提示 :想要理解正确理解和区分正向代理和反向代理,你要关注的是代理对象,正向代理“代理”的是客户端,反向代理“代理”的是目标服务器。
一位大佬说的一句话挺精辟的:代理其实就是一个中介,A 和 B 本来可以直连,中间插入一个 C,C 就是中介。刚开始的时候,代理多数是帮助内网 client 访问外网 server 用的(比如 HTTP 代理),从内到外 . 后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网 client 的请求 forward 到内网 server,从外到内
Nginx 主要被作为反向代理服务器使用,不过,其同样也是正向代理服务器的一个选择。
客户端通过正向代理服务器访问目标服务器。正向代理“代理”的是客户端,目标服务器不知道客户端是谁,也就是说客户端对目标服务器的这次访问是透明的。
为了实现正向代理,客户端需要设置正向代理服务器的 IP 地址以及代理程序的端口。
举个例子:我们无法直接访问外网,但是可以借助科学上网工具 VPN 来访问。VPN 会把访问外网服 务器(目标服务器)的客户端请求代理到一个可以直接访问外网的代理服务器上去。代理服务器会把外网服务器返回的内容再转发给客户端。

外网服务器并不知道客户端是通过 VPN 访问的
简单来说: 你可以将正向代理看作是一个位于客户端和目标服务器之间的代理服务器,其主要作用就是转达客户端请求从目标服务器上获取指定的内容。
相关阅读:
负载均衡
如果一台服务器处理用户请求处理不过来的话,一个简单的办法就是增加多台服务器(服务器集群)部署相同的服务来处理用户请求。
Nginx 可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上,这个就叫做 负载均衡。
可以看出,Nginx 在其中充当的就是反向代理服务器的作用,负载均衡正是 Nginx 作为反向代理服务器最常见的一个应用。
除此之外,Nginx 还带有健康检查(服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求, 来检查集群中是否有服务器处于异常状态。

Nginx 为什么适合做负载均衡?
Nginx 工作在网络的第七层(应用层),可以针对 HTTP 应用本身来做分流策略,支持 HTTP、HTTPS 协议的负载均衡。在工作中,我们通常会使用 Nginx 来做七层负载均衡。
Nginx 为什么适合做负载均衡呢?我简单总结了下面几方面主要原因:
- Nginx 属于软件负载均衡,相比于硬件负载均衡来说,价格非常低廉,一个较低配置的服务器即可满足。
- Nginx 使用简单,上手比较快。
- Nginx 基于 C 语言的实现,性能非常好。一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发连接的基础。并且,Nginx 单机支持 10 万以上的并发连接。
- Nginx 自带 健康检查(服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。
- Nginx 支持热部署,我们可以在不间断服务的情况下,升级 Nginx,这对于服务的高可用具有重大意义。
- Nginx 支持多种负载均衡策略比如轮询(Round Robin,默认)、IP 哈希、最小连接数。
Nginx 有哪些负载均衡策略?
相关参考:
Nginx 的负载均衡策略不止下面介绍的这四种,我这里只是列举几个比较常用的负载均衡策略。
轮询(Round Robin,默认)
轮询为负载均衡中较为基础也较为简单的算法。
如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理。
upstream backserver {
server 172.27.26.174:8099;
server 172.27.26.175:8099;
server 172.27.26.176:8099;
}
如果配置权重的话,权重越高的服务器被访问的概率就越大。
upstream backserver {
server 172.27.26.174:8099 weight=6;
server 172.27.26.175:8099 weight=2;
server 172.27.26.176:8099 weight=3;
}
未加权重的轮询算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权轮询算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。
IP 哈希
根据发出请求的和客户端 ip 的 hash 值来分配服务器,可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。
upstream backserver {
ip_hash;
server 172.27.26.174:8099;
server 172.27.26.175:8099;
server 172.27.26.176:8099;
}
和轮询一样,IP 哈希也可以配置权重,如果有两个活动连接数相同的服务器,权重大的被访问的概率就越大。
该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。
最小连接数
当有新的请求出现时,遍历服务器节点列表并选取其中活动连接数最小的一台服务器来响应当前请求。活动连接数可以理解为当前正在处理的请求数。
upstream backserver {
least_conn;
server 172.27.26.174:8099;
server 172.27.26.175:8099;
server 172.27.26.176:8099;
}
Nginx 常用命令有哪些?
- 启动
nginx。 - 停止
nginx -s stop或nginx -s quit。 - 重载配置
./sbin/nginx -s reload(平滑重启)或service nginx reload。 - 重载指定配置文件
.nginx -c /usr/local/nginx/conf/nginx.conf。 - 查看 nginx 版本
nginx -v。 - 检查配置文件是否正确
nginx -t。 - 显示帮助信息
nginx -h。