首页 技术 正文
技术 2022年11月15日
0 收藏 804 点赞 2,794 浏览 3447 个字

nginx是什么?

  nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡。具有高性能、轻量级、内存消耗少,强大的负载均衡能力等优势。

 nginx架构?

反向代理,负载均衡——nginx理论  反向代理,负载均衡——nginx理论

  如上官方示意图所示,nginx启动以后,会在系统中以daemon的方式在后台运行,其中包括一个master进程,n(n>=1)个worker进程。

  其中,master进程用于接收来自外界的信号,并给worker进程发送信号,同时监控worker进程的工作状态。

worker进程则是外部请求真正的处理者,每个worker请求相互独立且平等的竞争来自客户端的请求。请求只能在一个worker进程中被处理,且一个worker进程只有一个主线程,所以同时只能处理一个请求。那么问题来了,一个worker进程只有一个主线程,只能同时处理一个请求,nginx对高并发请求强大的处理能力是如何保证的呢?答案是nginx采用异步非阻塞的方式来处理请求,即单线程、非阻塞、异步IO的工作模型。对比apache的异步非阻塞版本的工作模式,apache会为每一个请求新建一个线程去处理请求,线程进行上下文切换,会造成内存和CPU的浪费。反看nginx的异步非阻塞io模式,实用操作系统提供的io多路复用技术(epoll),在一个线程中处理所有请求,当一个io操作开始的时候,nginx不会等待其完成就回去处理下一个请求,等到io操作完成后,nginx再回来处理这一次请求io操作的后续工作。相比apache,nginx省去了线程上下文切换带来的资源开销。

那么nginx如何确定哪个worker来处理请求呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。这样,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

 nginx性能?

这里援引网上搜索到的nginx的测试数据:10000个非活跃的HTTP keep-alive 连接仅占用约2.5MB内存。三万并发连接下,10个Nginx进程,消耗内存150M。淘宝tengine团队说测试结果是“24G内存机器上,处理并发请求可达200万”。

 nginx负载均衡?

通信协议支持:nginx负载均衡主要是对七层网络通信模型中的第七层应用层上的http、https进行支持。同时nginx更新版本也在逐步对Websocket、SPDY等协议作出支持。

nginx是以反向代理的方式进行负载均衡的。反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。(为了理解反向代理,这里插播一条什么是正向代理:正向代理指的是,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。)

这里再插播一条实现负载均衡的技术的方式有哪些:硬件层面有F5负载均衡器,网络层层面有LVS(Linux Virtual Server),应用层层面就是nginx、Haproxy等。

nginx实现负载均衡的分配策略有很多,被编进nginx内核的策略有轮询和ip_hash,第三方的有fair、url_hash等。这里主要对内核策略进行介绍。

Nginx负载均衡算法

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

2、weight(轮询权值)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

3、ip_hash

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

4、fair

比weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

5、url_hash

按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

Nginx负载均衡调度状态

在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有:

1、down,表示当前的server暂时不参与负载均衡

2、backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低

3、max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。

4、fail_timeout,请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。

Nginx负载均衡配置

在Nginx配置文件的HTTP层添加upstream模块

  1. http {
  2. upstream webserver {
  3. server 192.168.1.209:80 weight=2 max_fails=3 fail_timeout=10s;
  4. server 192.168.1.250:80 weight=1 max_fails=3 fail_timeout=10s;
  5. }
  6. server {
  7. listen 80;
  8. server_name www.xxx.org 192.168.1.21;
  9. index index.html index.htm index.php index.jsp;
  10. location / {
  11. proxy_pass http://webserver;
  12. proxy_set_header Host $host;
  13. proxy_set_header X-Real-IP $remote_addr;
  14. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  15. proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
  16. }
  17. }
  18. [root@scx ~]# curl www.xxx.org
  19. web2
  20. [root@scx ~]# curl www.xxx.org
  21. web2
  22. [root@scx ~]# curl www.xxx.org
  23. web1
  24. [root@scx ~]# curl www.xxx.org
  25. web2
  26. 上面的例子中的两台RealServer分别为:
  27. 192.168.1.209
  28.  
  29. 192.168.1.250
  30. 两台RealServer都安装Nginx作为后端web服务器

Nignx负载均衡功能是通过upstream模块实现的,是基于内容和应用的7层交换负载均衡。Nginx负载均衡默认对后端服务器有健康检测能力,但是检测能力较弱,仅限于端口检测,在后端服务器比较少的情况下(10台及以下)负载均衡能力表现突出。与LVS负载均衡相比,LVS是基于四层的IP负载均衡技术,具有高性能、高可用、吞吐量大等优点,LVS在集群中表现更佳。

  转载:https://blog.csdn.net/mine_song/article/details/67631449

上一篇: Linux ospf+lvs
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,557
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898