之前介绍了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匹配顺序

  1. 精确匹配

  2. *在前的泛域名

  3. *在后的泛域名

  4. 按文件中的顺序匹配正则表达式域名

  5. default server:第1个 或者是listen指定的default

·

六. HTTP请求处理的11个阶段

  1. POST_READ:获取到Header后的第一个阶段。模块:realip

  2. SERVER_REWRITE:配置在server模块中的rewrite阶段。模块:rewrite

  3. FIND_CONFIG:根据配置查找由谁处理请求的阶段。

  4. REWRITE:配置在location模块中的rewrite阶段。模块:rewrite

  5. POST_REWRITE

  6. PREACCESS:向上游服务请求连接前的阶段。模块:limit_conn、limit_req

  7. ACCESS:与上游服务器连接的验证阶段。模块:auth_basic、access、auth_request

  8. POST_ACCESS

  9. PRECONTENT:发送data数据前的阶段。模块:try_files

  10. CONTENT:发送数据极端。模块:index、autoindex、concat

  11. LOG:记录请求日志、错误日志阶段。模块:access_log

七. 11个请求阶段的处理顺序

[Day4] Nginx Http模块一的更多相关文章

  1. [Day4] Nginx Http模块二

    一. POST_READ阶段     1. 用户ip在http请求中的传递? 前提:Tcp连接四元组(src ip,src port,dst ip,dst port) HTTP头部 X-Formard ...

  2. 基于Nginx dyups模块的站点动态上下线并实现简单服务治理

    简介 今天主要讨论一下,对于分布式服务,站点如何平滑的上下线问题. 分布式服务 在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一 ...

  3. Nginx 切片模块、断点续传

    熟悉 CDN 行业主流技术的朋友应该都比较清楚,虽然 Nginx 近几年发展的如日中天,但是基本上没有直接使用它自带的 proxy_cache 模块来做缓存的,原因有很多,例如下面几个: 不支持多盘 ...

  4. nginx事件模块分析(一)

    nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...

  5. mac下Nginx+lua模块编译安装

    Nginx的nb之处就不说了,lua也是一个小巧的脚本语言,由标准C编写而成,几乎可以运行在所有的平台上,也非常强大,其他特性请自行度娘.nginx_lua_module是由淘宝的工程师清无(王晓哲) ...

  6. nginx添加模块 (非覆盖安装)

    nginx添加模块(非覆盖安装) 原已经安装好的nginx,现在需要添加一个未被编译安装的模块: 查看原来编译时都带了哪些参数# /usr/local/nginx/sbin/nginx -V ngin ...

  7. 一些好用的nginx第三方模块

    一些好用的nginx第三方模块 转自;http://macken.iteye.com/blog/1963301  1.Development Kit https://github.com/simpl/ ...

  8. 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- ...

  9. nginx -- handler模块(100%)

    handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...

随机推荐

  1. org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found. Available parameters are [arg1, arg0, param1, param2]

    这个异常说明参数没有加上@Param注解,加上这个注解就行了. 默认情况下mybatis把参数按顺序转化为[0, 1, param1, param2],也就是说#{0} 和 #{param1} 是一样 ...

  2. 5.1_Spring Boot2.x安装Docker

    1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker 是一个开源的应用容器引擎,基于Go 语言并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用 ...

  3. VMware Workstation 10 配置Ubuntu环境

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 VMware Work ...

  4. shell脚本练习06

    ######################################################################### # File Name: -.sh # Author ...

  5. 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容

    原文:使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群19106581 ...

  6. 腾讯bugly接入插件(CocosCreator)

    下载: plugin-bugly.zip (1.4 MB) 插件开源地址: https://github.com/tidys/CocosCreatorPlugins/tree/master/packa ...

  7. 在js中使用Razor

    @foreach (var tem in Model) { <text> time.push("@tem.CreateTime.ToString("G")&q ...

  8. 今天给各位介绍Linux touch命令详述

    触摸命令 touch命令有两个功能:一个是将现有文件的时间戳更新为系统的当前时间(默认模式),它们的数据将保持不变;第二个是创建一个新的空文件. 语法 触摸(可选) 最常见的用法:touch file ...

  9. springboot thymeleaf ----服务端渲染html

    一. 引用命名空间 <html xmlns:th="http://www.thymeleaf.org"> 不这么写 html标签没闭合会报错 二.实际内容在../sta ...

  10. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...