一、虚拟服务器(server模块)

  • Nginx配置文件必须至少包含一个服务器指令来定义虚拟服务器。 当Nginx处理请求时, 它首先选择提供请求的虚拟服务器,这些虚拟服务器响应HTTP请求,因此它们都包含在http模块中
  • 虚拟服务器由http模块中的server模块来定义,一个http模块中可以有多个server模块,每个server都相当于一个虚拟服务器实例
  • 例如,下面有两个http虚拟服务器,一个监听8888,一个监听9999
http {
server {
listen 8888;
}

server {
listen 9999;
}
}
  • server模块常用的几个指令有: 

Nginx:08---HTTP模块之(虚拟服务器:server模块)_服务器

二、listen指令

  • listen指令定义了一个IP地址/端口组合或者是UNIX域套接字路径
  • 格式如下:
listen address[:port];
listen port;
listen unix:path;
  • 相关注意事项:
  • 如果省略端口,则使用标准端口
  • 如果省略一个地址,服务器将侦听所有地址
  • 如果没有包含listen 指令,则“标准”端口为 80/tcp,“default”端口为 8000/tcp,具体取决于超级用户权限


listen指令支持的参数

  • listen指令唯一标识了在Nginx下的套接字绑定,此外还有一些其他的可选参数。例如:

Nginx:08---HTTP模块之(虚拟服务器:server模块)_server模块_02


  • 例如,下面是一个配置,其虚拟服务器监听127.0.0.1:8080
htpp {
server {
listen 127.0.0.1:8080;
}
}

三、server_name指令

  • 如果有多个服务器与请求的IP地址和端口相匹配,则Nginx将根据服务器块中的server_name指令测试请求的主机头域
  • server_name用来表明主机名称。server_name后面可以跟多个主机名称
  • 默认值:默认值为""。对于没有设置Host头字段的请求,它将会匹配该server进行处理(这种情况可用于如丢弃这种缺乏Host头的请求)


server_name支持的格式

  • server_name的参数可以是完整名称、通配符或正则表达式
  • 完整名称:例如:

htpp {
server {
listen 80;
server_name example.org www.example.org;
}
}

  • 通配符:通配符是一个字符串,其开头,结尾或两者都包含星号(*),星号匹配任何字符序列。例如:
  • 匹配部分子域名:*.example.com
  • 匹配部分顶级域名:www.example.*
  • 一种特殊形式将匹配子域或域本身:.example(匹配*.example.com,也包括example.com)
  • 正则表达式:Nginx将Perl语法用于正则表达式,在它们之前使用波浪号(~)。例如:

server_name ~^www\.example\.com$

#利用捕获,可以在以后引用中进一步设置(用$1、$w等)指令中使用
server_name ~^www(\d+).example\.(com)$


四、虚拟服务器提供服务的匹配规则

  • 在一个配置文件中可以配置多个server,当一个请求到达时,其会根据下面的规则来选择哪一个server进行服务:
  • 1.匹配IP地址和listen指令指定的端口
  • 2.将Host头字段作为一个字符串匹配server_name指令
  • 3.将Host头字段与server_name指令值字符串的开始部分做匹配。例如:*.example.com
  • 4.将Host头字段与server_name指令值字符串的结尾部分做匹配。例如:www.example.*
  • 5.将Host头字段与server_name指令值进行正则表达式匹配。按照出现在配置文件中的顺序
  • 6.如果所有Host头匹配失败,那么将会转向listen指令标记的default_server(见下面介绍)
  • 7.如果所有的Host头匹配失败,并且没有default_server,那么就去匹配配置文件中列出的第一个服务器
  • 上面的整个逻辑如下图所示:

Nginx:08---HTTP模块之(虚拟服务器:server模块)_服务器_03


default_server

  • 该参数被用于处理其他没有被处理的请求
  • 因此,总是明确地推荐设置该参数,以便这些没有被处理的请求通过这种定义的方式处理
  • 例如:

htpp {
server {
listen 80;
server_name example.org www.example.org;
}
# default_server
server {
listen 8080 default_server;
}
}

  • 除了上面的用法外,该参数也可以使用同样的listen指令配置若干个虚拟服务器。这里设置的任何支付都将会在匹配的server区段有效


五、默认虚拟服务器

  • 默认服务器有方式:
  • 一种为:在配置文件中监听同一IP地址、同一端口作为另一个服务器的第一个服务器
  • 另一种为:通过listen指令的default_server参数来实现(见上面演示案例)


不让默认服务器处理无Host头的请求

  • 通过“四”和“五”的介绍我们知道,如果没有Host头的请求到来,那么会使用默认服务器开处理
  • 但是如果你不想让默认服务器处理没有Host头的请求,那么可以为server_name指令设置一个空值,这个服务器将会处理相应的请求。例如:

htpp {
# default_server
server {
listen 8080 default_server;
}
#这个服务器处理没有Host头的请求,而不是上面那个了
server {
server_name "";
}
}


六、日志指令

  • Nginx有一个非常灵活的日志记录模式。配置文件的每一个级别都可以有访问日志
  • http日志指令如下:

Nginx:08---HTTP模块之(虚拟服务器:server模块)_配置文件_04

  • 此外,在每一个级别上可以指定多个访问日志,每一个日志用一个不同的log_format指令。 log_ format指令允许你明确指定记录要记载的内容,该指令需要在http部分内定义
  • 日志文件的路径自身可以包括变量,以便你能构建一个动态的配置文件。下面的例子说明了在实践中如何配置它们
http {
log_format vhost '$host $remote_addr - $remote_user [$time_local]'
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';

log_format downloads '$time_iso8601 $host $remote_addr '

'"$request" $status $body_bytes_sent $request_time ';

open_log_file_cache max=lOOO inactive=60s;

access_ log logs/access.log;

server {
server_name ~^(www\.)?(.+)$;

access_log logs/combined.log vhost;

access_log logs/$2/access.log;

location /downloads {
access_log logs/downloads.log downloads;
}
}
}
  • 在下面的例子中,日志条目使用的gzi压缩为4级。缓存默认为64KB,而且至少每分钟都将缓存刷新到磁盘
access_log /var/log/nginx/access.log.gz combined gzip=4 flush=1m;
  • 注意,当指定了gzip后,则不可选用log_format参数。 log_format指令的组合参数默认构造如下
log_format combined '$remote_addr - $remote_user [$time_local]'
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
  • 正如你看到的,使用换行符可以增加可读性。这种写法不会影响log_format指令本身。任何变量都可以在log_format指令中使用 。下图中标有星号(*)的变量是特定记录,并且仅可以在log_format指令中使用。你可以将其他变量用于配置文件的任何地方

Nginx:08---HTTP模块之(虚拟服务器:server模块)_server模块_05

七、域名解析

待续

Nginx:08---HTTP模块之(虚拟服务器:server模块)_配置文件_06