Nginx主配置文件
写在前面
考虑到Nginx主配置文件的重要性和日常使用的高频率,这里专门拿出一篇文章来深入学习nginx.conf主配置文件,灵活配置nginx.conf主配置文件是学好Nginx的关键所在。
Nginx配置文件
在nginx目录下有一个conf目录,里面存放的都是与Nginx配置相关的文件,一般来说我们修改的都是名为nginx.conf的主配置文件。该配置文件由若干个部分组成,每个大括号{}
表示一个部分,每行指令都由分号结束;
,用于表示一行的结束。
去除nginx.conf主配置文件中的注释代码,完整的内容如下所示:
1 | worker_processes 1; |
使用类似于tree的命令来生成该配置文件内容的树形图,如下所示:
1 | main # 全局配置,对全局生效 |
先从整体层面来学习这个Nginx配置文件,通常的配置语法规则如下:
(1)配置文件由指令和指令块构成;
(2)每条指令以;
分号结尾,指令与参数间以空格符号分隔;
(3)指令块与{}
大括号将多余条指令组织在一起;
(4)include语句允许组合多个配置文件以提升可维护性;
(5)使用#
符号添加注释,提高可读性;
(6)使用$
符号使用变量;
(7)部分指令的参数支持正则表达式。
常用正则介绍
从上面的介绍中可以看到,server块中可以包含多个location块,location指令用于匹配uri,语法如下:
1 | location [ = | ^~ | ~ | ~* ] uri { |
简单解释一下上述代码的含义:location是指令;[ = | ^~ | ~ | ~* ]
是匹配的标识符;uri是匹配的网站地址;{...}
是匹配URI后要执行的配置段。
这里对指令后面匹配的标识符进行介绍,如下:
(1)=
精确匹配路径,用于不包含正则表达式的uri前,如果匹配成功,那么就不再进行后续的查找;
(2)^~
用于不包含正则表达式的uri前,表示如果该符号后面的字符是最佳匹配,则采用该规则,不再进行后续的查找。
(3)~
表示用该符号后面的正则去匹配路径,区分大小写;
(4)~*
表示用该符号后面的正则去匹配路径,不区分大小写;
(5)/
是通用匹配,任何请求都会匹配到。
也就是说如果uri中不包含正则表达式,则可以使用前面两个;如果包含则必须使用后面两个。
当然常用的正则如下表所示:
正则|说明|
-|:-:|.
|匹配除换行符以外的任意字符|?
|匹配0次或者1次|+
|匹配1次或者多次|*
|匹配0次或者多次|\d
|匹配数字,即0-9|\D
|匹配非数字,即不是数字|^
|匹配字符串的开始|$
|匹配字符串的结束|{n}
|重复n次|{n,}
|重复n次或多次|[c]
|匹配单个字符c|[a-z]
|匹配a-z小写字母中的任意一个|
由于location后面的标识符非常重要,后续会专门出一篇文章来研究它的用法。
全局变量
当然除了可以使用正则表达式外,还可以使用一些常用的全局变量,开发者可以在配置的任意位置使用它们:
全局变量名 | 功能介绍 |
---|---|
$host |
请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名,注意不包括端口 |
$request_method |
客户端请求类型,如 GET、POST |
$args |
请求中的参数 |
$arg_PARAMETER |
GET 请求中变量名PARAMETER参数的值,如$http_user_agent就表示User-Agent 的值 |
$content_length |
请求头中的Content-length字段的值 |
$content_type |
请求头中的Content-Type字段的值 |
$http_user_agent |
客户端agent信息 |
$http_cookie |
客户端cookie信息 |
$remote_addr |
客户端的IP地址 |
$remote_port |
客户端的端口 |
$remote_user |
已经经过Auth Basic Module验证过的用户名 |
$server_protocol |
请求使用的协议,如 HTTP/1.0、HTTP/1.1 |
$server_addr |
服务器地址 |
$server_name |
服务器名称 |
$server_port |
服务器的端口号 |
$scheme |
HTTP 方法(如http,https) |
$uri |
不带请求参数的当前URI,注意$uri 中不包含主机名,如/envy/index.html |
$document_uri |
功能与$uri 类似 |
$document_root |
当前请求在root指令中指定的值 |
$request_uri |
包含请求参数的原始URI,注意也不包含主机名,如/envy/search.html?name=envy |
$request_filename |
当前请求的文件路径,由root或者alias指令与URI请求生成 |
$limit_rate |
用于限制连接速率 |
举个例子,如请求http://127.0.0.1:8080/envy/think/hello.html
,那么其中的部分信息如下:
全局变量名|内容|
-|:-:|$host
|127.0.0.1|$server_port
|8080|$request_uri
|/envy/think/hello.html|$document_uri
|/envy/think/hello.html|$document_root
|/var/www/html|$request_filename
|/var/www/html/envy/think/hello.html|
预定义变量
除了全局变量,Nginx还提供了很多预定义的变量,开发者也可以通过set来设置变量,下面是一些常用的预定义变量,可以看到这些和全局变量其实差不多:
预变量名 | 所表示的值 |
---|---|
$args_name |
请求中name参数的值 |
$args |
所有请求参数 |
$query_string |
$args 的别名 |
$content_length |
请求头Content-Length的值 |
$content_type |
请求头Content-Type的值 |
$host |
如果当前有Host,那么为请求头Host的值;如果没有,那么该值等于匹配该请求的server_name的值 |
$remote_addr |
客户端的IP地址 |
$request |
客户端发起的完整请求,包括HTTP请求方法、URI、HTTP协议、头和请求体 |
$request_uri |
客户端发起的完整请求的URI,注意包括参数 |
$scheme |
当前请求的协议 |
$uri |
当前请求的标准化URI |
main模块
全局设置填写Nginx的全局配置,在此区域填写的内容会被应用到Nginx的全局,如修改Nginx默认的用户名(默认为nobody)可以在配置文件的开头加上user nginx,这样Nginx运行的用户就变成了nginx。
常用的全局配置项如下:
(1)worker_processes
,表示Nginx开启的子进程数;
(2)error_log
,表示定义全局错误日志文件,可选的值有debug、info、notice、warn、error、crit等;
(3)pid
用于指定进程id的存储文件位置;
(4)worker_rlimit_nofile
,用于指定Nginx进程最多可以打开的文件描述符数目。
举个例子,如下所示的配置信息:
1 | # 定义Nginx运行的用户和用户组 |
上面的例子只是为了示例,在实际使用工作中可以使用默认的配置,也就是不用作任何修改。
events模块
events模块用来指定Nginx的工作模式和单个进程的连接数上限。举个例子如下:
1 | events { |
上述进程的最大连接数受Linux系统进程的最大打开文件数的限制,只有在执行操作系统命令ulimit -n 65536
之后worker_connections的设置才会生效。
http模块
http部分是配置文件最核心的部分,它包括了绝大部分HTTP服务器相关属性的配置,如是否使用Keepalive,是否使用gzip进行压缩等,还包括server和upstream这些子模块,这些都是Nginx负载均衡的重要配置部分。
举个例子,下面是较为完整的配置信息:
1 | # 配置http服务器 |
http模块的设置非常庞杂,这里只是列举一小部分配置。
server模块
server模块是http的子模块,它可以定义一个虚拟主机,基本配置如下所示:
1 | server { |
简单解释一下上述配置信息内容:
(1)server{}
表示虚拟主机配置范围;
(2)listen用于指定虚拟主机的服务端口;
(3)server_name用于指定IP地址或者域名,在多个域名之间用空格分开;
(4)root表示在server这个虚拟主机内Web服务的根目录;
(5)index用于定义默认的首页地址;
(6)charset用于设置网页的默认编码格式;
(7)access_log用于指定虚拟主机访问日志的存放路径,后面接上日志的输出格式。
server模块的配置也很多,其中location模块也是server模块的子模块。
location模块
location模块是Nginx中可自定义程度最高的模块,它用于定位解析URL,通过使用正则匹配,用户可以通过location指令实现对网页的各种处理。
举个例子,下面这个反向代理中的location /
就是用于匹配根目录:
1 | location / { |
upstream模块
upstream模块又称为负载均衡模块,下面通过一个简单的调度算法来认识这个模块:
1 | upstream example.com { |
在上面的例子中,通过使用upstream指令定义了一个名为example.com的负载均衡器,此处的名称可以随意指定,不一定是一个域名。其中的fair是一种负载均衡调度算法,后面的server表示真实服务器群组,后接真实服务器的IP地址。
请注意IP地址后面的down表示该server不参与负载均衡;backup表示预留的备份机器,只有当其他所有的非backup机器出现故障或者异常忙碌时,才会请求backup机器,所有这台机器的负载压力较小;max_fails表示允许请求失败的次数(默认为1次),当超过最大次数时返回proxy_next_upstream模块定义的错误。fail_timeout表示在经历max_fails次失败后暂停服务的时间。max_conns表示限制分配给后端服务器处理的最大连接数量,超过这个数量,将不会分配新的连接给它。
请注意,upstream模块中还有一个resolve选项,它需要配合http模块来使用,如下所示:
1 | http { |
在http模块下配置resolver命令,指定域名解析服务为example.com域名,并且由192.168.73.100服务器来负责解析。关于upstream模块的常见配置,可以点击 这里 进行查阅。
下面用一张图来对nginx.conf主配置文件的内容进行总结:
完整配置文件示例
下面是一个较为完整的配置文件示例,内容如下所示:
1 | user nginx nginx; # 运行用户和组,默认是nginx,可不进行设置 |
也就是说整个Nginx的核心配置文件的框架为:
1 | worker_processes 1; |
这样关于Nginx安装和配置文件的介绍就先学习到这。