关于Nginx
1.Nginx的配置
proxy_pass http:
当你需要将请求分发到多个后端服务器时,需要实现负载均衡功能,可以使用upstream
指令定义一组服务器,并在proxy_pass
中引用这个服务组名称。。如果不需要负载均衡,只需要将请求转发到单一的后端服务器,可以直接在proxy_pass
指令中指定服务器地址。
proxy_set_header:
proxy_set_header
是Nginx中的一个指令,用于在代理请求时设置或修改HTTP请求头。当你使用Nginx作为反向代理时,这个指令非常有用,因为它可以帮助你传递必要的信息给后端服务器。
设置Host头部:
proxy_set_header Host $host;
由于Nginx可能监听多个不同的域名或端口,因此需要告诉后端服务器原始请求的目标主机名,当客户端向Nginx发送请求时,Nginx会自动填充$host
变量的值
设置X-Real-IP
头部:
proxy_set_header X-Real-IP $remote_addr;
为了确保后端服务器能够知道客户端的真实IP地址,而不是Nginx服务器的IP地址。
设置X-Forwarded-For
头部:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这个头部用于记录客户端的IP地址及任何中间代理服务器的IP地址,这对于审计和跟踪请求非常有用
自定义其他头部:
通过 X-Custom-Header,你还可以设置自定义的头部信息;./'i
proxy_set_header X-Custom-Header "Some Value";i
2.Nginx作为服务端负载均衡器,常见的负载均衡算法
1. 轮询(Round Robin)
优点:
-
简单易实现。
-
适用于后端服务器性能相近的情况。
缺点:
-
无法考虑服务器的负载情况。
-
不适用于后端服务器性能差异较大的情况。
2..最少连接数(Least Connections)
最少连接数算法将请求分配给当前活动连接数最少的后端服务器。这有助于避免某些服务器过载,而其他服务器则处于空闲状态的情况。
3. IP哈希(IP Hash)
IP哈希算法根据客户端IP地址的哈希值将请求分配给后端服务器。这样,同一个客户端的请求总是被分配到同一台后端服务器,从而实现会话粘性(Session Persistence)。
优点:
-
适用于需要会话粘性的场景。比如购物车应用或需要登录的应用程序。
-
缓存一致性:如果后端服务器使用本地缓存来加速响应时间,那么使用 IP 哈希算法可以确保来自同一 IP 的请求始终命中相同的缓存实例,从而提高缓存的效率和命中率。
-
减少后端服务器间的负载转移:在一些情况下,如果某个后端服务器正在进行数据库操作或其他需要较长时间的任务,将请求继续路由到该服务器可以避免在任务完成之前将请求转移到另一台服务器,从而减少不必要的负载转移。
缺点:
-
负载分布不均衡,可能导致部分服务器负载过高。
4. URL哈希(URL Hash)
URL哈希算法根据请求URL的哈希值将请求分配给后端服务器。这样,相同URL的请求总是被分配到同一台后端服务器。
优点:
-
适用于缓存场景,提高缓存命中率。
-
简单实现URL粘性。
-
静态内容优化:
对于静态内容如图片、CSS 和 JavaScript 文件,URL 哈希算法可以确保这些文件的请求始终被路由到相同的服务器,从而可以利用这些服务器上的缓存来提高加载速度。
缺点:
-
负载分布不均衡,可能导致部分服务器负载过高。
5. 加权轮询(Weighted Round Robin)
加权轮询算法在轮询的基础上,为每台后端服务器分配一个权重。数字越大,权重越高,分配到的请求越多。适用于后端服务器性能差异较大的情况。
优点:
-
考虑了服务器性能差异。
-
灵活分配请求。
缺点:
-
需要手动配置权重。
3.Nginx 的优势?
(1) 可以高并发连接(5 万并发,实际也能支持 2~4 万并发)。
(2) 内存消耗少。
(3) 成本低廉。
(4) 配置文件非常简单。
(5) 支持 Rewrite 重写。
(6) 内置的健康检查功能。
(7) 节省带宽。
(8) 稳定性高
(9) 支持热部署。
4.Nginx 是如何处理一个请求的
首先,nginx 在启动时,会解析配置文件,得到需要监听的端口80与 ip 地址,然后在nginx 的 master 进程里面先初始化好这个监控的 socket,再进行 listen,然后再 fork 出多个子进程出来, 子进程会竞争 accept 新的连接。
此时,客户端就可以向 nginx 发起连接了。当客户端与 nginx 进行三次握手,与nginx
建立好一个连接后,此时,某一个子进程会 accept 成功,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体,接着,根据事件调用相应的事件处理模块,如 http 模块与客户端进行数据的交换。
最后,nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
5.为什么 Nginx 性能这么高?
得益于它的事件处理机制:异步非阻塞事件处理机制:运用了 epoll 模型,提供了一个队列,排队解决。