免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7803 | 回复: 1
打印 上一主题 下一主题

[Web] 配置 Nginx [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-16 11:00 |只看该作者 |倒序浏览
配置文件语法

配置文件一般是一个文本文件,可以被管理员编辑,可以被程序解析。通过指定一组值,你定义了程序的行为,基于Linux的操作系统,大部分的应用程序都是基于一个大的、复杂的配置文件,这往往变成是一个恶梦般的管理。Apache, PHP, MySQL, Qmail和Bind——所有这些名字带来了不好的回忆,但是,没办法,所有这些应用程序都有自己的配置文件,并且各有自己的语法和格式已成为一个事实。PHP使用了Windows格式的.ini文件,sendmail使用M4宏处理器来编译配置文件,Zabbix能够从MySQL数据库抽取配置,等等。遗憾的是,没有建立一个标准!同样,你将要使用的应用程序Nginx,你需要学习它的新语法,它又有新的特点,有自己的词汇。
另一方面(这是它的优势之一),配置Nginx原来是如此的简单,相比之下,至少比Apache或者其它主流的web服务器简单,仅需要掌握一些机制——指令、blocks和整体逻辑结构,实际配置过程中,大部分将是为指令填写值。


配置指令

Nginx的配置文件被描述为一个具有一定逻辑结构的一组指令列表。应用程序的整个行为通过你去修改这些指令的值就实现了。
默认情况下,Nginx使用了一个主要的配置文件,该文件定义的步骤在第二章中有描述,下载和安装在建立配置章节,如果你没有编辑配置文件的路径和prefix选项,那么配置文件在你系统中的位置应该是“/usr/local/nginx/conf/nginx.conf”。现在让我们快速的看一下最前面的几行。
     
   
仔细看看,第首先的两行:
#user nobody;
worker_processes 1;

正如你理解的,字符“#” 作用,第一行就是个注释行,换句话说,就是一块不被解释的文本,而不管该指令是否有值,其唯一目的是要通过谁打开文件读取。你可以在一行的开始使用“#”号,也可以在“#”之后跟随指令。
第二行是一个实际的声明——一条指令,第一位(worker_processes)是一个设置键,你可以附加一个或多个参数,在这里,参数是 1 ,它标志着Nginx作为单个worker进程(关于该指令更多的功能介绍会在后面的章节中说明)。

  指令总是以分号结尾(';').

每一条指令都有它特别的功能,Nginx就是通过定义这些指令来实现特定的功能。另外,每个指令也有不通的语法,例如,指令worker_process只接受一个数字值,而指令user会让你指定两个字符串值——一个是用户账户(Nginx的worker进程会使用该用户运行),第二个是用户组。
Nginx通过模块的方法来构建,因此,每一个模块都会提供一组指令。最根本的指令是Nginx核心模块部分,将会在本章详细介绍。至于其它模块所带来的其它指令,我们将在后面的章节进行探讨。


组织和包含

在前面的截图中,你肯能已经注意到一个特别的指令——include:

include mime.types;

顾名思义,该指令就是用来执行一个对特定文件的包含,换句话说,该文件的内容将被插入到这个确定(确切)的位置。这里有一个实际的例子,以便帮助我们去理解:

nginx.conf:


user nginx nginx;
worker_processes 4;
include other_settings.conf;

   
other_settings.conf:


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指令,在主配置文件中通过该指令将文件other_settings.conf包括了进来,而在该文件中又包含其它的文件。

在最初的配置文件设置中,有两个文件被使用——nginx.conf和mime.type。然而,对于高级配置来说,这少有五个文件,描述如下:

标准名字        描                述
nginx.conf        应用程序的基本配置文件
mime.types        一个文件扩展列表文件,它们与MIME类型关联
fastcgi.conf        与FastCGI相关的配置文件
proxy.conf        与Proxy相关的配置文件
sites.conf        配置Nginx提供的web站点,也包括众所周知的虚拟主机。
推荐每一个域建立一个单独的文件。

这些文件名是按照惯例来定义的,实际上,没有任何事去阻止你使用其它的文件名,例如,你可以将FastCGI和Proxy重新组合到有一个普通的文件中,文件名可以叫做proxy_and_fastcgi_config.conf
注意,include指令支持文件名替换,换句话说,使用“*”的文件名,这里的*可以匹配零个、一个或者是多个连续的字符:

include sites/*.conf;

这将会包含sites目录下所有以.conf结尾的文件,这种机制允许你去为你的每一个web站点建立一个单独的文件,然后就像使用上面的指令一样,通过一条指令就可以一次全部包括进来。
在包含一个文件的时候要仔细点——如果指定的文件不存在,那么配置检测就会失败,Nginx也就不会再启动了:
[alex@example sbin]# ./nginx -t
[emerg]: open() "/usr/local/nginx/conf/dummyfile.conf" failed (2: No such file or directory) in /usr/local/nginx/conf/nginx.conf:48

很明显,先前的配置不为真,由于包含的通配符包含了不存的文件
然后,如果你在你的配置文件插入“include dummy*.conf”,然后再测试它(看一下这种格式在你的系统上是否有配置),看一下会有什么情况发生:

[alex@example sbin]# ./nginx –t
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful


指令块(blocks)

指令是由模块提供的——如果你激活一个新模块,那么会有一组特定的指令变为有效。模块也可以使得指令块(block,区段。在本书的翻译中,“块”和“区段”混合使用,有的时候觉得“块”合适,而有时有觉的是“区段”合适,但表达的是同一个内容)可用,例如,下列是配置文件中的一个逻辑框架。

events {
worker_connections 1024;
}


这个events区段(block),你可以在默认的配置文件中找到,它来自于由Events模块,该模块提供的在指令也只能在该block下使用,例如上面处理的那个例子中, worker_connections只能放置在events区段才有意义。然后有一个重要的例外——一些文件可以放置在配置文件的根本(最开始的部分),因为它可以给服务器一个全局的效果。配置文件的根部也就被认为是主要的block。

  本章将详述核心模块中的块和指令,模块为服务器的顺利运作所需。可选模块(它们在默认情况下是否启用)将在后面的章节中讨论。

注意,在某些情况下,blocks能够互相嵌套,下面是一个特定的逻辑:
http {
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/example.com.log;
location ^~ /admin/ {
index index.php;
}
}
}

   
这个例子展示了如何在web站点配置Nginx,这样你能够辨别出http区段(而不是,比如说,imap,如果你想利用邮件服务器的代理功能使用)。
在这个http区段,你可以声明一个或多个server区段,一个server区段允许你配置一个虚拟主机。在这个例子中,server区段包含了一些配置,这些设置会通过一个主机HTTP头(Host HTTP header)应用到所有的请求中,用来正确的配置example.com。
在这个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.com/www;
然而,如果你子昂使用一个特殊的字符,例如空格符(" ",分号(或者是花括号({  }),那么你就需要使用单引号或者是双引号:
root '/home/example.com/my web pages';
无论使用单引号或双引号,Nginx会认为没有什么区别。

论坛徽章:
0
2 [报告]
发表于 2010-12-21 10:58 |只看该作者
膜拜一下!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP