> 文章列表 > Nginx入门讲解

Nginx入门讲解

Nginx入门讲解

Nginx入门讲解

Nginx Web服务介绍

nginx是个高性能的http和反向代理服务器:

  • IMAP/POP3/SMTP服务器
  • nginx性能稳定、性能强大、非常节约系统资源
  • Nginx是高性能、轻量级的服务器;
  • 越来越多的企业使用nginx来代替Apache;

nginx使用越来越广泛:

  • 百度
  • 360
  • 阿里
  • 新浪
  • 腾讯等等都有在使用nginx

nginx对比apache的优点:

  • 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s;
  • 负载均衡及反向代理性能非常强;
  • 系统内存和CPU占用率低;
  • 可对后端服务进行健康检查;
  • 支持PHP cgi方式和FastCGI方式;
  • 可以作为缓存服务器、邮件代理服务器;
  • 配置代码简洁且容易上手。

Nginx的原理剖析

  • Nginx主要是使用各种模块进行工作;
  • 三类主要的模块
    • 核心模块:
      • HTTP模块;
      • EVENT模块
      • MAIL模块
        • 其实我这里是理解为location模块;指向URL的资源
    • 基础模块:
      • HTTP Access模块;
        • 这里我理解为状态模块的,当然应该是不止的
      • HTTP FastCGI模块;
        • php模块
      • HTTP Proxy模块;
        • 反向代理、或者代理模块
      • HTTP Rewrite模块;
        • 重写模块?
    • 第三方模块:
      • HTTP Upstream Request Hash模块;
      • Notice模块
      • HTTP Access Key模块;
      • Limit_req模块;
      • Upstream check module模块;

nginx的模块从功能上区分:

  • Handlers(处理器模块):
    • 此类模块直接处理请求–>用户浏览器请求什么资源–>传给服务器,
    • 并进行输出内容和修改headers信息等操作–>服务器反馈内容给到用户,
    • Handlers处理器模块一般只能有一个–>这个待理解;
  • Filters (过滤器模块):
    • 此类模块主要对其他处理器模块输出的内容进行修改操作
      • 可以通过location调整输出内容;
    • 最后由Nginx输出;
  • Proxies (代理类模块):
    • 此类模块是Nginx的HTTP Upstream之类的模块
    • 这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx的工作原理

nginx工作是通过内核和模块帮忙处理的;因此非常依赖配置文件;

  • 学习好nginx服务,就必须学习好配置文件
  • nginx的配置文件是分层次理解、全局、http、server、location等等

而配置文件里面规定很多个location;

  • 通过location的定义来处理用户的请求–>location可以处理不通的页面请求;
    • 比如说是静态页面;
    • 比如说是PHP页面;都可以通过location来定义;

因此,如果想要搞懂nginx的工作过程;必须弄明白nginx的配置文件结构

简单地理解:

  • 用户–>通过http请求–>nginx服务器响应–>选择响应的头–>然后调用模块处理–>最后返回给到用户

nginx的高并发讲解

nginx的高并发是业内出了名的;它主要就是采用了epoll模型;

  • epoll是Linux内核2.6以上才出现的;
  • epoll就是高并发的原因所在;

Nginx采用epoll模型,支持异步非阻塞;

  • epoll的特点:
    • epoll对于句柄事件的选择不是遍历的,是事件响应;
    • 就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高。

Apache则是使用了select模型

  • select特点:
    • select 选择句柄的时候,是遍历所有句柄;
    • 在句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。

nginx在默认是监听80端口的,在启动的时候会有一个master进程;

  • master进程生成多个工作进程;但是master进程只有一个;
  • worker进程都是从master进程fork出来
    • 在Master进程里面,建立好需要listen的socket(listenfd)之后,
    • 会fork出多个worker进程。
  • 所有worker进程的listenfd会在新连接到来时变得可读,
    • 为保证只有一个进程处理该连接,
    • 所有worker进程在注册listenfd读事件前抢accept_mutex,
    • 抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。
  • 一个worker进程在accept这个连接之后
    • 就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端;
    • 最后才断开连接,这样形成一个完整的请求流程;

nginx的配置文件架构:

通常源码包安装的nginx配置文件,和yum安装的配置文件有稍微的差异,但是大致上是一样的,只是server是通过include引用的独立配置文件;

...
events {...
}http {...server {....location / {root html;...}}
}

nginx的配置指令可以分为两大类:指令块单个指令

指令块就是像events,http,server等;

单独指令就是像root html;这样的。

nginx规定指令块可以嵌套,如http指令块可以嵌套server指令,server指令块中可以嵌套location指令,指令可以同时出现在不同的指令块,比如:root指令可以同时出现在http、server和location指令块中

这里需要注意:location中定义的指令块会覆盖server、http的同名指令

通俗说:

  • 小的指令块作用比大的指令块管用