Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)

摘要:
因此,HTTP框架依据常见的处理流程将处理阶段划分为11个阶段,其中每个处理阶段都可以由任意多个HTTP模块流水式地处理请求。

一、server_name指令

1、指令后可跟多个域名。第一个是主域名

Syntax server_name_in_redirect on | off;
Default server_name_in_redirect off;
Context http, server, location

server_name_in_redirect on

server {
	server_name primary.luoahong.tech second.luoahong.tech;
	server_name_in_redirect on;
	return 302 /redirect;

}

测试:

[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

[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、*泛域名:仅支持在最前或者最后

server_name *.luoahong.com

3、正则表达式:加~前缀

server_name www.luoahong.com ~^wwwd+.luoahong.com$;

4、用正则表达式创建变量:

例如:

server {
  server_name ~^(www.)?(.+)$;
  location / { root /sites/$2; }
}

用小括号()

server {
  server_name ~^(www.)?(?<domain>.+)$;
  location / { root /sites/$domain; }
}

5、其他

.luoahong.tech可以匹配 luoahong.tech *.luoahong.tech
_匹配所有
"" 匹配没有传递Host头部

6、server匹配顺序

1、精确匹配

2、*在前的泛域名

3、*在后的泛域名

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

5、default server

第1个

listen指定default

二、http请求处理图解

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第1张

三、http请求的11个阶段表格

Nginx的模块化设计使得每一个HTTP模块可以仅专注于完成一个独立的、简单的功能,而一个请求的完整处理过程可以由无数个HTTP模块共同合作完成。这种设计有非常好的简单性、可测试性、可扩展性,然而,当多个http模块流水式地处理同一个请求时,单一的处理顺序是无法满足灵活性需求的,每一个正在处理的HTTP模块很难灵活、有效地指定下一个HTTP处理模块是哪一个。

因此,HTTP框架依据常见的处理流程将处理阶段划分为11个阶段,其中每个处理阶段都可以由任意多个HTTP模块流水式地处理请求。

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_READrealip刚读完http请求头、没有经过任何加工过、我想获取到一些原始的值
SERVER_REWRITErewrite它和下面REWRITE的只有一个模块
FIND_CONFIG这个只有nginx框架会做所以没有任何的模块、就是在做location的一个匹配
REWRITErewrite一般第三方模块没有一个处理REWRITE
POST_REWRITE刚刚REWRITE之后要做的一些事情
PREACCESSlimt_conn, limit_req在access之前要不要做一些工作、 限制速度、 限制连接数
ACCESSauth_basic| access|auth_request确认访问权限的 能不能访问|根据访问的ip|根据第三方的服务
POST_ACCESS
PRECONFTENTtry_files mirrors处理CONTENT之前 会把这个服务发送给第三方服务、一个请求产生多个请求值
CONTENTindex| autoindex|concat反向代理
LOGaccess_log打印access日志的

四、11个阶段的处理顺序

1、通过编译后的配置文件看处理顺序

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阶段

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第2张

3、preaccess阶段

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第3张

4、access阶段

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第4张

5、precontent阶段

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第5张

6、content阶段

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第6张

7、 log阶段

Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)第7张

免责声明:文章转载自《Nginx核心知识100讲学习笔记(陶辉)详解HTTP模块(详解11阶段)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt编译mysql以及创建表后进行导入操作c# vs2010 连接access数据库(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Nginx + Tomcat7 + redis session一致性问题

        Nginx 作负载均衡时,由于是每次都需要把请求分发到不同的机器,同一个用户在一台机器上创建了 session,下一次的请求很有可能会转发到另外一台机器,会造成 session 丢失。我们可以使用 Redis 来保存 session。具体步骤如下: 1.  https://files.cnblogs.com/files/langfanyun...

【转】nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

原文: http://blog.csdn.net/pcyph/article/details/46513521 -------------------------------------------------------------------------------------------------------------------- 前言 ngi...

openresty使用笔记(一)

背景介绍 游戏经过一段时间的运营,发现了原来的设计缺陷太多,所以决定重新设计架构。使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案。先看看下面这张简单的架构图吧~ 从图上看,结构是非常简单的。主要通过编写lua分配策略使游戏房间内的人数尽量坐满。 技术实现思路 要编写lua插件通常需求编译nginx使其支持,如果嫌麻烦可以直接上...

Thinkphp+Nginx(PHPstudy)下报的404错误,403错误解决

最近一个TP5的项目说放到Nginx下测试看看,下载个 PHPstudy,放到WWW下,配置好域名,直接给个报个404; 解决方法: 1.先在phpstudy下配置好域名目录指向项目下的public下; 2.复制下面这段代码放进nginx/conf/vhost文件里: location / {index index.html index.htm inde...

Nginx 目录浏览基础与进阶

目录 1、简述 2、配置目录浏览 3、进阶版配置 3.1 添加第三方模块 3.2 修改配置文件 3.3 重启测试 3.4 自定义主题 1、简述 Nginx作为一款优秀的web服务器,其默认不允许列出站点的整个目录,如果需要配置,需要单独打开此功能 此功能一般用于单独开设虚拟主机供内网如下载文件等功能使用,其他情况下为了安全,一般不会开启此...

nginx 引号 x22

这个好像是nginx故意这样做的。 因为Nginx默认的log_format使用双引号作为间隔符,为了避免日志分析时候出现混乱,所以将双引号解析为x22了。 只能每天日志切割的时候,自己替换日志中的x22字符为双引号了 我的解决方法: sed 's#\x22#"#g' test.txt 可以把x22userIdx22:x22tommyels_hu...