Nginx的主配置文件是nginx.conf,在我的机器里位于/usr/local/nginx/conf目录下。它决定了Nginx服务器加载哪些模块,如何监听和处理客户端请求,以及Nginx自身运行所必须的一些初始化项,比如多少个工作进程,调试级别等。
Nginx的配置文件是一个可继承的层次结构体系,定义在在上级定义块中的配置会自动应用到下级定义块,任何时候都可以在下级定义块中覆盖这些设置。因此,在多数场合,我们应该尽可能的将配置写在最定级的定义块中。
一共有三层定义块,即HTTP块,server块和Location块。除此之外,还存在两个特殊的Location块,一个事件块(event block)和根(root)区块,根区块是事件块和HTTP块贮留的地方。这些块只包含很少的一些配置,因此绝大多数时间会花在HTTP块,server块和Location块的配置上。
这些块具有某种意义上的语义。Server块即Apache的虚拟主机(Virtual Host),而Location块常常指的是一个URI。
基于前面所述,我们给出Nginx配置文件的体系结构如下:
虚拟主机块(virtual hosts)
Nginx从设计上考虑了一台服务器有多个网络接口和多个虚拟服务器并存的情况。从配置上,它使用下面的方式来决定来自于不同网络接口的各个URL请求如何被匹配和处理。
一、Server块
server {
listen 192.168.1.1:80;
server_name nginx.org www.nginx.org;
...
}
server {
listen 192.168.1.1:80;
server_name nginx.net www.nginx.net;
...
}
server {
listen 192.168.1.2:80;
server_name nginx.com www.nginx.com;
...
}
上述server块定义了三个虚拟主机,其中前两个监听在192.168.1.1:80端口上,它们分别响应不同的主机地址;最后一个则临听在另一个网络接口192.168.1.2:80上。
当Nginx收到一个HTTP请求时,它会首先从HTTP头的HOST字段中取得主机名,结合监听地址进行server匹配。如果HTTP不包含HOST字段,或者HOST字段无法匹配,则会匹配对应监听地址上的缺省配置的虚拟服务器。在上面的例子中,每个网络接口上配置的第一个server,即为缺省服务器。即,如果在192.168.1.1:80上收到一个没有HOST字段的请求,则Nginx会使用www.niginx.org这个server块的配置来处理这个请求。注意,关于缺省服务器的指定,还可以通过在监听端口上附加default_server值来指定该虚拟服务器为缺省服务器。即可以用下面的配置来指定www.nginx.net为缺省服务器:
server {
listen 192.168.1.1:80;
server_name nginx.org www.nginx.org;
...
}
server {
listen 192.168.1.1:80 default_server;
server_name nginx.net www.nginx.net;
...
}
二、Location块
Location块的设置决定了每个具体的URL如何被处理。关于它的配置,可以参见Location.
语法: location [=/~/~*/^~/@] /uri […]
结合下面的例子来分析:
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
[ configuration D ]
}
location语法中包含四个部分:location关键字,前缀,URI和配置项,其中前缀和URI决定如何匹配到一个URI,我们先来看这一部分。
location的前缀共包含5个关键字:’=',’~',’~*’,’^~’和‘@’,用来指示后面的URI部分是字面匹配,正则表达式匹配还是命名位置匹配(named location)。命名位置匹配并不用于标准的地址匹配,它们是用来做内部请求重定向的,具体请参见error_page,try_files。当然,location也可以不包含任何前缀。
前缀’='指示Nginx对后面的URI完全按字面精确匹配。比如:
location = / {
# 只匹配对根地址'/'的请求.
[ 配置 A]
}
上例中, http://www.nginx.com/的请求会被匹配,而 http://www.nginx.com/anydocument.html不会被匹配。注意,如果你在匹配中指定了index页面,则该页面,比方说为index.html,则无论你输入 http://www.nginx.com/或者 http://www.nginx.com/index.html都会被匹配。
前缀’~',’~*’用来指示该location是一个正则表达式的匹配,’~'要求在匹配时区分大小写,而’~*’表明在匹配时不区分大小写。Nginx的正则表达式是PCRE兼容的,应用中需要注意URI中常见的字符’.'需要进行转义。
前缀’^~’另有含义,它表示中止location的继续匹配。通常在复杂的网站配置中,可能会出现一个URI请求会同时匹配到多个location的情况。那么在这种情况下,该URI究竟适用哪个location定义呢?这就涉及到location的优先级以及何时提前中止匹配的问题。
Nginx规定:
1. 任何时候,带’='前缀的匹配优先级最高。如果某个URI能完全匹配,则URI匹配搜索中止。
2. 尝试匹配非正则表达式URI,如果找到一个区配,且该location带前缀’^~’指示,URI匹配搜索中止;否则,保留匹配结果,继续搜索。
3. 尝试正则表达式匹配。如果存在多个正则表达式都可以匹配到请求的URI,则按它们在配置文件中的先后顺序来决定优先级。
4. 如果#3存在匹配,使用该匹配结果,否则使用#2的结果。
最后,还存在着不带前缀的字面匹配,请看以下两组定义:
location = / {
# matches the query / only.
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
[ configuration B ]
}
上述定义中的第一组匹配前面已经讲过了。前面不能被第一组定义匹配的URI http://www.nginx.com/anydocument.html 这次可以被第二组定义匹配了。第二组定义的含义是,从URI的起始部分开始做不定长度的匹配,因此,实际上任何其它location定义不能匹配的URI都会被这组location定义匹配。
不带前缀的字面匹配优先组最低,适合用作缺省定义。
此外,Nginx在做URI比较时,使用的是已解码的字符串,例如,如果你想匹配"/images/%20/test",则你必须定义"/images/ /test"。
最后,是一些例子,供练习。
Example:
location = / {
# matches the query / only.
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
[ configuration B ]
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
[ configuration D ]
}
Example requests:
/ -> configuration A
/documents/document.html -> configuration B
/readme.html –> configuration B, if readme.html is not the index page
/images/1.gif -> configuration C, prefix ^~ cause the search ceased. Otherwise, it should match configuration D
/documents/1.jpg -> configuration D