配置指南
配置指南
接下来我们学习有关 Nginx 的配置
基本配置格式
Nginx 的配置文件由若干个部分组成,每一个部分都是按照下面这样定义的。
<section> {
<directive> <paramters>;
}
需要注意的是每一个指令都由行;
结束,{}
代表一个新的上下文。
一、全局配置
全局配置部分对整个 server 都有效,全局部分包含配置指令,例如user
和worker_processes
,也包括各种各样的节<section>
,配置如下 :
指令 | 说明 |
---|---|
user | 配置 worker 进程的用户与组,如果忽略 group,那么 group 的名字等于该参数指定的用户和用户组 |
worker_processes | 指定 worker 进程的启动数量,这些进程用于处理客户的链接,该数量取决于服务器环境、磁盘子系统和网络基础设施。例如与 cpu 绑定的负载核心数量相同,并用1.5~2 之间乘以这个数作为I/O 密集型负载 |
error_log | 错误写入文件,如果在其他区段没有这个参数,则这个日志文件将会记载所有的错误记录,错误记录级别有(debug、info、notice、warn、error、crit、alert、emerg) |
pid | 记录主进程的 pid,该参数可以覆盖编译时的默认配置 |
use | 用于使用怎么样的连接方法,该参数可以覆盖编译时的默认配置,需要配置一个 events 区段 |
worker_conections | 该指令用于配置一个工作进程能够接受并发的最大连接数,这个连接包括,客户连接和向上游服务器的连接等,对于反向代理服务器尤其重要,为了达到这个并发连接数量,还需要对操作系统作一定的调整 |
进入 Nginx 目录下conf
目录,编辑nginx.conf
,编辑成功后/usr/local/nginx/sbin/nginx -s reload
重启 Nginx
# worker 的进程启动数量
worker_processes 1;
# 错误日志存放地址
error_log /usr/local/nginx/logs/error.log;
# Nginx启动进程号,方便关闭进程
pid /usr/local/nginx/logs/nginx.pid;
events {
# 配置工作进程接受的最大并发数
worker_connections 1024;
}
二、Include
我们可以使用 include 指令将 Nginx 的配置模块导入,只有这些模块有正确的 Nginx 语法即可,例如我们将在conf
目录下创建blocks
,然后创建global.conf
文件,将上面内容写入。
然后使用
nginx -t -c global.conf
注意,如果你的nginx
不能使用,你可需要将它添加到环境变量中
vim /etc/profile
在最后一行添加
PATH=$PATH:/usr/local/nginx/sbin
export PATH
使配置立即生效
source /etc/profile
如果测试成功,则会打印
nginx: configuration file /usr/local/nginx/conf/blocks/global.conf test is successful
最后我们可以在nginx.conf
中配置
include /usr/local/nginx/conf/blocks/global.conf;
你也可以使用通配符使 nginx 自动匹配
include /usr/local/nginx/conf/blocks/*.conf;
三、Http server
Nginx 必须有 http 模块,你不能在编译的时候使用--without-http
接下来将关于 http 块的指令。这些指令都位置http
的块下
A. 客户端指令
为什么叫客户端指令,因为这些指令是处理客户端连接本身的各个房买你,以及不同类型的客户端
指令 | 说明 |
---|---|
chunked_transfer_encoding | 响应允许或禁用Http/1.1标准的块传输编码 |
client_body_buffer_size | 设置请求实体的缓冲区大小,如果实体超过该缓冲区大小,则完整主体将它的一部分写入临时文件。如果Nginx直接使用文件而不是缓冲区,则该指令会忽略,默认清清裤下,该指令为32位新系统设置8k,为64为系统设置16k,可以在http,server,location区块使用 |
client_body_in_file_only | 该指令禁用Nginx缓冲器并将请求体存储在临时文件中。该指令可以在http与location块使用,可选值可以为off 禁用文件写入(默认) 、clean 请求实体将写入磁盘,该文件会在处理请求后立即删除 、on 请求正文将写入文件,处理请求后,将不会删除文件
|
client_body_in_single_buffer | 设置请求实体存储在单个缓存区中,默认为off ,如果启用,他将优化请求实体变量涉及的I/O操作 |
client_body_temp_path | 保存客户端请求体的路径 |
client_body_timeout | 指定客户端发送请求实体的超时时间,如果在指定时间内没有发送任何内容,Nginx将返回HTTP 408(Request Timed Out) |
client_header_buffer_size | 为请求报文首部分配一个缓冲区,如果请求头大小大于指定的缓冲区,则可以使用large_client_header_buffer 指令分配更大的缓冲区 |
client_header_timeout | 指定客户端发送请求首部的超时时间 |
client_max_boddy_size | 默认为1M,表示允许请求报文实体的最大大小,在Content-Length 中指定,如果请求的正文数据大于该值,那么HTTP协议就会报413 Request Entity Too Large。 |
keepalive_disable | 对某些客户端禁用keep-alive齐请求功能 |
keepalive_requests | 定义在一个keep-alive关闭之前可以接受多少个请求 |
keepalive_timout | 指定keep-alive连结持续多久。第二个参数可以设置,用户在响应头中设置keep-alive 头 |
large_client_header_buffers | 定义最大数量和最大客户端请求头大小 |
msie_padding | 为了填充响应的大小至512字节,对于MSIE客户端,大于400的状态代码会添加注释以便于满足512字节,通过启用该命令可以禁止该行为 |
mise_refresh | 对于MSIE客户端,可启用发送一个refresh头,而不是重定向 |
附 : msie就是IE浏览器
B. 文件I/O指令
这些指令用于控制Nginx如果投递静态文件,以及如何管理文件
指令 | 说明 |
---|---|
aio | 启动异步文件I/O。该指令对于现代版本的FreeBSD和发布的Linux都有效 |
directio | 用于启动操作系统特定的标志或者功能,提供大于给定参数的文件,在linxu下使用aio时,需要该指令 |
directio_aignment | 设置directio的算法,默认值为512,通常足够,但在Linux下的XFS下推荐增加到4k |
open_file_cache | 配置一个缓存用于存放打开的文件描述符、目录查询和文件错误,启用该指令可以存储信息的缓存。例如打开的文件描述符和相关元数据、大小修改时间等。文件和目录的存在于查找相关的任何错误,例如权限被拒绝 |
open_file_cache_errors | 按照open_file_cache,启用文件查询错误缓存 |
open_file_cache_min_uses | open_file_cache 缓存的文件描述符保留在缓存中,使用该指令可以配置最少使用文件描述符的次数 |
open_file_cache_valid | 指定对open_file_cache缓存有效性检查的时间间隔 |
postpone_output | 指定Nginx发送给客户端的最小数值,如果可能,没有数据会发送,直到达到该值 |
read_ahead | 内核将预读文件到设定参数大小。目前支持FreeBSD和Linux |
sendfile | 使用sendfile直接复制数据从一个到另一个文件描述符 |
sendfile_max_chunk | 设置一个sendfile 拷贝最大数据的大小,这是为了阻止worker的贪婪 |
C. 哈希指令
hash指令控制Nginx分配给某些块多大的静态内存,在启动与重新配置时,Nginx会计算需要的最小值。在Nginx发出警告时,你只需要调整一个*_hash_max_size
指令的参数就可以达到效果。该指令用于满足多处理器缓存行,降低检索所需要的检索茶轴啊。因此不需要改变
指令 | 说明 |
---|---|
server_names_hash_bucket_size | 指定用于保存server_name(服务器名称)哈希表的大小 |
sever_names_hash_max_size | 指定server_name的哈希表的最大大小 |
types_hash_bucket_size | 指定存放哈希表的“桶"大小 |
types_hash_max_size | 指定哈希类型表的最大大小 |
variables_hash_bucket_size | 它指定用于存放保留变量"桶"的大小 |
variables_hash_max_size | 指定存放保留变量最大哈希值的大小 |
Nginx存在一个存储服务器名字的hash表,它由 server_names_hash_max_size 和 server_names_hash_bucket_size所控制,并且参数
hash_bucket_size
总是等于hash表的大小,而且是一个处理器缓存大小的倍数。在减少了内存中存取次数后,是处理器加速查找hash表成为可能,如果hash_bucket_size
等于一个处理器缓存的大小,那么查找键的时候,最坏的情况是在内存中查找两次,第一次用于确定存储单元的地址,第二次是在存储单元中找到键值。所以如果Nginx提示需要增大hash_max_size
或者hash_bucket_size
,那么主要考虑增加sever_names_hash_max_size
的大小
D. socket 指令
这些指令描述了Nginx如何设置创建TCP套接字的变量选项
指令 | 说明 |
---|---|
lingering_close | 指定如何保持客户端的连接,在nginx中,需要关闭连接时,并非立即关闭连接,而是先关闭TCP的连接,等待一段时候后,再关掉连接的读。因为有可能Nginx在执行关闭TCP连接时,有可能有一部分数据还在缓冲流中,当我们发送错误信息时,关闭了TCP连接,那么这个错误信息就没有发送到客户端了。 |
lingering_time | 使用lingering_close指令的连结中,使用该指令可以指定客户端连接为了处理更多的数据需要保持打开连接的时间 |
lingering_timeout | 结合linger_close,该指令显示Nginx在关闭客户端连接之前,为获取更多数据要等待多久 |
reset_timeout_connection | 使用这个指令,超时的连结会立即关闭,释放相关的内存。默认的状态是出于FIN_WAIT1 ,这种状态会一直保持连接 |
send_lowat | 如果非0,Nginx将会在客户端套接字尝试减少发送操作 |
send_timeout | 在两次成功的客户端接受响应的写操作之间设置一个超时时间 |
tcp_nodelay | 启用或者禁用TCP_NODELAY 选项,用于keep-alive 连结 |
tcp_nopush | 仅依赖于sendfile 使用,能够使Nginx在一个数据包中尝试发送响应头,以及在数据包中发送一个完整的文件 |
例如,下面给一个http配置部分的例子
http {
include /opt/local/etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
sever_names_hash_max_size 1024;
}
虚拟Server
任意使用关键字server
开始的部分我们称之为虚拟服务器,它根据server_name
指令将逻辑分开处理,这些虚拟服务器响应Http请求,因此它们应包含在http
块中。
虚拟服务器应该由 listen
和 server_name
指令组合定义,listen指令可以定义一个IP地址或者端口组合或者UNIX域套接字路径
listen address[:port];
listen port;
listen unix:path;
listen指令位而已表示了Nginx下的套接字(socket)绑定,此外还有一些可选参数
参数 | 说明 | 解释 |
---|---|---|
default_server | 定义个组合。address:port 默认的请求绑定在这里处理 | |
Setfib | 为套接字监听设置相应的FIB | 仅仅支持FreeBSD,不支持UNIX域套接字 |
backlog | 在listen()的调用设置backlog参数调用 | 在FreeBSD系统默认值为-1,其他系统为511 |
rcvbuf | 在套接字监听中设置SO_RCVBUF 参数 |
|
sndbuf | 在套接字监听中设置SO_SNDBUF 参数 |
|
accept_filter | 设置接收的过滤器 dataready或者httpread dataready | 仅支持FreeBSD |
deferred | 设置accept()调用 TCP_DEFER_ACCEPT | 仅支持linux |
bind | 为address:port套接字打开一个单独的bind()调用 | 热河套接字被调用,那么一个单端的bind()将会被隐式的调用 |
ipv6only | 设置IPV6_V6ONLY参数的值 | 只能在一个全新的开始设置,不支持UNIX域套接字 |
ssl | 表明该端口仅接受https的连结 | 允许更为紧凑的配置 |
so_keepalive | 为TCP监听套接字配置的keepalive |
server_name指令很简单,默认值为"",对于没有server_name的server,没有设置host头字段的请求将会匹配给该server处理,这种情况可以用于,例如,丢弃缺乏域名头的请求(IP地址直接请求),例如
server {
listen 80;
return 444;
}
使用444会使Nginx即关闭一个连接
除了普通字符串外, server_name
的参数还可以是通配符,例如
*.example.com
www.example.*
.example.com 匹配子域以及域本身
另外,还可以在域名前面加上波浪号~
输入正则表达式,例如
server_name ~^www\.example\.com$
server_name ~^www(\d+).example\.(com)$
// 后者使用`()`为字符片段,可以在后面的指令进一步配置($1 $2)
对于一个特定的请求,确定有那些虚拟服务器提供该请求的服务,应该遵循下面的逻辑 :
- 匹配 IP地址 和
listen
指令指定的端口 - 将Host头字段作为一个字符串匹配
server_name
指令 - 将Host头字段与
server_name
指令值字符串的开始部分作匹配 - 将 Host 头字段与
server_name
指令值进行正则匹配 - 如果所有的 Host 头匹配失败,那么转向 listen 指令标记 的 default_server
- 如果所有的 Host 头匹配失败,也没有default_server,应该有第一个sevre进行listen
最佳实践 : 推荐在
listen
中明确定义default_server
,例如 我们可以给Nginx设置默认服务器,并返回403。server{ listen 80 default_server; server_name _; return 403; }