LNMP

linux + nginx + mysql + php/python
image.png
image.png

lnmp工作流

  1. 用户通过浏览器输入域名访问到nginx web服务器
  2. nginx进行用户判断(location url匹配的功能),静态请求则nginx直接响应给用户,如果是动态请求比如.php结尾,那么nginx就会通过fastcgi接口把请求转发给php后台程序的引擎(php-fpm进程),php进行动态请求解析(获取数据库中的内容,要登录,注册),php解析发现请求还要读取数据库,就会通过php连接数据库,然后读取完毕之后返回给nginx,最终nginx把数据响应给用户客户端

    Nginx介绍

    俄罗斯人开发出的一款高性能HTTP web服务器,支持反向代理,负载均衡,资源压缩,url重写,网站跳转等等功能。
    nginx以高效的linux网络模型,epoll,event,作为网络IO模型,kqueue,在高并发网站情况下,nginx能够轻松支持5W+的并发流量,并且消耗的服务器内存,cpu等资源,也是很低的,运行起来非常稳定

    Nginx资源消耗低/性能强

    image.png

    Nginx特点

    成本低

    image.png

    优势image.png

    Nginx网络模型

    网络IO模型概念

    内核空间,用户空间

    内核空间:一个操作系统的核心组件,称之为内核,独立于普通的应用程序,可以直接操作底层硬件,处理系统受保护的区域
    操作系统为了保护系统的核心区域,也就是内核,使得用户无法直接修改系统底层,因此操作系统就开辟了两块虚拟内存空间,一是内核空间,二是用户空间

    进程切换

    为了控制进程的执行,操作系统的内核需要有能力挂起CPU上运行的程序(暂停一个CPU正在处理的进程),还能恢复之前已经挂起的进程,这种行为称之为进程切换

    进程阻塞

    正在执行中的进程,由于某些事件的等待,比如资源加载中,资源加载失败,操作系统自动的就会阻塞该进程,调用内核的block语句让该进程处于阻塞状态,因此阻塞的进程是一种主动的行为

    文件描述符

    这是计算机科学里的一个术语,表示指向文件引用的一个抽象的概念,文件描述符是一个索引值,指向linux内核,为每一个进程打开的文件做记录的一个表
    程序每打开一个文件,系统内核就向该进程发送一个文件描述符

    Linux IO模型

    input 输入
    output 输出
    对于linux的文件读写操作
    数据的IO操作,比如文件的读取,数据优先会拷贝到操作系统的内核缓冲区,然后再从缓冲区拷贝到应用程序的内存空间

  3. 等待数据准备

  4. 数据从内核空间拷贝到用户进程空间

    网络IO

  5. 等待网络上的数据分段到达,然后复制到内核的缓冲区

  6. 数据从内核缓冲区拷贝到用户空间的应用程序

网络应用主要面临两个问题,数据计算,网络IO延迟
网络的延迟,是造成性能低下的最大原因

为何选择nginx

nginx就是在于有优秀的网络IO处理模型
常见的IO模型有

  • 阻塞模型
  • 非阻塞模型
  • IO多路复用
  • 异步IO

网络IO指的就是在网络中进行数据的读写操作,本质上就是一个socket套接字读取,socket套接字在linux系统中被抽象为流的概念,网络IO就是对数据流的处理

阻塞模型之同步阻塞IO block IO

同步阻塞IO的特点是,IO执行的两个阶段都是堵塞的。
用户发起调用,内核准备数据时,阻塞;内核拷贝数据到用户空间,阻塞。
直到最终内核返回结果,数据拷贝完毕,用户进程接触block阻塞状态,重新的运行。
在linux默认的情况下,所有的socket套接字操作都是阻塞的,阻塞指的就是进程在等待中,cpu此时去做别的事了,同步阻塞模型,主要优缺点如下:

  • 阻塞IO能够及时返回数据,无延迟
  • 对于开发人员负担较低,开发负担较低
  • 但是对于用户是很不友好的,性能较弱

    同步非阻塞

    同步非阻塞就是每隔一会检索一次,进行轮训调用的方式。
    同步阻塞和非同步阻塞的区别:

  • 非阻塞的优点:在等待的时间内,可以继续处理其他的任务,当然也包括继续提交新任务

  • 非阻塞的缺点:任务完成的延迟较大,因为需要多次的发起系统轮训调用操作,并且很有可能在任务轮训过程中,数据已经准备完毕了,造成延迟,对整体的系统吞吐性能有了降低

    IO多路复用

    计算机系统后台可能存在N多个进程任务,如果能自动的循环查询多个任务的进度,而不需要用户进程主动发起轮训调用,而是有人来帮忙盯着这些进程,那就很方便了
    因此linux系统下select,poll,epoll就是来帮你们做盯着进程进度的一个软件,并且epoll效率是最高的,并且nginx就是使用的epoll网络io模型

    select事件

    select就是做自动轮训的事情,它和非阻塞轮训的区别
    IO多路复用和阻塞IO形式区别不大,并且有可能性能还更差一点,是因为IO多路复用还额外的调用了select事件,有了额外的系统开销
    如果你的服务器链接数不是很高的话,使用IO多路复用还不如(多线路+同步阻塞IO)来的效率更好,IO多路复用优势在于可以同时处理更多的连接,而不是处理速度的优势

    异步非阻塞IO模型

    前几个网络IO模型的总结
  1. 阻塞和非阻塞的区别

阻塞IO会一直阻塞对应的进程,直到数据操作完毕
非阻塞IO是在内核空间准备数据的阶段会立即返回

  1. 同步IO和异步IO的区别

同步IO在进行IO操作的时候,进程会被阻塞
异步IO是在进程发起IO操作之后,内核直接返回,直到内核发送一个信号,告诉进程IO操作完成了,整个进程完全是没有阻塞的