第一时间获取技术干货和业界资讯!
☞ 免费CSDN资料帮下服务 | 免费加群 ☜
基本上每个软件或框架都提供的有配置文件。比如,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 定义:
上面结构体解释如下:
常用的 type 指令类型如下:
常用的 4 个指令块对应的模块都非常的复杂,具体参见 nginx 的源代码就知道了。本文主要阐述一个事实,nginx 的配置文件并不复杂,全都有指令或指令块构成,摸通它的构成即可。后面我们会通过具体的实例来学习每个指令的用法。