学而实习之 不亦乐乎

Nginx 基础配置(一):基础配置说明

2021-11-15 08:34:29

一、Nginx 指令和指令块

如下模板示例:

Main 1;
events {}
http {
	Main 2;
	server {
		Main 3;
		location {}
	}
	
	server {
		Main 3;
		location {}
	}
}

从上看出主要包含两种指令:
1.简单指令:由名称和参数组成,空格分隔,分号结尾。如上面的 Main 1、Main 2、Main 3。
2.指令块:由名称和 大括号{} 及其内部的附加指令组成,不以分号结尾。

二、基本配置说明

根据(一)中的模板可以将配置中的参数分为以下几块:

1.全局参数

在http之前的是全局参数,如(一)中的 Main1 ,全局参数对整个 Nginx 块都产生作用。

2.与客户端有关的配置

与客户端有关的配置主要在 http 块中设置,如(一)中的 Main2 ,其作用是处理与客户端相关的信息。客户端常用指令如下:

指令    说明
fastcgi_buffers    设置读取fastcgi缓冲区个数和大小。
fastcgi_buffer_size    设置服务fastcgi收个缓冲区的大小。

client_body_buffer_size    设置读取客户端请求体的缓冲区大小。如果请求体的大小大于缓冲区的大小,则整个或一部分请求体会被写入临时文件。在默认的情况下,会为32位系统和x86-64系统设置8KB的缓冲区,其他64位系统为16KB的缓冲区
client_body_temp_path    定义存储客户端请求体的临时文件目录,最多可以定义3个子集目录
client_body_timeout    定义定义读取客户端请求的超时时间,即两个连续的读操作之间的时间间隔。如果超时HTTP会抛出408错误。
client_header_buffer_size    设置客户端请求头的缓冲区大小,默认为1KB
client_max_body_size    设置客户端请求的最大主体的大小,默认为1MB
client_header_timeout    设置客户端请求头的超时时间
etag    如果设置为on,表示静态资源自动生成ETag响应头
large_client_header_buffers    设置大型客户端请求头的缓冲区大小
keepalive_timeout    设置连接超时时间。服务器将在超过超时时间后关闭HTTP连接
send_timeout    指定客户端的响应超时时间
server_names_hash_bucket_size    设置server_names(Nginx中配置的全部域名)散列表的桶的大小,默认值取决于处理器缓存行的大小
server_names_hash_max_size    设置server_names散列表的最大值
server_tokens    启动或禁用在错误页面和服务器响应头字段中标识的nginx版本
toc_nodelay    启用或禁用TCP_NODELAY选项。只有当连接保持活动时,才会被启用
tcp_nopush    仅当sendfile时使用,能够将响应头和正文的开始部分一起发送

很多指令可以出现在多个模块,但也有的指令只能出现在特定的模块,如 server_names_hash_bucket_size 只能出现在 http 块中。

3.server块

虚拟主机部分,如果请求中的 Host 头和 server_name 相匹配,则将请求指向对应的 Server 块。

server_name 支持使用通配符正则表达式,支持多域名、服务名称。当有多个 server 块时,会存在匹配优先级问题,优先级顺序如下:

[1]精确匹配名称。
[2]以*开头的最长通配符名称,如*.test.com。
[3]以*结尾的最长通配符名称,如www.test.*。
[4]按文件顺序,第一个匹配到的正则表达式,如~^\.www\.test\.com$。
[5]如果没有匹配到对应的 server,则会访问 default_server。或者匹配listen端口的第一个server块。

4.location块

location 块在 server 块中使用,它的作用是根据客户端请求 URL 去定位不同的应用。也就是当服务器接收到客户端请求之后,需要在服务器端指定目录中去寻找客户端所请求的资源。

location 匹配规则说明

location = /uri          # =表示精确匹配
location ^~ /uri         # ^~匹配以某个 URL 前缀开头的请求,不支持正则表达式。
location ~              # ~区分大小写的匹配,属于正则匹配,
location ~*               # ~*不区分大小写的匹配,属于正则匹配
location /uri              # 表示前缀匹配,不带修饰符,但是优先级没有正则表达式高。
location /              # 通用匹配,默认找不到其他匹配时,会进行通用匹配。
location @                 # 命名空间,不提供常规的请求匹配。"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

匹配的优先级如下:

“=” 的优先级最高。一旦匹配成功,则不再查找其他匹配项;如果匹配不到,会和 “^~” 进行匹配。若 “^~” 类型表达式匹配成功,则不再查找其他匹配项。然后是 “~”,如果有多个 “~”,则按照在文件里的先后顺序进行匹配。如果还是匹配不到,则与 “/uri” 进行匹配;通用匹配 “/” 的优先级最低,如果找不到其他配置,就会进行通用匹配;“@” 表示命名空间的位置,通常在重定向时进行匹配,且不会改变 URL 的原始请求。

location 也支持嵌套配置,如:

location /a {
    location /a {
        [ configuration A]
    }

    location /a/b {
        [ configuration AB]
    }
}

有些指令只能在 location 块中执行,主要有如下 3 个:
internal:表示该 location 块只支持 Nginx 内部的请求访问,如支持 rewrite,error_page等重定向,但不能通过外部的 HTTP 直接访问。
limit_except:限定该 location 块可以执行的 HTTP 方法,如 GET。
alias:定义指定位置的替换,如下:

location /a/ {
    alias /c/x/a/;
}

上述配置表示如果匹配到 /a/test.html 的请求时,在进入 location 块后,会将请求变成 /c/x/a/test.html 。

三、include 的使用

include 用来指定主配置文件包含的其他扩展配置文件。扩展文件的内容也要符合 Nginx 的格式规范。 include 可以简化主配置文件,使之更易于读取。 include 可以出现在全局参数、 location 块、 server 块等任何一个位置。

include 支持通配符,如下:

include /usr/local/nginx/conf/vhost/*.conf;