Nginx入门讲解
Nginx Web服务介绍
nginx是个高性能的http和反向代理服务器:
- IMAP/POP3/SMTP服务器
- nginx性能稳定、性能强大、非常节约系统资源
- Nginx是高性能、轻量级的服务器;
- 越来越多的企业使用nginx来代替Apache;
nginx使用越来越广泛:
nginx对比apache的优点:
- 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s;
- 负载均衡及反向代理性能非常强;
- 系统内存和CPU占用率低;
- 可对后端服务进行健康检查;
- 支持PHP cgi方式和FastCGI方式;
- 可以作为缓存服务器、邮件代理服务器;
- 配置代码简洁且容易上手。
Nginx的原理剖析
- Nginx主要是使用各种模块进行工作;
- 三类主要的模块
- 核心模块:
- HTTP模块;
- EVENT模块
- MAIL模块
- 其实我这里是理解为location模块;指向URL的资源
- 基础模块:
- HTTP Access模块;
- 这里我理解为状态模块的,当然应该是不止的
- HTTP FastCGI模块;
- 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的同名指令
通俗说: