配置文件语法
配置文件一般是一个文本文件,可以被管理员编辑,可以被程序解析。通过指定一组值,你定义了程序的行为,基于Linux的操作系统,大部分的应用程序都是基于一个大的、复杂的配置文件,这往往变成是一个恶梦般的管理。Apache, PHP, MySQL, Qmail和Bind——所有这些名字带来了不好的回忆,但是,没办法,所有这些应用程序都有自己的配置文件,并且各有自己的语法和格式已成为一个事实。PHP使用了Windows格式的.ini文件,sendmail使用M4宏处理器来编译配置文件,Zabbix能够从MySQL数据库抽取配置,等等。遗憾的是,没有建立一个标准!同样,你将要使用的应用程序Nginx,你需要学习它的新语法,它又有新的特点,有自己的词汇。
另一方面(这是它的优势之一),配置Nginx原来是如此的简单,相比之下,至少比Apache或者其它主流的web服务器简单,仅需要掌握一些机制——指令、blocks和整体逻辑结构,实际配置过程中,大部分将是为指令填写值。
配置指令
Nginx的配置文件被描述为一个具有一定逻辑结构的一组指令列表。应用程序的整个行为通过你去修改这些指令的值就实现了。
默认情况下,Nginx使用了一个主要的配置文件,该文件定义的步骤在第二章中有描述,下载和安装在建立配置章节,如果你没有编辑配置文件的路径和prefix选项,那么配置文件在你系统中的位置应该是“/usr/local/nginx/f”。现在让我们快速的看一下最前面的几行。
仔细看看,第首先的两行:
#user nobody;
worker_processes 1;
正如你理解的,字符“#” 作用,第一行就是个注释行,换句话说,就是一块不被解释的文本,而不管该指令是否有值,其唯一目的是要通过谁打开文件读取。你可以在一行的开始使用“#”号,也可以在“#”之后跟随指令。
第二行是一个实际的声明——一条指令,第一位(worker_processes)是一个设置键,你可以附加一个或多个参数,在这里,参数是 1 ,它标志着Nginx作为单个worker进程(关于该指令更多的功能介绍会在后面的章节中说明)。
指令总是以分号结尾(';').
每一条指令都有它特别的功能,Nginx就是通过定义这些指令来实现特定的功能。另外,每个指令也有不通的语法,例如,指令worker_process只接受一个数字值,而指令user会让你指定两个字符串值——一个是用户账户(Nginx的worker进程会使用该用户运行),第二个是用户组。
Nginx通过模块的方法来构建,因此,每一个模块都会提供一组指令。最根本的指令是Nginx核心模块部分,将会在本章详细介绍。至于其它模块所带来的其它指令,我们将在后面的章节进行探讨。
组织和包含
在前面的截图中,你肯能已经注意到一个特别的指令——include:
pes;
顾名思义,该指令就是用来执行一个对特定文件的包含,换句话说,该文件的内容将被插入到这个确定(确切)的位置。这里有一个实际的例子,以便帮助我们去理解:
user nginx nginx;
worker_processes 4;
include f;
f:
error_log logs/error.log;
pid logs/nginx.pid;
以下是Nginx解释配置文件的最终结果:
user nginx nginx;
worker_processes 4;
error_log logs/error.log;
pid logs/nginx.pid;
在上面例子中包括了递归处理,在这种情况下,你有使用了include指令,在主配置文件中通过该指令将文件f包括了进来,而在该文件中又包含其它的文件。
在最初的配置文件设置中,有两个文件被使用——f和pe。然而,对于高级配置来说,这少有五个文件,描述如下:
标准名字 描 述
推荐每一个域建立一个单独的文件。
这些文件名是按照惯例来定义的,实际上,没有任何事去阻止你使用其它的文件名,例如,你可以将FastCGI和Proxy重新组合到有一个普通的文件中,文件名可以叫做proxy_and_f
注意,include指令支持文件名替换,换句话说,使用“*”的文件名,这里的*可以匹配零个、一个或者是
多个连续的字符:
include sites/*.conf;
这将会包含sites目录下所有以.conf结尾的文件,这种机制允许你去为你的每一个web站点建立一个单独的文件,然后就像使用上面的指令一样,通过一条指令就可以一次全部包括进来。
在包含一个文件的时候要仔细点——如果指定的文件不存在,那么配置检测就会失败,Nginx也就不会再启动了:
[alex@example sbin]# ./nginx -t
[emerg]: open() "/usr/local/nginx/f" failed (2: No such file or directory) in /usr/local/nginx/f:48
很明显,先前的配置不为真,由于包含的通配符包含了不存的文件
然后,如果你在你的配置文件插入“include dummy*.conf”,然后再测试它(看一下这种格式在你的系统上是否有配置),看一下会有什么情况发生:
[alex@example sbin]# ./nginx –t
the configuration file /usr/local/nginx/f syntax is ok
configuration file /usr/local/nginx/f test is successful
指令块(blocks)
指令是由模块提供的——如
果你激活一个新模块,那么会有一组特定的指令变为有效。模块也可以使得指令块(block,区段。在本书的翻译中,“块”和“区段”混合使用,有的时候觉得“块”合适,而有时有觉的是“区段”合适,但表达的是同一个内容)可用,例如,下列是配置文件中的一个逻辑框架。
events {
worker_connections 1024;
}
这个events区段(block),你可以在默认的配置文件中到,它来自于由Events模块,该模块提供的在指令也只能在该block下使用,例如上面处理的那个例子中, worker_connections只能放置在events区
段才有意义。然后有一个重要的例外——一些文件可以放置在配置文件的根本(最开始的部分),因为它可以给服务器一个全局的效果。配置文件的根部也就被认为是主要的block。
本章将详述核心模块中的块和指令,模块为服务器的顺利运作所需。可选模块(它们在默认情况下是否启用)将在后面的章节中讨论。
注意,在某些情况下,blocks能够互相嵌套,下面是一个特定的逻辑:
nginx和apache区别http {
server {
listen 80;
server_name example;
access_log /var/log/nginx/example.log;
location ^~ /admin/ {
index index.php;
}
}
}
这个例子展示了如何在web站点配置Nginx,这样你能够辨别出http区段(而不是,比如说,imap,如果你想利用邮件服务器的代理功能使用)。
在这个http区段,你可以声明一个或多个server区段,一个server区段允许你配置一个虚拟主机。在这个例子中,server区段包含了一些配置,这些设置会通过一个主机HTTP头(Host HTTP header)应用到所有的请求中,用来正确的配置example。
在这个server区段内,你可以插入一个或多个location区段,当你需要对特定的路径进行URI匹配时,这些location区段允许你对这些路径单独设置。更多的信息会在第4章提供,在配置Location区段章节。
最后但并非最不重要的,配置的继承,在一个区段中嵌套了其它的区段,那么被嵌套的区段会继承其父区段的设置。access_log指令(在这个例子中,在server区段级别定义了)指定了对于这个服务器所有的HTTP请求都会记录在这个文本文件中,
这个条件在location子区段任然成立,但是你可以重新设置access_log指令来禁用这个继承:
[…]
location ^~ /admin/ {
index index.php;
access_log off;
}
[…]
这样,日志除了不能够记录 /admin/ 外,它仍可以记录该站点所有的访问日志。对access_log设置的值,在server级别的区段设置的值将会被在location级别的区段设置的值所覆盖。
高级语言规则
一些重要的资料,这些被看做是Nginx配置文件的语法,它们将帮助你理解某些语法规则,如果你以前没有在Nginx下工作过,那么你
会觉得难以理解。
接受指令的特有语法
对于偶然发现的这种复杂语法咋看一下可能会难以理解:
rewrite ^/(.*)\.(png|jpg|gif)$ /image.php? file=$1&format=$2 last;
语法详细的指导了指令的用法。Listen指令只能够接受一个端口号,来打开一个监听套接字,location块或rewrite指令支持复杂的表达式,是为了配置特殊模式。所有这些语法,都将会在各自的章节中通过具体的指令一同解释。
在后面我们将会学习一个模块(那就是Rewrite模块),它允许你将更加高级的逻辑结构,通过使用if, set, break和return指令以及使用各种变量来处理一个选择。通过这些新的元素,配置文件开始变得就像编程脚本一样。不管怎么说,我们认识的模块越多,语法也就会变的越丰富。
指令值的单位
最后,你可以使用下列单位,来指定配置文件中所在的环境中所使用的指令值的单位。
k 或 K: 千字节
m 或 M: 兆字节
因此,下列的两个语法是正确的,也是相等的:
client_max_body_size 2M;
client_max_body_size 2048k;
下面是可以指定的时间值,你可以使用下列的缩写形式:
ms: Milliseconds(毫秒)
s: Seconds(秒)
m: Minutes(分钟)
h: Hours(小时)
d: Days(天)
w: Weeks(星期)
M: Months (30 days)(月)
y: Years (365 days)(年)
在用一个时间段作为指示值的情况,这将变得特别有用:
client_body_timeout 3m;
client_body_timeout 180s;
client_body_timeout 180;
注意默认的时间单位是秒,在上面的例子中,因此最后两行的结果一样。
变量
模块提供了各种变量,变量被用于指定变量值,例如,Nginx的HTTP核心模块定义了$nginx_version变量。
在设置log_format指令时,在下列的格式中,你可以包含各种各样的变量:
[…]
location ^~ /admin/ {
access_log logs/main.log;
log_format main '$pid - $nginx_version - $remote_addr';
}
[…]
注意,一些指令不允许你使用任何变量:
error_log logs/error-$nginx_version.log;
这是一个有效的配置指令,然而,它只会简单的产生一个名字为“error-$nginx_version.log”的文件,而不会解析改变量。
字符串值
将字符串用作指令值,可以有三种格式,首先,你可以没有引号的形式:
root /home/example/www;
然而,如果你子昂使用一个特殊的字符,例如空格符(" ",分号(或者是花括号({ }),那么你就需要使用单引号或者是双引号:
root '/home/example/my web pages';
无论使用单引号或双引号,Nginx会认为没有什么区别。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论