Nginx学习笔记(二)
http模块的配置指令
前期准备阶段(框架代码处理)
listen语句
文档 https://nginx.org/en/docs/http/ngx_http_core_module.html#listen
用sock和本地端口的区别
通过sock不需要走Linux完整网络模型速度更快
server_name语句
语法
指定多个域名,第一个为主域名
Syntax: server_name_in_redirect on | off; Default: server_name_in_redirect off; Context: http, server, location
主域名的作用是当server_name_in_redirect设置为on 的时候重定向会将domain改为主域名
e.g.
1  |  | 
这样在返回的时候会重定向到http://primary.test.com/redirect
泛域名
*.test.com
test.com/*
只支持在最前或最后
正则表达式
加前缀~^test/.com/$
正则表达式可以使用()创建变量
e.g.
1
2
3
4
5
6server{
server_name ~^(www\.)?(.+);
location / {
root /site/$2;
}
}其它
.test.com可以用来匹配test.com和*.test.com_匹配所有""匹配没有传递Host头部的
匹配顺序
- 精确匹配
 - *在前的泛域名
 - *在后的泛域名
 - 正则表达式匹配(多次匹配的按照顺序进行选择)
 - 匹配失败 --> default server
- 不指定则为第一个
 - listen语句可以用default指定
 
 
Http请求的11个阶段
| 阶段 | 模块 | 
|---|---|
| POST_READ | realip | 
| SERVER_REWRITE | rewrite | 
| FIND_CONFIG | |
| REWRITE | rewrite | 
| POST_REWRITE | |
| PREACCESS | limt_conn, limt_req | 
| ACCESS | auth_basic, access, auth_request | 
| POST_ACCESS | |
| PRECONTENT | try_files | 
| CONTENT | Index, autoindex, concat | 
| LOG | access_log | 
rewrite模块
return指令
1  |  | 
| 状态码 | 标准 | 意义 | 
|---|---|---|
| 301 | http1.0 | 永久重定向 | 
| 302 | http1.0 | 临时重定向,禁止缓存 | 
| 303 | http1.1 | 临时重定向,禁止缓存,允许改变方法 | 
| 307 | http1.1 | 临时重定向,禁止缓存,不允许改变方法 | 
| 308 | http1.1 | 永久重定向,不允许改变方法 | 
| 444 | nginx自定义 | 立即关闭连接,不反回数据 | 
error_page指令
1  |  | 
rewrite指令在两个阶段都可能出现,此时要注意执行顺序
rewrite指令
Syntax: rewrite regex replacement [flag];
作用是将regex替换成replacement
regex可以使用正则表达式和分组生成新变量
如果relacement以
http://或https://或$schema开头直接返回302flag:
flag 意义 last 用replacement进行新的location匹配 break 停止当前脚本的执行,停止rewrite模块其他指令 redirect 返回302重定向 permanent 返回301重定向 
1 会按顺序执行
2 返回3.txt的内容 返回3.txt的内容 返回"third"
3 emmm
1  |  | 
开启可以记录下所有重定向记录
if指令

find_config 阶段 location 指令
Syntax:
location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... } Default: — Context: server, locationSyntax: merge_slashes on | off; Default:
merge_slashes on; Context: http, server
URL常见有有如下几种
- 前缀字符串
- 常规
 - =:精确匹配
 - ^~:匹配上后则不再进行正则匹配
 
 - 正则表达式
- ~:大小写敏感
 - ~*:忽略大小写
 
 - 用于内部跳转的命名:@name
 - 合并连续的/号:
merge_slashes on 
匹配顺序:

首先进行前缀匹配,发现=或者^~匹配则直接使用,否则记住最长匹配,按文件顺序进行正则表达式匹配,匹配则直接采用否则继续匹配,若均不匹配则使用上面记录的最长匹配。
PREACCESS阶段
limit_conn模块(限制并发连接数)
默认编译
使用共享内存,生效于全部worker
限制有效性取决于key的设计:postread阶段的realip模块获得的真实ip
主要指令:
定义共享内存以及key
limit_conn_zone key zone=name:sizekey可以取
$remote_addrbinary_remote_addr等limit_conn zone number
日志相关指令:
limit_con_log_level控制日志级别
limit_conn_status控制返回错误码
limit_request模块(限制每个客户端每秒请求数)
默认编译
使用共享内存,生效于全部worker
算法:leaky bucket算法
主要指令:
定义共享内存
limit_req_zone key zone=name:size rate=rate ;- 限制并发连接数
limit_req zone=name [burst=number] [nodelay]; 
- burst默认为0
 - nodelay立即处理不做延时
 
日志相关: limit_req_log_level和limit_conn_status
另:同时打开时limit_request模块优先生效
ACCESS阶段
access模块
指令:
allow和deny
auth_basic模块
用户认证模块
auth_basic和auth_basic_user_file
auth_request使用第三方权限验证系统(默认未编译)
auth_request和auth_request_set
对上面三个模块做限制的satisfy指令
satisfy all | any;
all:必须所有模块放行才可以
any:任何一个放行就可以
注意问题
- 如果有return则不生效,即使在前面也不生效
 - 模块间顺序有影响
 

PRECONTENT阶段
try_files指令
依次试图访问各个文件[没有的话返回code]try_files file ... [=code];
应用:反向代理时可以先尝试在本地找,没有的话去上游
mirror模块
流量拷贝
处理请求时,生成子请求访问其他服务,对子请求的返回值不做请求
mirror和mirror_request_body
CONTENT阶段
static模块(root和alias模块)
功能:
将url映射为静态文件提供访问
root和alias之间的差别:
- root会将location映射进文件路径,alias只会将location后的url映射
 - root有默认配置
html - content只能用在location里,root有上下文可以继承上文
 
例子 1
2
3
4
5
6
7location /root{
  root html;
}
loaction /alias{
  alias html
}
则访问/root会访问html/root,/alias则是/html
几个变量
| 变量 | 值 | 
|---|---|
| request_filename | 待访问文件完整路径 | 
| document_root | 由URL和root/alias规则生成的文件夹路径 | 
| realpath_root | 将document_root替换为真实路径(解决软连接等) | 
content-type

日志:log_not_found on|off
当访问目标是目录但是没有带/的处理
会触发301重定向
server_name_in_redirect on|off 控制是否返回server_name
port_in_redirect on|off 是否附加端口
absolute_redirect on|off 控制是否返回域名 打开但是server_name为off时返回host
index和auto_index
当以/结尾时,默认index尝试寻找index.html,auto_index则尝试返回目录
然而因为index领先auto_index,所以如果目录下存在index指定的文件时就不会返回目录
一些指令autoindex autoindex_exact_size autoindex_format autoindex_localtime
concat模块
功能: 当页面需要访问多个小文件时,拼接返回提高性能,由阿里巴巴提供
使用: 下载https://github.com/alibaba/nginx-http-concat 编译时添加--add-module=../nginx-http-concat/

未完待续…