搭建高性能web服务器之Nginx安装与配置(2.9)



  前面我们讲到关于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的文件路径的定义。






你可能感兴趣的:(server,服务器,localhost,配置文件,listen)