Nginx 面试题总结大全
转载请注明出处:
1 介绍下nginx特点与常用模块
2 nginx特点详细
3 反向代理和正向代理
4 负载均衡策略有哪些
5 Nginx如何实现动静分离?
6 Nginx 常用命令有哪些?
7 Nginx 进程模型
8 nginx是四层协议还是七层的
9 nginx如何自定义负载均衡
10 如何自定义根据cpu的运行情况进行负载均衡配置
1 介绍下nginx特点与常用模块
Nginx是一款高性能的开源Web服务软件,采用事件驱动的异步非阻塞处理机制,能够快速处理大量的并发连接。其主要原理是基于事件驱动和异步非阻塞I/O处理机制。
Nginx常用模块:
-
-
Stream模块:实现TCP和UDP协议的代理和转发,支持四层负载均衡。
-
Mail模块:实现邮件代理和反向代理。
-
Event模块:实现事件驱动的异步非阻塞I/O机制。
-
Upstream模块:实现反向代理、负载均衡和故障转移等。
-
Rewrite模块:实现URL重写和HTTP头部修改等功能。
-
Cache模块:实现HTTP响应缓存功能。
-
SSL模块:实现HTTPS协议的支持和管理SSL证书。
-
高并发 : 单机支持 10 万以上的并发连接
-
跨平台 :可以运行在 Linux,Windows,FreeBSD,Solaris,AIX,Mac OS 等操作系统上。
-
扩展性好 :第三方插件非常多!
-
安装使用简单 :对于简单的应用场景,我们很快就能够上手使用。
-
稳定性好 :bug 少,不会遇到各种奇葩的问题。
-
免费 :开源软件,免费使用。
3 反向代理和正向代理
反向代理:客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。
正向代理:看作是一个位于客户端和目标服务器之间的代理服务器,其主要作用就是转达客户端请求从目标服务器上获取指定的内容。
https://www.cnblogs.com/taostaryu/p/10547132.html
??Nginx 可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上,这个就叫做 负载均衡。
??除此之外,Nginx 还带有健康检查(服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。
常用的负载均衡策略:轮询,加权随机,IP哈希,最小连接数
-
轮询(round-robin):按顺序将请求分配给不同的服务器,保证每个服务器都平均分担负载。
-
IP hash:将相同的IP请求分配给同一台服务器,这样可以确保用户的请求始终发送给相同的服务器。
-
带权重的轮询(weighted round-robin):根据服务器的配置权重,将请求分配给服务器。配置权重越高的服务器,处理请求的次数就越多。
-
最小连接数(least connections):将请求分配给当前连接数最少的服务器,以确保客户端获得更快的响应。
-
URL hash:根据请求的URL的哈希值,将请求发送给特定的服务器,以实现特定的会话复制或者将特定请求路由到特定的服务器上。
-
会话保持(sticky session):将来自同一客户端的请求路由到同一服务器上,这样可以确保客户端获得一致的体验。
需要注意的是,在选择负载均衡策略时,需要考虑到客户端请求的性质以及服务器的实际情况,以选择最适合的负载均衡策略。
Nginx可以通过配置文件中的location指令来实现动静分离,具体实现方式为将静态资源(如图片、CSS、JS等)和动态资源(如PHP、ASP等)分别存放在不同的目录下,然后通过Nginx的location指令将请求分发到不同的服务器中处理。
动静分离是指将静态资源和动态资源分开处理,提高Web应用程序的性能。
http { # 配置静态资源路径 server { listen 80; server_name www.example.com; root /var/www/static; location / { # 静态资源缓存 expires 5m; } # 配置日志 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } # 配置动态资源路径 server { listen 80; server_name api.example.com; root /var/www/dynamic; location / { # 反向代理到后端服务器 proxy_pass http://localhost:8080; } # 配置日志 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } }
/var/www/static
目录下,动态资源存放在/var/www/dynamic
目录下。静态资源的访问路径是www.example.com
,动态资源的访问路径是api.example.com
。在静态资源的配置中,使用expires
指令设置了静态资源缓存时间为5分钟,在动态资源的配置中,使用proxy_pass
6 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 。
7 Nginx 进程模型
Nginx 启动后,会产生一个 master 主进程,主进程执行一系列的工作后会产生一个或者多个工作进程 worker 进程。master 进程用来管理 worker 进程, worker 进程负责处理网络请求。也就是说 Nginx 采用的是经典的 master-worker 模型的多进程模型 。
8 nginx是四层协议还是七层的
在网络协议中,四层协议主要指传输层协议,如TCP、UDP等,而七层协议主要指应用层协议,如HTTP、HTTPS、SMTP、FTP等。因此,我们可以通过协议的特征来判断是四层还是七层协议。
对于四层协议,其主要特征是对IP地址和端口号进行转发和负载均衡。例如,当我们使用Nginx作为TCP负载均衡服务器时,Nginx会根据客户端请求的IP地址和端口号,将请求转发到后端的服务器上。
而对于七层协议,其主要特征是可以对应用层协议进行转发和负载均衡。例如,当我们使用Nginx作为HTTP反向代理服务器时,Nginx会根据客户端请求的HTTP头部信息,将请求转发到后端的Web服务器上。在这种情况下,Nginx不仅仅负责传输层的负载均衡,还可以对HTTP协议进行解析和转发。
因此,我们可以通过观察负载均衡服务器的配置和行为来判断其是四层协议还是七层协议。如果只对IP地址和端口号进行负载均衡,则是四层协议;如果可以对应用层协议进行解析和转发,则是七层协议。
在Nginx中,可以通过配置文件自定义负载均衡策略。具体步骤如下:
-
首先,在Nginx配置文件中定义一个upstream模块,并设置负载均衡策略和后端服务器列表,例如:
upstream myapp { server backend1.example.com weight=3; server backend2.example.com; server backend3.example.com; hash $remote_addr consistent; }
其中,myapp是一个自定义的upstream名称,backend1.example.com、backend2.example.com、backend3.example.com是后端服务器的地址或域名。weight=3表示给backend1.example.com设置权重为3,而backend2.example.com和backend3.example.com的权重默认为1。hash $remote_addr consistent表示采用基于客户端IP地址的一致性哈希算法进行负载均衡。
2. 然后,在server模块中配置具体的代理规则,将请求代理到upstream中定义的服务器列表中,例如:
server { listen 80; server_name example.com; location / { proxy_pass http://myapp; } }
其中,proxy_pass http://myapp表示将请求代理到myapp定义的服务器列表中进行负载均衡。
sudo nginx -s reload
Nginx支持多种负载均衡策略,例如轮询(默认)、IP哈希、URL哈希、加权轮询等。可以根据实际情况选择不同的负载均衡策略,并根据需要调整后端服务器列表的权重等参数,以实现自定义的负载均衡策略。
可以使用Nginx的ngx_http_upstream_module模块和Lua脚本语言实现根据CPU的运行情况进行负载均衡配置。具体步骤如下:
-
安装ngx_http_lua_module模块,该模块提供了在Nginx中运行Lua脚本的能力。
-
在Nginx配置文件中定义upstream模块,并设置负载均衡策略和后端服务器列表,例如:
upstream myapp {
server backend1.example.com;
server backend2.example.com;
}
3. 在server模块中定义Lua脚本,并在其中编写根据CPU运行情况进行负载均衡的代码,例如:
server { listen 80; server_name example.com; location / { access_by_lua_block { local status = require "ngx.status" local cpu = status.get_cpu() local servers = ngx.shared.servers local peer = servers:get(cpu) if not peer then local peers = {"backend1.example.com", "backend2.example.com"} local index = cpu % #peers + 1 peer = peers[index] servers:set(cpu, peer, 60 * 5) -- 缓存5分钟 end ngx.var.backend = peer } proxy_pass http://$backend; } }
4.在Nginx配置文件中添加shared_dict指令,用于共享服务器列表和CPU状态信息:
http {
lua_shared_dict servers 1m;
lua_shared_dict status 1m;
...
}
5.最后,重新加载Nginx配置文件,使其生效:
sudo nginx -s reload
该方法仅仅是一个参考,真实场景下,CPU的负载情况并不是唯一的考虑因素,还需要考虑网络延迟、后端服务器的性能、负载均衡的稳定性等因素。