美文网首页
配置指南

配置指南

作者: zdxhxh | 来源:发表于2020-08-18 22:55 被阅读0次

配置指南

接下来我们学习有关 Nginx 的配置

基本配置格式

Nginx 的配置文件由若干个部分组成,每一个部分都是按照下面这样定义的。

<section> {
    <directive> <paramters>;
}

需要注意的是每一个指令都由行;结束,{}代表一个新的上下文。

一、全局配置

全局配置部分对整个 server 都有效,全局部分包含配置指令,例如userworker_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块中。

虚拟服务器应该由 listenserver_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; 
}

相关文章

网友评论

      本文标题:配置指南

      本文链接:https://www.haomeiwen.com/subject/veeljktx.html