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:size
key可以取
$remote_addr
binary_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/
未完待续…