Nginx专题(2) - 配置
本文最后更新于 2021年7月16日 下午
本文内容大量参考了 “陶辉《深入理解Nginx:模块开发与架构解析》第2版”,如果觉得本文对你有帮助,请购买陶辉的正版书籍支持!
Nginx配置文件
Vim高亮插件
安装插件,使Vim能够在编辑Nginx配置文件时有一定高亮功能。
下载nginx.vim
1 |
|
配置filetype.vim
编辑filetype.vim文件来注册Nginx语法文件
1 |
|
nginx.conf
在nginx文件夹下可以找到nginx.conf配置文件,进行的主要配置都是在这里进行
nginx.conf 大致分为三个块:全局块、enents块、http块
HTTP核心模块
通过对HTTP模块的一些配置,就可以实现一个简单的静态Web服务器
虚拟主机与请求的分发(server块)
在http块中可以有多个server块,每个server块就是一个虚拟主机(站点)
由于IP地址的数量有限,经常存在多个主机域名对应着同一个IP地址的情况,这时在nginx.conf中就可以按照server_name(用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。
监听端口
语法: listen address:port[ default(deprecated in 0.8.21)| default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|of] | ssl]];
默认: listen 80;
配置块:server
listen参数决定Nginx服务如何监听端口。在listen后可以只加IP地址、端口或主机名,非常灵活,例如:
1 |
|
如果服务器使用IPv6地址,那么可以这样使用:
1 |
|
在地址和端口后,还可以加上其他参数,例如:
1 |
|
下面说明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协议。
主机名称
语法: 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块。
Location 匹配
匹配规则
修饰符 | 含义 |
---|---|
= | 精确匹配 |
~ | 区分大小写的正则匹配 |
~* | 不区分大小写的正则匹配 |
^~ | 最佳匹配 |
空 | 匹配以 url 开头的字符串,只能是普通字符串 |
匹配优先级
文件路径的定义
root方式
语法: root path;
默认: root html;
配置块: http、server、location、if
例如,定义资源文件相对于HTTP请求的根目录。
1 |
|
在上面的配置中,如果有一个请求的URI是 /download/index/test.html
,那么Web服务器将会返回服务器上/opt/web/html/download/index/test.html
文件的内容。
alias方式
语法: alias path;
配置块: location
alias也是用来设置文件资源路径的,与root的不同点主要在于如何解读紧跟location后面的uri参数,这会使alias与root以不同方式将用户请求映射到真正的磁盘文件上。
例如,如果有一个请求的URI是/conf/nginx.conf
,而用户实际想访问的文件在/usr/local/nginx/conf/nginx.conf
,那么想要使用alias来进行设置的话,可以采用如下方式:
1 |
|
index方式访问首页
内存及磁盘资源的分配
HTTP包体只存储到磁盘文件中
语法: client_body_in_file_only on|clean|off;
默认: client_body_in_file_only off;
配置块: http、server、location
当值为非off时,用户请求中的HTTP包体一律存储到磁盘文件中,即使只有0字节也会存储为文件。当请求结束时,如果配置为on,则这个文件不会被删除(该配置一般用于调试、定位问题),但如果配置为clean,则会删除该文件。
HTTP包尽量写入到一个内存buffer中
存储HTTP头部的内存buffer大小
存储超大HTTP头部的内存buffer大小
网络连接的设置
MIME类型的设置
MIME type与文件扩展的映射
语法: type{…};
配置块: http、server、location
定义MIME type到文件扩展名的映射。多个扩展名可以映射到同一个MIME type。例如:
1 |
|
默认 MIME type
语法: default_type MIME-type;
默认: default_type text/plain;
配置块: http、server、location
当找不到对应的 MIME type与文件扩展名之间的映射时,使用默认的MIME type作为HTTP header中的Content-Type。
types_hash_bucket_size
语法: types_hash_bucket_size size;
默认: types_hash_bucket_size 32|64|128;
为了快速找到相应 MIME type,Nginx使用散列表来存储 MIME type与文件扩展名。此项设置了每个散列桶占用的内存大小。
types_hash_max_size
语法: types_hash_max_size size;
默认: types_hash_max_size 1024;
配置块: http、server、location
此项影响散列表的冲突率。值越大,消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。
对客户端请求的限制
按HTTP方法名限制用户请求
语法: limit_except method ... {...}
配置块: location
Nginx通过limit_except后面指定的方法名来限制用户请求。方法名可取值包括:GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH LOCK UNLOCK 或者PATCH。例如:
1 |
|
注意,允许GET方法也就意味着允许HEAD方法。因此上面这段代码表示的是禁止GET方法和HEAD方法,但其他方法是允许的。
HTTP请求包体的最大值
语法: client_max_body_size size;
默认:client_max_body_size 1m;
配置块:http、server、location
浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,这项就是用来限制其所示值大小的。这个限制包体大小的配置非常有用,不用等Nginx接收完所有的HTTP包——这有可能消耗很长时间——就可以告诉用户请求过大不被接受。
对请求的限速
语法: limit_rate speed;
默认: limit_rate 0;
配置块:http、server、location、if
此配置项是对客户端请求限制每秒传输的字节数。speed默认参数为0,表示不限速。
针对不同的客户端,可用$limit_rate
参数执行不同的限速策略。例如:
1 |
|
limit_rate_after
此配置项表示Nginx向客户端发送的响应长度超过limit_rate_after
之后才开始限速。
文件操作的优化
sendfile 系统调用
语法: sendfile on | off;
默认: sendfile off;
配置块: http、server、location
可以启用Linux上的sendfile系统调用来发送文件,它减少了内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。
AIO 系统调用
语法: aio on | off;
默认: aio off;
配置块: http、server、location
此配置项表示是否在FreeBSD或Linux系统上启用内核级别的异步文件I/O功能。注意,它与sendfile功能是互斥的。
directio
对客户端请求的特殊处理
参考文档
陶辉《深入理解Nginx:模块开发与架构解析》第2版