前面我们讲到关于nginx配置文件(nginx.conf)运行,性能优化,及相关调试的一些配置语法,本小节我们将会讲到怎么去配置一个基本的web,以及相关配置项的定义,虚移主机以及请求的分发的语法配置。
一.怎么使用HTTP核心模块配置一个静态Web服务器?
静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现,当然,一个完整的静态Web服务器还有许多功能是由其他的HTTP模块实现的。本节主要讨论如何配置一个包含基本功能的静态Web服务器
如下所示,为一个基本http的配置
http { gzip on; upstream { … } server { listen localhost:80; … location /webstatic { if … { … } root /opt/webresource; … } location ~* .(jpg|jpeg|png|jpe|gif)$ { … } } server { … } }
以上即为一个简单的静态web配置说明参考
所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等(HTTP配置项自然必须全部在http{}块之内,这里的“直属于”是指配置项直接所属的大括号对应的配置块),同时,在描述每个配置项的功能时,会说明它可以在上述的哪个块中存在,因为有些配置项可以任意地出现在某一个块中,而有些配置项只能出现在特定的块中。
Nginx为配置一个完整的静态Web服务器提供了非常多的功能,下面会把这些配置项分为以下8类进行详述:虚拟主机与请求的分发、文件路径的定义、内存及磁盘资源的分配、网络连接的设置、MIME类型的设置、对客户端请求的限制、文件操作的优化、对客户端请求的特殊处理。这种划分只是为了帮助大家从功能上理解这些配置项。下面我们为大家一一介绍相应的配置说明:
1.1虚拟主机与请求的分发配置项说明
由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了。
[1] 监听端口
语法:listen address:port [ default(deprecated in 0.8.21) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ] ];
默认:listen 80;
配置块:server
listen参数决定Nginx服务如何监听端口。在listen后可以只加IP地址、端口或主机名,非常灵活,例如:
listen 127.0.0.1:8000; listen 127.0.0.1; #注意:不加端口时,默认监听80端口 listen 8000; listen *:8000; listen localhost:8000;
如果服务器使用IPv6地址,那么可以这样使用:
listen [::]:8000; listen [fe80::1]; listen [:::a8c9:1234]:80;
在地址和端口后,还可以加上其他参数,例如:
listen 443 default_server ssl; listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
下面说明listen可用参数的意义。
default:将所在的server块作为整个Web服务的默认server块。如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块。为什么需要默认虚拟主机呢?当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机。
default_server:同上。
backlog=num:表示TCP中backlog队列的大小。默认为�C1,表示不予设置。在TCP建立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会建立连接失败。
rcvbuf=size:设置监听句柄的SO_RCVBUF参数。
sndbuf=size:设置监听句柄的SO_SNDBUF 参数。
accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。
deferred:在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手,内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。这个参数适用于大并发的情况下,它减轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配置。
bind:绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时才会生效。
ssl:在当前监听的端口上建立的连接必须基于SSL协议。
[2] 主机名称
语法:server_name name [...];
默认:server_name "";
配置块:server
说明:
server_name后可以跟多个主机名称,如server_name www.testweb.com、download.testweb.com;。
在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。server_name与Host的匹配优先级如下:
1)首先选择所有字符串完全匹配的server_name,如www.testweb.com。
2)其次选择通配符在前面的server_name,如*.testweb.com。
3)再次选择通配符在后面的server_name,如www.testweb.*。
4)最后选择使用正则表达式才匹配的server_name,如~^\.testweb\.com$。
实际上,这个规则正是7.7节中介绍的带通配符散列表的实现依据,同时如果Host与所有的server_name都不匹配,这时将会按下列顺序选择处理的server块。
5)优先选择在listen配置项后加入[default | default_server]的server块。
6)找到匹配listen端口的第一个server块。
[3] 重定向主机名称的处理
语法:server_name_in_redirect on | off;
默认:server_name_in_redirect on;
配置块:http、server或者location
该配置需要配合server_name使用。在使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部,而使用off关闭时,表示在重定向请求时使用请求本身的Host头部。
[4] location用法
语法:location 【 =|^~|~*|~|@]|/uri/ { ... 】
配置块:server
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location {}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location的匹配规则。如下为一个location参考案例
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] }
location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] }
location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] }
location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] }
location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] }
location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] }
location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] }
location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] }
location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] }
location ~* /js/.*/\.js
location参数说明
参数值 | 表示的含义 |
= |
表示把URI作为字符串,以便与参数中的uri做完全匹配,即精确匹配 |
^~ |
表示匹配URI时只需要其前半部分与uri参数匹配即可 |
~ | 表示匹配URI时注意字母大小写问题。 |
~* | 表示匹配URI时忽略字母大小写问题。 |
!~ | 表示区分大小写不匹配 |
!~* | 表示不区分大小写不匹配 |
@ | 表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求。 |
location的匹配优先级
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
关于nginx location选项配置,后面我们还会详细讲到,这里只是大致讲到一些常见的配置参数,在下一小节我们会讲到关于nginx的文件路径的定义。