基本上每个软件或框架都提供的有配置文件。比如,Tomcat 有配置文件,Apache 也有,Spring Boot 也有,nginx 也不例外。其中 nginx 的配置文件最过于复杂,其实也不复杂,因为你没完全理解 nginx 的配置语法,等你理解后,会发现原来是如此的简单。
Nginx 的配置语法,大概有下面 7 个规则构成。
每个配置文件都由指令块和指令构成。指令块是由 {} 大括号构成,一个指令块内可以包含多个指令。每个指令以 ; 分号结尾。
指令与参数之间以空格分割,多个空格也可以。# 是用来注释的,# 行后面的全为注释,# 代表的是单行注释。
$ 符合代表变量,变量有自定义变量和系统提供的变量。部分指令的参数支持正则表达式,比如:location 指令。
include 语句,或者说 include 指令允许引入多个其他配置文件。
具体每个指令的参数是什么?几个参数?是否支持正则表达式?等都是由具体的模块决定的。
常见的指令块有 4 个,分别是:http 指令、server 指令、location 指令、upstream 指令。掌握这 4 个基本上就可以天下通吃!
nginx 的各个模块组合形成了其强大的处理能力,而每个模块只实现一个特定的功能。比如限流功能由模块 ngx_http_limit_conn_module 或者自定义模块实现 ngx_http_limit_req_module;fastcgi 转发功能由模块 ngx_http_fastcgi_module 实现;proxy 转发功能由 ngx_http_proxy_module(当然转发功能的实现还必须有模块 ngx_http_upstream_module)。
当我们配置了指令 proxy_pass 或者 fastcgi_pass 时,该指令应该由哪个模块来解析呢?显然应该由实现此功能的模块来解析。即 nginx 配置文件的解析是分散到各个模块的。
每个模块都有一个 commands 数组,存储该模块可以解析的所有配置指令。指令结构体由 ngx_command_t 定义:
struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); ngx_uint_t conf; ngx_uint_t offset; void *post; };
上面结构体解释如下:
- name:配置指令名称,如“proxy_pass”;
- type:指令类型,可以将指令类型分为两类。1 是说明指令可以出现的位置,比如配置文件(只能在配置文件最外层,不能出现在任何指令块内部),http指令块,或者 events 指令块,或者 server 指令块,或者 location 指令块,或者。2 是按照参数分类。
- set:处理函数,当读取到该配置指令时,会执行此函数;
- conf 和 offset:两者其实都表示的是偏移量,但是用处不同,解析指令时会详述,这里暂时跳过。
- post:可以指向多种结构,不同指令可能不同,大多都为 NUll,解析到具体指令时会详述,这里同样跳过。
常用的 type 指令类型如下:
常用的 4 个指令块对应的模块都非常的复杂,具体参见 nginx 的源代码就知道了。本文主要阐述一个事实,nginx 的配置文件并不复杂,全都有指令或指令块构成,摸通它的构成即可。后面我们会通过具体的实例来学习每个指令的用法。
: » 难倒一切众生的 nginx 配置文件,指令和指令块详解!
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/252751.html