Nginx专题(2) - 配置

本文最后更新于:2021年7月16日 早上

本文内容大量参考了 “陶辉《深入理解Nginx:模块开发与架构解析》第2版”,如果觉得本文对你有帮助,请购买陶辉的正版书籍支持!

Nginx配置文件

Nginx在线可视化配置工具

Vim高亮插件

安装插件,使Vim能够在编辑Nginx配置文件时有一定高亮功能。

下载nginx.vim

1
2
cd /usr/share/vim/vim81/syntax  # 进入目录,注意vim81替换成自己vim对应版本的目录
wget -O nginx.vim https://vim.sourceforge.io/scripts/download_script.php?src_id=19394 # 下载

配置filetype.vim

编辑filetype.vim文件来注册Nginx语法文件

1
vim /usr/share/vim/vim81/filetype.vim

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
2
3
4
5
listen 127.0.0.1:8000;
listen 127.0.0.1; # 注意:不加端口时,默认监听80端口
listen 8000;
listen *:8000;
listen localhost:8000;

如果服务器使用IPv6地址,那么可以这样使用:

1
2
3
listen [::]:8000;
listen [fe80::1];
listen [:::a8c9:1234]:80;

在地址和端口后,还可以加上其他参数,例如:

1
2
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协议。

主机名称

语法: server_name name [...];

默认: server_name "";

配置块:server

server_name后可以跟多个主机名称,如server_name www.testweb.comdownload.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
2
3
location /download/ {
root /opt/web/html/;
}

在上面的配置中,如果有一个请求的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
2
3
location /conf {
alias /usr/local/nginx/conf/;
}

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
2
3
4
5
6
types {
text/html html;
text/html conf;
image/gif gif;
image/jepg jpg;
}

默认 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
2
3
4
limit_except GET {
allow 192.168.1.0/32;
deny all;
}

注意,允许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
2
3
4
5
server {
if ($slow) {
set $limit_rate 4k;
}
}

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版

Nginx —— nginx服务的基本配置(nginx.conf文件的详解)-CSDN -杰儿__er

Nginx配置文件(nginx.conf)配置详解


Nginx专题(2) - 配置
https://muzing.top/posts/65b14ed2/
作者
muzing
发布于
2021年4月8日
更新于
2021年7月16日
许可协议