前置知识: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, serverSyntax: 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
9server {
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 | Syntax: set_real_ip_from address | CIDR | unix:; |