[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 ...
随机推荐
- Hexo 博客图片添加至图床---腾讯云COS图床使用。
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 腾讯云官网 登录注册 创建存储桶 进入上面的存 ...
- 左神算法进阶班1_1添加最少字符得到原字符N次
Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...
- layui表格监听开关并获取改行id
,{field:'sex', title:'性别', width:85, templet: '#switchTpl', unresize: true} <script type="te ...
- 【bzoj 2870】 最长道路tree
题目 边分治 边分和点分相比就是找到一条重心边,考虑所有经过这条边的路径,之后断开这条边分成两个联通块,继续分治 由于每次分治重心是一条边,所以只会产生两个联通块,考虑两个联通块显然要比像点分那样考虑 ...
- C# EF去除重复列DistinctBy
在网上看了LinQ有DistinctBy方法,实际在用的时候并没有找到,后来参照了该网站才发现写的是拓展方法 https://blog.csdn.net/c1113072394/article/det ...
- iOS开发系列-Block本质篇
概述 在iOS开发中Block使用比较广泛,对于使用以及一些常规的技术点这里不再赘述,主要利用C++角度分析Block内部数据底层实现,解开开发中为什么这样编写代码解决问题. Block底层结构窥探 ...
- NOIP2018游记 & 退役记
NOIP2018游记 & 退役记 我是一名来自湖北武汉华中师大一附中的高二\(OIer\),学习\(OI\)一年,今年去参加\(NOIP\),然后退役.这是一篇\(NOIP2018\)的游记, ...
- 根据table返回来的数据,动态展示组织名称
<template> <div class="app-container calendar-list-container"> <el-card cla ...
- (转载)——Centos下安装Redis(原文地址:http://www.nnzhp.cn/archives/169)
原文地址:http://www.nnzhp.cn/archives/169 今天介绍一下redis,重点介绍一下redis的安装. Redis 是一个基于内存的高性能key-value数据库,数据都保 ...
- Joomla - 自定义(自定义模块、修改原有模块样式、添加全局JS)
一.自定义模块 自定义模块 参考 Joomla - 模块系统(新建模块.模块类别.自定义模块)第三点 自定义模块部分 自定义模块布局 参考 Joomla - T3模板(非常好用的4屏响应式模板) 的第 ...