难倒一切众生的 nginx 配置文件,指令和指令块详解!

NDIS herman 368浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

基本上每个软件或框架都提供的有配置文件。比如,Tomcat 有配置文件,Apache 也有,Spring Boot 也有,nginx 也不例外。其中 nginx 的配置文件最过于复杂,其实也不复杂,因为你没完全理解 nginx 的配置语法,等你理解后,会发现原来是如此的简单。

Nginx 的配置语法,大概有下面 7 个规则构成。

Nginx 的配置语法规则

每个配置文件都由指令块和指令构成。指令块是由 {} 大括号构成,一个指令块内可以包含多个指令。每个指令以 ; 分号结尾。

指令与参数之间以空格分割,多个空格也可以。# 是用来注释的,# 行后面的全为注释,# 代表的是单行注释。

$ 符合代表变量,变量有自定义变量和系统提供的变量。部分指令的参数支持正则表达式,比如: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 指令类型如下:

nginx 指令结构体 type 类型

常用的 4 个指令块对应的模块都非常的复杂,具体参见 nginx 的源代码就知道了。本文主要阐述一个事实,nginx 的配置文件并不复杂,全都有指令或指令块构成,摸通它的构成即可。后面我们会通过具体的实例来学习每个指令的用法。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 难倒一切众生的 nginx 配置文件,指令和指令块详解!