HAOJX

Nginx中HTTP请求的11个阶段之第一阶段----postread阶段(realip模块)

字数统计: 533阅读时长: 2 min
2018/10/10 Share

前置知识:nginx接受请求流程是什么

先是进行三次握手(SYN , SYN+ACK , ACK) ——->负载均衡选中工作在cpu上的worker ,———>epoll_wait, ——->accept建立连接, 之后分配内存池 (connection_pool_size:512)——————–>ngx_http_init_connection设定回调方法 , epoll_ctl , 添加超时定时器(client_header_timeout: 60s)

之后内核接受到来着客户端的DATA , 这个回调方法就开始处理 , gx_http_wait_request_handler 分配内存 ,read读缓存区(client_header_buffer_size:1k)

之后接受URI , —–>分配请求内存池(request_pool_size:4k)——->状态机解析请求行 , 如果内存不够可以在加(large_client_header_buffers:4 8k) 之后再次解析请求行, 解析完成之后 , 标识URI ,

再之后接受header , 状态机解析header , 标识header , 标识之后就移除超时定时器(client_header_timeout: 60s) , 搞完这些之后就开始11阶段的http请求了

过大的请求头部

Syntax: client_header_buffer_size size;
Default: client_header_buffer_size 1k;
Context: http, server

Syntax: large_client_header_buffers number size;
Default: large_client_header_buffers 4 8k;
Context: http, server

server_name指令

  • 指令后可以跟多个域名, 第一个是主域名

  • *泛域名 , 仅支持在前或在后

  • 正则表达式: 用~开始

  • 用正则表达式创建变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    server {
    server_name ~^(www\.)?(.+)$;
    location / { root /sites/$2; }
    }

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

匹配顺序

  • 精确匹配
  • *在前的域名
  • *在后的域名
  • 按顺序匹配正则表达式
  • default server

请求的11个阶段

阶段 模块
POST_READ realip
SERVER_REWRITE rewrite
FIND_CONFIG
REWRITE rewrite
POST_REWRITE
PREACCESS limt_conn, limit_req
ACCESS auth_basic, access, auth_request
POST_ACCESS
PRECONTENT try_files
CONTENT index, autoindex, concat
LOG access_log

POST_READ阶段—realip模块

用户的真实ip是如何传递的 , 在tcp连接中有(src ip,src port, dst ip,dst port) , 在http传递中有X-Forwarded-For来传递ip , X-Real-IP用来传递用户ip , 拿到这些ip该怎么使用呢 , 是基于变量 , 在nginx中用binary_remote_addr? remote_addr这样的变量

realip默认不会编译进nginx , 需要--with-http_realip_module 来启用 , 它是用来修改客户端地址的 , 提供了2个变量 realip_remote_addr, realip_remote_port

realip模块指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
Syntax:  set_real_ip_from address | CIDR | unix:;
Default: —
Context: http, server, location


Syntax: real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
Default: real_ip_header X-Real-IP;
Context: http, server, location


Syntax: real_ip_recursive on | off;
Default: real_ip_recursive off;
Context: http, server, location
CATALOG
  1. 1. 前置知识:nginx接受请求流程是什么
    1. 1.0.1. server_name指令
  • 2. 请求的11个阶段
  • 3. POST_READ阶段—realip模块