[Day4] Nginx Http模块一
之前介绍了Nginx作为静态资源服务器的用法,除此之外,Nginx更多的场景是作为反向代理服务器,提高网站的并发和可用性。下面几节着重说一下作为反向代理的http模块,并且了解一些Nginx的架构。
一. 前言
1. 指令冲突时以谁为准
Nginx的大多指令都支持多层级配置,比如配置在server层或者location层都可以生效。当指令冲突时,Nginx会遵从如下几个原则。
a)Nginx的指令分为两种:值指令和动作指令,值指令是指存储配置项的值 比如root、access_log,动作指令是指定Nginx的行为 比如rewrite proxy_pass。遇到动作指令时Nginx会直接执行相关的功能(比如重定向),并根据该功能的返回值决定是否继续往下执行。所以动作类指令是遇到一个执行一个,不会合并。而值指令是Nginx执行流程过程中去读取相关配置的值,而读取到的值只能是一个。所以值指令是运行时获取的配置,会将相同的值指令进行合并。
b)值指令合并规则:向上覆盖。子配置不存在时,使用父配置块。子配置存在时,覆盖父配置块。
二. Listen指令
listen指令放在server配置块下,监听端口或者地址,使Nginx和客户端可以建立一个tcp连接。
例: listen unix:/var/run/nginx.sock;
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000 bind;
listen [::]8000 ipv6only=on;
listen [::1]
三. 接收请求事件模块
建立了listen监听端口以后,客户端就可以与Nginx进行通讯了,Nginx做的第一步就是接收请求。
客户端的请求发送到服务器后,会与操作系统的内核(端口)建立三次握手连接。当Nginx监听到端口成功建立起一个连接后,会从内核态将连接拷贝到Nginx用户态,然后由Nginx会根据它的负载均衡算法选择一个worker进程为这个连接添加一个epoll_wait读事件,然后调用accept方法为连接分配连接内存池、添加接收data数据超时定时器等。当客户端发送data以后,还是会经由内核态拷贝到Nginx用户态,Nginx添加另一个epoll_wait读事件来分配内存、解析请求头、关闭超时定时器等。如下图所示:

四. 接收请求HTTP模块
Nginx建立好连接并接收完header后,就会正式进入到Http模块了。Http模块有十一个处理流程,如下图所示:

五. server_name指令
server_name指令绑定域名,指令后可以跟多个域名,第一个是主域名,可以出现在http、server、location模块下
泛域名:仅支持在最前或最后,如:server_name *.taobao.com;
正则表达式:加~前缀 server_name www.taobao.com ~^www\.taobao\.\d+\.com$;
正则表达式创建变量,用()括起正则表达式,使用$1 $2获取变量
server_name_in_redirect on|off 命令:如果为off时,那么将会以当前服务器的IP地址进行拼接URL;如果该命令为on,那么首先查找server_name,如果没有找到,查找请求头的HOST字段,如果没有,则以当前服务器的IP进行拼接。
server匹配顺序
精确匹配
*在前的泛域名
*在后的泛域名
按文件中的顺序匹配正则表达式域名
default server:第1个 或者是listen指定的default
·
六. HTTP请求处理的11个阶段
POST_READ:获取到Header后的第一个阶段。模块:realip
SERVER_REWRITE:配置在server模块中的rewrite阶段。模块:rewrite
FIND_CONFIG:根据配置查找由谁处理请求的阶段。
REWRITE:配置在location模块中的rewrite阶段。模块:rewrite
POST_REWRITE
PREACCESS:向上游服务请求连接前的阶段。模块:limit_conn、limit_req
ACCESS:与上游服务器连接的验证阶段。模块:auth_basic、access、auth_request
POST_ACCESS
PRECONTENT:发送data数据前的阶段。模块:try_files
CONTENT:发送数据极端。模块:index、autoindex、concat
LOG:记录请求日志、错误日志阶段。模块:access_log
七. 11个请求阶段的处理顺序
[Day4] Nginx Http模块一的更多相关文章
- [Day4] Nginx Http模块二
一. POST_READ阶段 1. 用户ip在http请求中的传递? 前提:Tcp连接四元组(src ip,src port,dst ip,dst port) HTTP头部 X-Formard ...
- 基于Nginx dyups模块的站点动态上下线并实现简单服务治理
简介 今天主要讨论一下,对于分布式服务,站点如何平滑的上下线问题. 分布式服务 在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一 ...
- Nginx 切片模块、断点续传
熟悉 CDN 行业主流技术的朋友应该都比较清楚,虽然 Nginx 近几年发展的如日中天,但是基本上没有直接使用它自带的 proxy_cache 模块来做缓存的,原因有很多,例如下面几个: 不支持多盘 ...
- nginx事件模块分析(一)
nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...
- mac下Nginx+lua模块编译安装
Nginx的nb之处就不说了,lua也是一个小巧的脚本语言,由标准C编写而成,几乎可以运行在所有的平台上,也非常强大,其他特性请自行度娘.nginx_lua_module是由淘宝的工程师清无(王晓哲) ...
- nginx添加模块 (非覆盖安装)
nginx添加模块(非覆盖安装) 原已经安装好的nginx,现在需要添加一个未被编译安装的模块: 查看原来编译时都带了哪些参数# /usr/local/nginx/sbin/nginx -V ngin ...
- 一些好用的nginx第三方模块
一些好用的nginx第三方模块 转自;http://macken.iteye.com/blog/1963301 1.Development Kit https://github.com/simpl/ ...
- nginx自定义模块编写-实时统计模块--转载
原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99- ...
- nginx -- handler模块(100%)
handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...
随机推荐
- 同步+TASK异步请求
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 使用JDK自带功能,实现一个简单的Web Service接口发布
万事开头难,本篇文章的目的就是使用JDK自带的功能,实现一个最简单的Web Service接口的发布. 下图是项目的组成,主要有三个部分,一个接口(WS),一个接口的实现类(WSImp),还有一个接口 ...
- Vue基础(1)
目录 Vue基础 基础 导入 1. 挂载 2. 插值表达式 3. 事件 4. 创建对象 5. v-text和v-html 6. vue的过滤器 7. 属性指令 Vue基础 基础 首先我们要知道Vue是 ...
- 《初识Python之认识常量type函数》
<初识Python之认识常量type函数> 1.2 认识常量 1.常量:我们用的就是它字面意义上的值或内容. 2.数字(Number) (1)整数表示:97. (2)浮点数表示:5.29 ...
- Python学习之文件操作(二)
CSV文件处理 在Python中处理CSV文件可以使用模块csv.有关csv模块的官方资料看这里. 1 读取csv文件 csv.reader(csvfile, dialect='excel', **f ...
- iOS开发系列-线程状态
概述 线程从创建到销毁中间存在很多种状态. 线程的状态 通过NSThread创建一条线程,开发者需要负责线程的创建和执行,线程的销毁由系统决定.创建一个继承NSThread的FMThread类,重写d ...
- html--垂直居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 2016.8.19上午初中部NOIP普及组比赛总结
2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...
- 菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]
菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
- 使用Native API 创建进程
使用 Native API 创建进程 最近几个星期一直在研究这个题目.因为关于方面的资料比较多(可以看下面的参考文章),所以开始时以为很快就结束了.谁知道真正动起手来才发现有很多要考虑的地方,不过还好 ...