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
2
3
4
5
6
7
server{
server_name primary.test.com second.test.com;
server_name_in_redirect on;

return 302 /redirect;

}

这样在返回的时候会重定向到http://primary.test.com/redirect

  • 泛域名

    *.test.com

    test.com/*

    只支持在最前或最后

  • 正则表达式

    加前缀~^test/.com/$

    正则表达式可以使用()创建变量

    e.g.

    1
    2
    3
    4
    5
    6
    server{
    server_name ~^(www\.)?(.+);
    location / {
    root /site/$2;
    }
    }
  • 其它

    • .test.com 可以用来匹配test.com*.test.com
    • _匹配所有
    • "" 匹配没有传递Host 头部的

匹配顺序

  1. 精确匹配
  2. *在前的泛域名
  3. *在后的泛域名
  4. 正则表达式匹配(多次匹配的按照顺序进行选择)
  5. 匹配失败 --> 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
2
3
return code [text]
return code URL
return URL
状态码 标准 意义
301 http1.0 永久重定向
302 http1.0 临时重定向,禁止缓存
303 http1.1 临时重定向,禁止缓存,允许改变方法
307 http1.1 临时重定向,禁止缓存,不允许改变方法
308 http1.1 永久重定向,不允许改变方法
444 nginx自定义 立即关闭连接,不反回数据

error_page指令

1
2
3
4
5
6
7
8
9
10
11
12
1. error_page 404 /404.html;
2. error_page 500 502 503 504 /50x.html;
3. error_page 404 =200 /empty.gif;
4. error_page 404 = /404.php;
5. location / {
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://backend;
}
6. error_page 403 http://example.com/forbidden.html;
7. error_page 404 =301 http://example.com/notfound.html

rewrite指令在两个阶段都可能出现,此时要注意执行顺序

rewrite指令

Syntax: rewrite regex replacement [flag];

  • 作用是将regex替换成replacement

  • regex可以使用正则表达式和分组生成新变量

  • 如果relacement以http://https://$schema 开头直接返回302

  • flag:

    flag 意义
    last 用replacement进行新的location匹配
    break 停止当前脚本的执行,停止rewrite模块其他指令
    redirect 返回302重定向
    permanent 返回301重定向

    1 会按顺序执行

    2 返回3.txt的内容 返回3.txt的内容 返回"third"

    3 emmm

1
2
rewrite_log on
error_log ...

开启可以记录下所有重定向记录

if指令

find_config 阶段 location 指令

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location

Syntax: merge_slashes on | off; Default:
merge_slashes on; Context: http, server

URL常见有有如下几种

  1. 前缀字符串
    1. 常规
    2. =:精确匹配
    3. ^~:匹配上后则不再进行正则匹配
  2. 正则表达式
    1. ~:大小写敏感
    2. ~*:忽略大小写
  3. 用于内部跳转的命名:@name
  4. 合并连续的/号:merge_slashes on

匹配顺序:

首先进行前缀匹配,发现=或者^~匹配则直接使用,否则记住最长匹配,按文件顺序进行正则表达式匹配,匹配则直接采用否则继续匹配,若均不匹配则使用上面记录的最长匹配。

PREACCESS阶段

limit_conn模块(限制并发连接数)

默认编译

使用共享内存,生效于全部worker

限制有效性取决于key的设计:postread阶段的realip模块获得的真实ip

主要指令:

  1. 定义共享内存以及key

    limit_conn_zone key zone=name:size

    key可以取$remote_addr binary_remote_addr

  2. limit_conn zone number

日志相关指令:

limit_con_log_level控制日志级别

limit_conn_status控制返回错误码

limit_request模块(限制每个客户端每秒请求数)

默认编译

使用共享内存,生效于全部worker

算法:leaky bucket算法

主要指令:

  1. 定义共享内存limit_req_zone key zone=name:size rate=rate ;

  2. 限制并发连接数limit_req zone=name [burst=number] [nodelay];
  • burst默认为0
  • nodelay立即处理不做延时

日志相关: limit_req_log_levellimit_conn_status

另:同时打开时limit_request模块优先生效

ACCESS阶段

access模块

指令:

allowdeny

auth_basic模块

用户认证模块

auth_basicauth_basic_user_file

auth_request使用第三方权限验证系统(默认未编译)

auth_requestauth_request_set

对上面三个模块做限制的satisfy指令

satisfy all | any;

all:必须所有模块放行才可以

any:任何一个放行就可以

注意问题

  1. 如果有return则不生效,即使在前面也不生效
  2. 模块间顺序有影响

PRECONTENT阶段

try_files指令

依次试图访问各个文件[没有的话返回code]try_files file ... [=code];

应用:反向代理时可以先尝试在本地找,没有的话去上游

mirror模块

流量拷贝

处理请求时,生成子请求访问其他服务,对子请求的返回值不做请求

mirrormirror_request_body

CONTENT阶段

static模块(root和alias模块)

功能:

将url映射为静态文件提供访问

root和alias之间的差别:

  1. root会将location映射进文件路径,alias只会将location后的url映射
  2. root有默认配置html
  3. content只能用在location里,root有上下文可以继承上文

例子

1
2
3
4
5
6
7
location /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_nameoff时返回host

index和auto_index

当以/结尾时,默认index尝试寻找index.htmlauto_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/

未完待续…


Nginx学习笔记(二)
https://blog.yrpang.com/posts/39867/
作者
yrPang
发布于
2020年1月31日
许可协议