一、基于名称的虚拟处事器
nginx首先确定哪个处事器应处理惩罚该请求。让我们从一个简朴的设置开始,个中所有三个虚拟处事器都在端口*:80上侦听:
server {
listen 80;
server_name example.org ;
...
}
server {
listen 80;
server_name example.net ;
...
}
server {
listen 80;
server_name example.com ;
...
}
在此设置中,nginx仅测试请求的header字段“host”以确定应将请求路由到哪个处事器。假如其值与任那里事器名称都不匹配,可能请求基础不包括此header字段,则nginx会将请求路由到该端口的默认处事器。在上面的设置中,默认处事器是第一个处事器-这是nginx的尺度默认行为。还可以利用listen指令中的default_server参数来显式配置哪个处事器应为默认处事器:
server {
listen 80 default_server;
server_name example.net ;
...
}
自0.8.21版今后的版本,default_server参数已可用。在早期版本中,应改用默认参数。
请留意,默认处事器是侦听端口的属性,而不是处事器名称的属性。稍后再具体先容。
二、如何阻止利用未界说的处事器名称的http请求
假如不答允不带“主机”header字段的请求,则可以界说仅扬弃请求的处事器:
server {
listen 80
server_name ””;
return 444;
}
在这里,处事器名称配置为空字符串,该字符串将与没有“ Host”header字段的请求举办匹配,并返回非凡的nginx的非尺度代码444,以封锁毗连。
从版本0.8.48开始,这是处事器名称的默认配置,因此可以省略server_name“”。在早期版本中,计较机的主机名用作默认处事器名。
三、基于名称和IP地点殽杂的虚拟处事器
让我们看一个更巨大的设置,个中一些虚拟处事器侦听差异的地点:
server {
listen 192.168.1.1:80;
server_name example.org ;
...
}
server {
listen 192.168.1.1:80;
server_name example.net ;
...
}
server {
listen 192.168.1.2:80;
server_name example.com ;
...
}
在这种设置中,nginx首先按照处事器块的侦听指令测试请求的IP地点和端口。然后,它按照与IP地点和端口匹配的处事器块的server_name条目测试请求的“主机”header字段。假如找不随处事器名称,则默认处事器将处理惩罚该请求。譬喻,在192.168.1.1:80端口上收到的对的请求将由192.168.1.1:80端口的默认处事器(即第一台处事器)处理惩罚,因为没有为此端口界说。
如前所述,默认处事器是侦听端口的属性,而且可觉得差异的端口界说差异的默认处事器:
server {
listen 192.168.1.1:80;
server_name example.org ;
...
}
server {
listen 192.168.1.1:80 default_server;
server_name example.net ;
...
}
server {
listen 192.168.1.2:80 default_server;
server_name example.com ;
...
}
四, 一个简朴的PHP站点设置
此刻,让我们看看nginx如何选择一个位置来处理惩罚典范的简朴PHP网站的请求:
server {
listen 80
server_name example.org ;
root /data/www;
location / {
index index.html index.php;
}
location ~* \。(gif | jpg | png)$ {
expires 30d;
}
location ~\ .php $ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$ document_root $ fastcgi_script_name;
include fastcgi_params;
}
}
无论列出的顺序如何,nginx首先搜索文字字符串给定的最特定的前缀位置。在上面的设置中,独一的前缀位置是“/”,而且由于它匹配任何请求,因此将被用作最后的手段。然后,nginx凭据设置文件中列出的顺序查抄由正则表达式指定的位置。第一个匹配的表达式将遏制搜索,nginx将利用此位置。假如没有正则表达式与请求匹配,则nginx利用较早发明的最特定的前缀位置。
请留意,所有范例的位置仅测试没有参数的请求行的URI部门。这样做是因为查询字符串中的参数可以通过几种方法给出,譬喻:
/index.php?user=john&page=1
/index.php?page=1&user=john
另外,任何人都可以在查询字符串中请求任何内容:
/index.php?page=1&something+else&user=john
此刻,让我们看一下在以上设置中如那里理惩罚请求: