关注我的个人博客:www.yaoxinlei.com

姚鑫磊的博客园

翻过一座山,山后一片海。

Nginx-Web服务基础介绍-1

高性能WEB服务NGINX

内容概述

  • Web服务基础

  • I/O模型

  • nginx介绍

  • nginx安装

  • nginx各种模块实现web服务

  • nginx实现http负载均衡

  • nginx实现tcp反向代理

  • nginx实现fastcgi反向代理

  • nginx二次开发版

  • nginx高并发linux内核优化

nginx的三大功能:

  • 实现web服务

  • 实现http负载均衡

  • 调用nginx的API 基于二次开发

1 Web服务基础介绍

正常情况下的单次web服务访问流程:

image

1.1 互联网发展历程回顾

1.2 Web 服务介绍

Netcraft公司于1994年底在英国成立,多年来一直致力于互联网市场以及在线安全方面的咨询服务,其中在国际上最具影响力的当属其针对网站服务器,域名解析/主机提供商,以及ssl市场所做的客观严谨的分析研究。

1.2.1:Apache经典的web服务端

Apache起初由美国的伊犁诺伊大学香槟分校的国家超级计算机应用中心开发,目前经历了两大版本分别是1.X与2.X,其可以通过编译安装实现特定的功能

MPM(多路处理模块)三种工作模式:

  • Apche prefork模式
  • Apache worker模式
  • Apche event模式

Apache 早期装好默认为prefork模式,(与centos7、8)版本有关系,centos8默认为event模式

1.2.1.1:Apache prefork模型

预派生模式,有一个主拉制进程,然后生成多个子进程,使用select校型,最大并发1024,每个子进程有一个独立的线程响应用户清求,相对比较占用内存,但是
比较稳定,可以设登限大和最小进程数,是最古老的一种横式, 也是最稳定的校式,适用于访问量不是很大的场景。
优点:稳定
缺点:每个用户请求泥要对应开启一个进程,占用资源较务,并发性差,不适用于高并发场景

image

1.2.1.2:Apache worker模型

一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程来处理请求,当线程不够使用的时候会在启动一个新的子进程,然后再进程里面启动线程处理请求,由于其实用了线程处理请求,因此可以承受更高的并发。

优点:相比prefork占用的内存较少,可以同时处理更多的请求

缺点:使用keepalive的长连接方式,某个线程会一直被占据,即时没有传输数据,也需要一直等待到超时才会被释放,如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

image

1.2.1.3:Apache event模型

Aapche中最新的模式,2012年发布的apache2.4X系列正式支持event模型,属于事件驱逐模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式,它和worker模型很像,最大的区别在于他解决了keepalive场景下,长期被占用的线程的资源浪费问题(某些线程因为呗keepalive空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放,这样增强了高并发场景下的请求处理能力。

有点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实的请求过来时,将请求传递给服务线程,执行完毕后,又允许它释放

缺点:没有线程安全控制

image

1.2.2:Nginx-高兴能的web 服务端

1.2.3:用户访问体验和性能

1.2.3.1 用户访问体验统计

互联网存在用户速度体验的1-3-10原则,即1秒最优,1-3秒较优,3-10秒比较慢,10秒以上用户无法接受,用户放弃一个产品的代价很低,只是换一个URL而已。

image

1.2.3.2 影响用户体验的因素

影响用户体验的因素

  • 客户端
    • 客户端硬件配置
    • 客户端网络速率
    • 客户端与服务端距离
  • 服务端
    • 服务端网络速率
    • 服务端硬件配置
    • 服务端架构设计
    • 服务端应用程序工作模式
    • 服务端并发数领
    • 服务端响应文件大小及数量(buffer cache)
    • 服务端I/O压力

1.2.4 服务端I/O流程

I/O在计算机中指input/output,IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一,IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求

一次完成的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要精力一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单来说,I/O就是把数据从内核空间的内存数据复制到用户空间中的内存当中。

Linux的I/O

  • 磁盘I/O
  • 网络I/O:一切皆为文件,本质为对socker(socket = ip+tcp/udp+por)文件的读写
1.2.4.1 磁盘I/O
1.2.4.2 网络I/O

网络通信就是网络协议栈道用户空间进程的I/O,就是网络I/O

image

网络I/O处理过程

  • 获取请求数据,客户端与服务器建立连接发出请求,服务器接收请求(1-3)
  • 构建响应,当服务期接收请求,并在用户空间处理客户端请求,知道构建响应完成(4)
  • 返回数据,服务器将已构建号的响应在通过内核空间的网络I/O 发还给客户端(5-7)

不论磁盘和网络I/O

  • 每次I/O都要经过两个阶段
    • 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
    • 第二步:将数据从内核缓冲区复制到用户空间的进程内存中,时间较短
posted @ 2022-02-26 21:55  姚鑫磊  阅读(78)  评论(0编辑  收藏  举报
区顶部