Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)
一、server_name指令
1、指令后可跟多个域名。第一个是主域名
1 2 3 | Syntax server_name_in_redirect on | off; Default server_name_in_redirect off; Context http, server, location |
server_name_in_redirect on
1 2 3 4 5 6 | server { server_name primary.luoahong.tech second.luoahong.tech; server_name_in_redirect on; return 302 /redirect ; } |
测试:
1 2 3 4 5 6 7 8 | [root@ceph-client vhost] # curl second.luoahong.tech -I HTTP /1 .1 302 Moved Temporarily Server: openresty /1 .13.6.2 Date: Wed, 26 Aug 2020 01:26:22 GMT Content-Type: text /html Content-Length: 167 Location: http: //primary .luoahong.tech /redirect Connection: keep-alive |
server_name_in_redirect off
1 2 3 4 5 6 7 8 9 | [root@ceph-client conf] # nginx -s reload [root@ceph-client vhost] # curl second.luoahong.tech -I HTTP /1 .1 302 Moved Temporarily Server: openresty /1 .13.6.2 Date: Wed, 26 Aug 2020 01:26:09 GMT Content-Type: text /html Content-Length: 167 Location: http: //second .luoahong.tech /redirect Connection: keep-alive |
2、*泛域名:仅支持在最前或者最后
1 | server_name *.luoahong.com |
3、正则表达式:加~前缀
1 | server_name www.luoahong.com ~^www\d+\.luoahong\.com$; |
4、用正则表达式创建变量:
例如:
1 2 3 4 | server { server_name ~^(www\.)?(.+)$; location / { root /sites/ $2; } }<br> |
用小括号()
1 2 3 4 | server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/ $domain; } } |
5、其他
1 2 3 | .luoahong.tech可以匹配 luoahong.tech *.luoahong.tech _匹配所有 "" 匹配没有传递Host头部 |
6、server匹配顺序
1、精确匹配
2、*在前的泛域名
3、*在后的泛域名
4、按文件中的顺序匹配正则表达式域名
5、default server
第1个
listen指定default
二、http请求处理图解
三、http请求的11个阶段表格
Nginx的模块化设计使得每一个HTTP模块可以仅专注于完成一个独立的、简单的功能,而一个请求的完整处理过程可以由无数个HTTP模块共同合作完成。这种设计有非常好的简单性、可测试性、可扩展性,然而,当多个http模块流水式地处理同一个请求时,单一的处理顺序是无法满足灵活性需求的,每一个正在处理的HTTP模块很难灵活、有效地指定下一个HTTP处理模块是哪一个。
因此,HTTP框架依据常见的处理流程将处理阶段划分为11个阶段,其中每个处理阶段都可以由任意多个HTTP模块流水式地处理请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | typedef enum { //在接收到完整的HTTP头部后处理的HTTP阶段 NGX_HTTP_POST_READ_PHASE = 0, //在请求的URI与location表达式匹配前,修改请求的URI(重定向),是一个独立的HTTP阶段 NGX_HTTP_SERVER_REWRITE_PHASE, //根据请求的URI寻找匹配的location表达式,这个阶段只能由 NGX_HTTP_FIND_CONFIG_PHASE, //在NGX_HTTP_FIND_CONFIG_PHASE阶段寻找到匹配的location之后再修改请求的URI NGX_HTTP_REWRITE_PHASE, //这一阶段是用于在rewrite重写URL后,防止错误的nginx.conf配置导致死循环(递归地修改URI) NGX_HTTP_POST_REWRITE_PHASE, //表示在处理NGX_HTTP_ACCESS_PHASE阶段觉得请求的访问权限前,HTTP模块可以介入的处理阶段 NGX_HTTP_PREACCESS_PHASE, //这个阶段用于让HTTP模块判断是否允许这个请求访问nginx服务器 NGX_HTTP_ACCESS_PHASE, //在NGX_HTTP_ACCESS_PHASE阶段中,当HTTP模块的handler处理函数返回不允许访问的错误码时(NGX_HTTP_FORBIDDEN或者NGX_HTTP_UNAUHORIZED),这里将负责向用户发送拒绝服务的错误响应。 NGX_HTTP_POST_ACCESS_PHASE, //此阶段专门为try_files配置项设立,当HTTP请求访问静态文件资源时,try_files配置项可以使这个配置项顺序地访问多个静态文件资源 NGX_HTTP_TRY_FILES_PHASE, //用于处理HTTP请求内容的阶段,这是大部分HTTP模块最愿意介入的阶段 NGX_HTTP_CONTENT_PHASE, //处理完请求后记录日志的阶段,ngx_http_log_module模块就在这个阶段中加入了一个handler处理方法,使得每个HTTP请求处理完毕后会记录access_log访问日志 NGX_HTTP_LOG_PHASE } ngx_http_phases; 这11个阶段有些是必备的,有些是可选的,也可以有多个HTTP模块同时介入同一阶段 HTTP阶段的定义,包括checker检查方法和handler处理方法,如下所示: typedef structngx_http_phase_handler_s ngx_http_phase_handler_t; /*一个HTTP处理阶段中的checker检查方法,仅可以由HTTP框架实现,以此控制HTTP请求的处理流程*/ typedef ngx_int_t(*ngx_http_phase_handler_pt)(ngx_http_request_t *r, ngx_http_phase_handler_t*ph); /*由HTTP模块实现的handler处理方法*/ typedef ngx_int_t(*ngx_http_handler_pt)(ngx_http_request_t *r); struct ngx_http_phase_handler_s { /*在处理到某一个HTTP阶段时,HTTP框架将会在checker方法已实现的前提下首先调用checker方法来处理请求, 而不会直接调用任何阶段中的hanlder方法,只有在checker方法中才会去调用handler方法,因此,事实上所有 的checker方法都是由框架中的ngx_http_core_module模块实现的,且普通模块无法重定义checker方法*/ ngx_http_phase_handler_pt checker; /*除ngx_http_core_module模块以外的HTTP模块,只能通过定义handler方法才能介入某一个HTTP处理阶段以处理请求*/ ngx_http_handler_pt handler; /*将要处理的下一个HTTP处理阶段的序号 next的设计使得处理阶段不必按顺序依次执行,既可以向后跳跃数个阶段继续执行,也可以跳跃到之前的某个阶段重新 执行,通常,next表示下一个处理阶段中的第1个ngx_http_phase_handler_t处理方法*/ ngx_uint_t next; }; |
使用的模块 | 备注 | |
---|---|---|
POST_READ | realip | 刚读完http请求头、没有经过任何加工过、我想获取到一些原始的值 |
SERVER_REWRITE | rewrite | 它和下面REWRITE的只有一个模块 |
FIND_CONFIG | 这个只有nginx框架会做 | 所以没有任何的模块、就是在做location的一个匹配 |
REWRITE | rewrite | 一般第三方模块没有一个处理REWRITE |
POST_REWRITE | 刚刚REWRITE之后要做的一些事情 | |
PREACCESS | limt_conn, limit_req | 在access之前要不要做一些工作、 限制速度、 限制连接数 |
ACCESS | auth_basic| access|auth_request | 确认访问权限的 能不能访问|根据访问的ip|根据第三方的服务 |
POST_ACCESS | ||
PRECONFTENT | try_files mirrors | 处理CONTENT之前 会把这个服务发送给第三方服务、一个请求产生多个请求值 |
CONTENT | index| autoindex|concat | 反向代理 |
LOG | access_log |
四、11个阶段的处理顺序
1、通过编译后的配置文件看处理顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | vim /usr/local/src/openresty-1.13.6.2/bundle/nginx-1.13.6/auto/modules .......... ngx_module_order="ngx_http_static_module \ ngx_http_gzip_static_module \ ngx_http_dav_module \ ngx_http_autoindex_module \ ngx_http_index_module \ ngx_http_random_index_module \ ngx_http_access_module \ ngx_http_realip_module \ ngx_http_write_filter_module \ ngx_http_header_filter_module \ ngx_http_chunked_filter_module \ ngx_http_v2_filter_module \ ngx_http_range_header_filter_module \ ngx_http_gzip_filter_module \ ngx_http_postpone_filter_module \ ngx_http_ssi_filter_module \ ngx_http_charset_filter_module \ ngx_http_xslt_filter_module \ ngx_http_image_filter_module \ ngx_http_sub_filter_module \ ngx_http_addition_filter_module \ ngx_http_gunzip_filter_module \ ngx_http_userid_filter_module \ ngx_http_headers_filter_module \ ngx_http_copy_filter_module \ ngx_http_range_body_filter_module \ ngx_http_not_modified_filter_module \ ngx_http_slice_filter_module" .......... |
2、postread阶段
3、preaccess阶段
4、access阶段
5、precontent阶段
6、content阶段
7、 log阶段
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分类:
深挖计算机基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-08-29 深入浅出计算机组成原理学习笔记:第十九讲
2019-08-29 深入浅出计算机组成原理学习笔记:第十八讲