您的位置:首页 > 运维架构 > Nginx

Nginx基础入门之nginx基础配置项介绍(2)

2015-12-25 18:13 811 查看
前面我们讲到关于nginx配置文件(nginx.conf)运行,工作模式,及相关调试的等等配置语法,本小节我们将会讲到怎么去配置一个基本的web,以及相关配置项的定义,虚移主机以及请求的分发的语法配置,即怎么样构建一个完整的web server 区域。
一.怎么使用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队列的大小。默认为–1,表示不予设置。在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 部分起始路径) > (/)

本文出自 “菜鸟的成长记” 博客,请务必保留此出处http://blief.blog.51cto.com/6170059/1728377
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: