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.

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\/\d{2}$

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

    e.g.

    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_READrealip
SERVER_REWRITErewrite
FIND_CONFIG
REWRITErewrite
POST_REWRITE
PREACCESSlimt_conn, limt_req
ACCESSauth_basic, access, auth_request
POST_ACCESS
PRECONTENTtry_files
CONTENTIndex, autoindex, concat
LOGaccess_log

rewrite模块

return指令

return code [text]
return code URL
return URL
状态码标准意义
301http1.0永久重定向
302http1.0临时重定向,禁止缓存
303http1.1临时重定向,禁止缓存,允许改变方法
307http1.1临时重定向,禁止缓存,不允许改变方法
308http1.1永久重定向,不允许改变方法
444nginx自定义立即关闭连接,不反回数据

error_page指令

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

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有上下文可以继承上文

例子

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/

未完待续…


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

正则表达式 上一篇
Nginx学习笔记(一) 下一篇