Nginx学习

高性能 HTTP和反向代理web服务器(支持高达 50,000 个并发连接数)

介绍

(1)跨平台的web服务器
(2)百万级别tcp并发连接:支持linux的epoll、solaris的event ports、freeBSD的kqueue
(3)linux的nginx支持独有的sendfile系统调用:把硬盘的数据直接发送到网络(不需要将硬盘的数据拷贝到用户态内存上再发送),极大减少内核态和用户态的数据复制
(4)C语言开发, 俄罗斯Igor Sysoev,开源
(5)竞品:apache(稳定开源跨平台,但是兴起时代还不是海量并发时代,设计模式为重量级、不支持高并发;如果万级别请求同时发送,导致服务器消耗大量内存,千级别的进程间切换消耗大量CPU);Lighttpd(轻量级高性能,欧美人青睐)

特点

(1)更快:正常情况下单次请求得到更快响应;万级别并发时,比其他web服务器更快响应。
(2)高扩展:不同层次、不同功能、不同类型、耦合度极低的模块化开发(修复一个模块的bug/升级一个模块时,只专注一个模块),导致庞大的第三方模块(开发一个http请求时,可以复用大量已有模块)
(3)高可靠:master进程在一个worker进程出错时,快速拉起新的worker子进程;每个worker进程相对独立;官方的模块非常稳定
(4)低内存消耗:1万个非活跃keep-alive连接仅消耗2.5MB内存
(5)单机支持10万以上的并发连接:它的并发连接上限取决于内存
(6)热部署:master管理进程和worker进程分离设计,热部署可执行文件、不停服更新配置/更换日志
(7)最自由的BSD许可协议,支持用户修改源码、免费使用

高并发服务时保持高效服务

(1)不会出现并发访问量到达一个限定值后,新用户无法获取服务
(2)不会出现成功建立tcp连接后,大部分请求得不到响应
(3)低并发下,用户请求得到高速体验;高并发下,更多用户能接入,但是速度可能会下降,但这只因受限于带宽和处理器速度,不应受限于服务器的软件设计瓶颈

功能

(1)静态页面 web 服务器,支持 CGI 协议的动态语言如 perl/php 等,不支持 java
(2)反向代理:C端对代理无感知,C端不需要任何配置就可以访问,只需要将请求发送到反向代理S端,由反向代理S端通过负载均衡,选择目标S端获取数据后,再返回给C端,此时反向代理S端和目标S端对外就是一个服务器,暴露代理S端地址,隐藏真实S端 IP 地址。
(3)正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的C端要访问 Internet,则需要通过代理S端来访问,这种代理服务就称为正向代理。通过代理服务器来访问服务器的过程叫正向代理,需要在C端配置代理服务器进行指定网站访问
(4)动静分离:为了加快网站解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器压力。

负载均衡

轮询 (round-robin)

每个请求按时间顺序逐一分配到不同服务器,适用于服务器性能相近的情况,其中每个服务器承载相同负载。对于服务器性能不同的集群,容易引发资源分配不合理等问题。

加权轮询

解决轮询的问题,每个服务器会有各自的 weight。weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。
ngx_http_upstream_round_robin.c
遍历各服务器节点,并计算节点权值,计算规则为 current_weight 与其对应的 effective_weight 之和,每轮遍历中选出权值最大的节点作为最优服务器节点。其中 effective_weight 会在算法的执行过程中随资源情况和响应情况而改变。

IP 哈希(IP hash)

依据发出请求的C端 IP hash 值来分配服务器,相同 hash 值的 IP 映射到同一服务器。
一定程度上解决了集群部署环境下 Session 不共享问题。
ip_hash实现灰度:一部分 IP 请求转发到新版本服务器,一部分转发到旧版本服务器
如遇到文件过大导致上传超时,可利用 ip_hash 进行文件分片上传,保证同C端发出的文件切片转发到同一服务器,利于其接收切片及后续文件合并操作。

url hash

根据请求的 url 的 hash 值分配服务器。相同 url 请求会分配给固定服务器,当存在缓存时,效率较高。Nginx 默认不支持,需要依赖第三方库。

最小连接数(Least Connections)

遍历服务器列表选取其中连接数最小的一台服务器来响应当前请求。
连接数可以理解为当前处理的请求数。

问题

nginx作为反向代理时,为什么会降低上游服务器压力?

C端和S端的公网环境较差,网速较慢。如果C端直接和上游S端集群连接:假如1万个用户同时上传一个1G的文件,就需要S端始终维持1万个连接,然后并不断将TCP数据接收完后再处理再响应,对S端的并发处理挑战很大。如果是C端和代理S端,代理S端提前和上游S端建立通信机制,则代理S端等到1G数据到来,然后通过内网专线快速发送到上游S端处理,则上游S端的处理性能会大大提高。

附录

Session 不共享问题

假设用户已经登录过,A服务器存有该用户的session,此时发出的请求被分配到A 服务器。但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

参考文档

https://devpress.csdn.net/suzhou/64814ec3cbbd6810f1b4eeaf.html?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EOPENSEARCH%7Eactivity-1-102463099-blog-131271374.235%5Ev38%5Epc_relevant_default_base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EOPENSEARCH%7Eactivity-1-102463099-blog-131271374.235%5Ev38%5Epc_relevant_default_base&utm_relevant_index=1#3__15

你可能感兴趣的:(nginx,学习,网络)