zoukankan      html  css  js  c++  java
  • 【转载】《理解Nginx源码》-Nginx配置文件

    目录

    -------------------------------------------------------------

    https://www.kancloud.cn/digest/understandingnginx/202587

    本文转自上述专栏文章《理解Nginx源码》之Nginx配置文件

    -------------------------------------------------------------

    概述

    Nginx 是使用一个 master 进程来管理多个 worker 进程提供服务。master 负责管理 worker 进程,而 worker 进程则提供真正的客户服务,worker 进程的数量一般跟服务器上 CPU 的核心数相同,worker 之间通过一些进程间通信机制实现负载均衡等功能。Nginx 进程之间的关系可由下图表示:

    Nginx 服务启动时会读入配置文件,后续的行为则按照配置文件中的指令进行。Nginx 的配置文件是纯文本文件,默认安装 Nginx 后,其配置文件均在 /usr/local/nginx/conf/ 目录下。其中,nginx.conf  为主配置文件。配置文件中以 # 开始的行,或者是前面有若干空格或者 TAB 键,然后再跟 # 的行,都被认为是注释。这里只是了解主配置文件的结构。

    Nginx 配置文件是以 block(块)形式组织,每个 block 都是以一个块名字和一对大括号 “{}” 表示组成,block 分为几个层级,整个配置文件为 main 层级,即最大的层级;在 main 层级下可以有 event、http 、mail 等层级,而 http 中又会有 server block,server block中可以包含 location block。即块之间是可以嵌套的,内层块继承外层块。最基本的配置项语法格式是“配置项名  配置项值1  配置项值2  配置项值3  ... ”;

    每个层级可以有自己的指令(Directive),例如 worker_processes 是一个main层级指令,它指定 Nginx 服务的 Worker 进程数量。有的指令只能在一个层级中配置,如worker_processes 只能存在于 main 中,而有的指令可以存在于多个层级,在这种情况下,子 block 会继承 父 block 的配置,同时如果子block配置了与父block不同的指令,则会覆盖掉父 block 的配置。指令的格式是“指令名 参数1 参数2 … 参数N;”,注意参数间可用任意数量空格分隔,最后要加分号。

    下图是 Nginx 配置文件通常结构图示。

    Nginx 服务的基本配置项

    Nginx 服务运行时,需要加载几个核心模块和一个事件模块,这些模块运行时所支持的配置项称为基本配置;基本配置项大概可分为以下四类:

    • 用于调试、定位的配置项;

    • 正常运行的必备配置项;

    • 优化性能的配置项;

    • 事件类配置项;

    各个配置项的具体实现如下:

    /* Nginx 服务基本配置项 */
    
    /* 用于调试、定位的配置项 */
    
    #以守护进程 Nginx 运行方式
    #语法:daemon off | on;
    #默认:daemon on;
    
    #master / worker 工作方式
    #语法:master_process on | off;
    #默认:master_process on;
    
    #error 日志设置
    #                   路径        错误级别
    #语法:error_log    /path/file  level;
    #默认:error_log    logs/error.log  error;
    #其中/path/file是一个具体文件;level是日志的输出级别,其取值如下:
    #   debug info notice warn error crit alert emerg
    #从左至右级别增大;若设定一个级别后,则在输出的日志文件中只输出级别大于或等于已设定的级别;
    
    #处理特殊调试点
    #语法:debug_points [stop | abort]
    #这个设置是来跟踪调试 Nginx 的;
    
    #仅对指定的客户端输出 debug 级别的日志
    #语法:debug_connection [IP | DIR]
    
    #限制 coredump 核心转储文件的大小
    #语法:worker_rlimit_core   size;
    
    #指定 coredump 文件的生成目录
    #语法:working_directory    path;
    
    /* 正常运行的配置项 */
    
    #定义环境变量
    #语法:env  VAR | VAR=VALUE;
    #VAR 是变量名,VALUE 是目录;
    
    #嵌入其他配置文件
    #语法:include  /path/file;
    #include 配置项可以将其他配置文件嵌入到 Nginx 的 nginx.conf 文件中;
    
    #pid 的文件路径
    #语法:pid  path/file;
    #默认:pid  logs/nginx.pid;
    #保存 master 进程 ID 的 pid 文件存放路径;
    
    #Nginx worker 运行的用户及用户组
    #语法:user username    [groupname];
    #默认:user nobody nobody;
    
    #指定 Nginx worker进程可打开最大句柄个数
    #语法:worker_rlimit_nofile limit;
    
    #限制信号队列
    #语法:worker_rlimit_sigpending limit;
    #设置每个用户发给 Nginx 的信号队列大小,超出则丢弃;
    
    /* 优化性能配置项 */
    
    #Nginx worker 进程的个数
    #语法:worker_process   number;
    #默认:worker_process   1;
    
    #绑定 Nginx worker 进程到指定的 CPU 内核
    #语法:worker_cpu_affinity  cpumask [cpumask...]
    
    #SSL 硬件加速
    #语法:ssl_engine   device;
    
    #系统调用 gettimeofday 的执行频率
    #语法:timer_resolution t;
    
    #Nginx worker 进程优先级设置
    #语法:worker_priority  nice;
    #默认:worker_priority  0;
    
    /* 事件类配置项  */
    #一般有以下几种配置:
    #1、是否打开accept锁
    #   语法格式:accept_mutex [on | off];
    
    #2、lock文件的路径
    #   语法格式:lock_file  path/file;
    
    #3、使用accept锁后到真正建立连接之间的延迟时间
    #   语法格式:accept_mutex_delay Nms;
    
    #4、批量建立新连接
    #   语法格式:multi_accept [on | off];
    #
    #5、选择事件模型
    #   语法格式:use [kqueue | rtisg | epoll | /dev/poll | select | poll | eventport];
    
    #6、每个worker进行的最大连接数
    #   语法格式:worker_connections number;

    HTTP 核心模块的配置

    具体可以参看《Nginx 中 HTTP 核心模块配置

    /* HTTP 核心模块配置的功能 */
    
    /* 虚拟主机与请求分发 */
    
    #监听端口
    #语法:listen   address:port[default | default_server | [backlong=num | rcvbuf=size | sndbuf=size | 
    # accept_filter | deferred | bind | ipv6only=[on | off] | ssl]];
    # 默认:listen:80;
    # 说明:
    #   default或default_server:将所在的server块作为web服务的默认server块;当请求无法匹配配置文件中的所有主机名时,就会选择默认的虚拟主机;
    #   backlog=num:表示 TCP 中backlog队列存放TCP新连接请求的大小,默认是-1,表示不予设置;
    #   rcvbuf=size:设置监听句柄SO_RCVBUF的参数;
    #   sndbuf=size:设置监听句柄SO_SNDBUF的参数;
    #   accept_filter:设置accept过滤器,只对FreeBSD操作系统有用;
    #   deferred:设置该参数后,若用户发起TCP连接请求,并且完成TCP三次握手,但是若用户没有发送数据,则不会唤醒worker进程,直到发送数据;
    #   bind:绑定当前端口 / 地址对,只有同时对一个端口监听多个地址时才会生效;
    #   ssl:在当前端口建立的连接必须基于ssl协议;
    #配置块范围:server
    
    #主机名称
    #语法:server_name  name[...];
    #默认:server_name  "";
    #配置块范围:server
    
    #server name 是使用散列表存储的
    #每个散列桶占用内存大小
    #语法:server_names_hash_bucket_size    size;
    #默认:server_names_hash_bucker_size    32|64|128;
    #
    #散列表最大bucket数量
    #语法:server_names_hash_max_size   size;
    #默认:server_names_hash_max_size   512;
    #默认:server_name_in_redirect  on;
    #配置块范围:server、http、location
    
    #处理重定向主机名
    #语法:server_name_in_redirect  on | off;
    #默认:server_name_in_redirect  on;
    #配置块范围:server、http、location
    
    #location语法:location[= | ~ | ~* | ^~ | @] /uri/ {}  
    #配置块范围:server
            #location尝试根据用户请求中的URI来匹配 /uri表达式,若匹配成功,则执行{}里面的配置来处理用户请求  
    #以下是location的一般配置项  
    #1、以root方式设置资源路径  
    #   语法格式:root path;  
    #2、以alias方式设置资源路径  
    #   语法格式:alias path;  
    #3、访问首页  
    #   语法格式:index file...;  
    #4、根据HTTP返回码重定向页面  
    #   语法格式:error_page code [code...] [= | =answer-code] uri | @named_location;  
    #5、是否允许递归使用error_page  
    #   语法格式:recursive_error_pages [on | off];  
    #6、try_files  
    #   语法格式:try_files path1 [path2] uri;  
    
    /* 文件路径的定义 */
    
    #root方式设置资源路径
    #语法:root path;
    #默认:root html;
    #配置块范围:server、http、location、if
    
    #以alias方式设置资源路径
    #语法:alias path;
    #配置块范围:location
    
    #访问主页
    #语法:index    file...;
    #默认:index    index.html;
    #配置块范围:http、server、location
    
    #根据HTTP返回码重定向页面  
    #   语法:error_page code [code...] [= | =answer-code] uri | @named_location;  
    #配置块范围:server、http、location、if
    
    #是否允许递归使用error_page  
    #   语法:recursive_error_pages [on | off];  
    #配置块范围:http、server、location
    
    #try_files  
    #   语法:try_files path1 [path2] uri;  
    #配置块范围:server、location
    
    /* 内存及磁盘资源分配 */
    
    # HTTP 包体只存储在磁盘文件中
    # 语法:client_body_in_file_only    on | clean | off;
    # 默认:client_body_in_file_only  off;
    # 配置块范围:http、server、location
    
    # HTTP 包体尽量写入到一个内存buffer中
    # 语法:client_body_single_buffer   on | off;
    # 默认:client_body_single_buffer   off;
    # 配置块范围:http、server、location
    
    # 存储 HTTP 头部的内存buffer大小
    # 语法:client_header_buffer_size   size;
    # 默认:client_header_buffer_size   1k;
    # 配置块范围:http、server
    
    # 存储超大 HTTP 头部的内存buffer大小
    # 语法:large_client_header_buffer_size   number    size;
    # 默认:large_client_header_buffer_size   4   8k;
    # 配置块范围:http、server
    
    # 存储 HTTP 包体的内存buffer大小
    # 语法:client_body_buffer_size   size;
    # 默认:client_body_buffer_size   8k/16k;
    # 配置块范围:http、server、location
    
    # HTTP 包体的临时存放目录
    # 语法:client_body_temp_path   dir-path    [level1 [level2 [level3]]];
    # 默认:client_body_temp_path   client_body_temp;
    # 配置块范围:http、server、location
    
    # 存储 TCP 成功建立连接的内存池大小
    # 语法:connection_pool_size    size;
    # 默认:connection_pool_size    256;
    # 配置块范围:http、server
    
    # 存储 TCP 请求连接的内存池大小
    # 语法:request_pool_size    size;
    # 默认:request_pool_size    4k;
    # 配置块范围:http、server
    
    /* 网络连接设置 */
    
    # 读取 HTTP 头部的超时时间
    # 语法:client_header_timeout   time;
    # 默认:client_header_timeout   60;
    # 配置块范围:http、server、location
    
    # 读取 HTTP 包体的超时时间
    # 语法:client_body_timeout   time;
    # 默认:client_body_timeout   60;
    # 配置块范围:http、server、location
    
    # 发送响应的超时时间
    # 语法:send_timeout   time;
    # 默认:send_timeout   60;
    # 配置块范围:http、server、location
    
    # TCP 连接的超时重置
    # 语法:reset_timeout_connection   on | off;
    # 默认:reset_timeout_connection   off;
    # 配置块范围:http、server、location
    
    # 控制关闭 TCP 连接的方式
    # 语法:lingering_close off | on | always;
    # 默认:lingering_close on;
    # 配置块范围:http、server、location
    # always 表示关闭连接之前无条件处理连接上所有用户数据;
    # off 表示不处理;on 一般会处理;
    
    # lingering_time
    # 语法:lingering_time   time;
    # 默认:lingering_time   30s;
    # 配置块范围:http、server、location
    
    # lingering_timeout
    # 语法:lingering_timeout   time;
    # 默认:lingering_time   5s;
    # 配置块范围:http、server、location
    
    # 对某些浏览器禁止keepalive功能
    # 语法:keepalive_disable   [mise6 | safari | none]...
    # 默认:keepalive_disable   mise6  safari;
    # 配置块范围:http、server、location
    
    # keepalive超时时间
    # 语法:keepalive_timeout   time;
    # 默认:keepalive_timeout   75;
    # 配置块范围:http、server、location
    
    # keepalive长连接上允许最大请求数
    # 语法:keepalive_requests  n;
    # 默认:keepalive_requests  100;
    # 配置块范围:http、server、location
    
    # tcp_nodelay
    # 语法:tcp_nodelay on | off;
    # 默认:tcp_nodelay on;
    # 配置块范围:http、server、location
    
    # tcp_nopush
    # 语法:tcp_nopush on | off;
    # 默认:tcp_nopush off;
    # 配置块范围:http、server、location
    
    /* MIME 类型设置 */
    
    # MIME type 与文件扩展的映射
    # 语法:type{...}
    # 配置块范围:http、server、location
    # 多个扩展名可映射到同一个 MIME type
    
    # 默认 MIME type
    # 语法:default_type    MIME-type;
    # 默认:default_type    text/plain;
    # 配置块范围:http、server、location
    
    # type_hash_bucket_size
    # 语法:type_hash_bucket_size   size;
    # 默认:type_hash_bucket_size   32 | 64 | 128;
    # 配置块范围:http、server、location
    
    # type_hash_max_size
    # 语法:type_hash_max_size   size;
    # 默认:type_hash_max_size   1024;
    # 配置块范围:http、server、location
    
    /* 限制客户端请求 */
    
    # 按 HTTP 方法名限制用户请求
    # 语法:limit_except    method...{...}
    # 配置块:location
    # method 的取值如下:
    # GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、
    # PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH
    
    # HTTP 请求包体的最大值
    # 语法:client_max_body_size    size;
    # 默认:client_max_body_size    1m;
    # 配置块范围:http、server、location
    
    # 对请求限制速度
    # 语法:limit_rate  speed;
    # 默认:limit_rate  0;
    # 配置块范围:http、server、location、if
    # 0 表示不限速
    
    # limit_rate_after规定时间后限速
    # 语法:limit_rate_after  time;
    # 默认:limit_rate_after    1m;
    # 配置块范围:http、server、location、if
    
    /* 文件操作的优化 */
    
    # sendfile系统调用
    # 语法:sendfile    on | off;
    # 默认:sendfile    off;
    # 配置块:http、server、location
    
    # AIO 系统调用
    # 语法:aio on | off;
    # 默认:aio off;
    # 配置块:http、server、location
    
    # directio
    # 语法:directio    size | off;
    # 默认:directio    off;
    # 配置块:http、server、location
    
    # directio_alignment
    # 语法:directio_alignment    size;
    # 默认:directio_alignment    512;
    # 配置块:http、server、location
    
    # 打开文件缓存
    # 语法:open_file_cache max=N [inactive=time] | off;
    # 默认:open_file_cache off;
    # 配置块:http、server、location
    
    # 是否缓存打开文件的错误信息
    # 语法:open_file_cache_errors  on | off;
    # 默认:open_file_cache_errors  off;
    # 配置块:http、server、location
    
    # 不被淘汰的最小访问次数
    # 语法:open_file_cache_min_user  number;
    # 默认:open_file_cache_min_user  1;
    # 配置块:http、server、location
    
    # 检验缓存中元素有效性的频率
    # 语法:open_file_cache_valid  time;
    # 默认:open_file_cache_valid  60s;
    # 配置块:http、server、location
    
    /* 客户请求的特殊处理 */
    
    # 忽略不合法的 HTTP 头部
    # 语法:ignore_invalid_headers  on | off;
    # 默认:ignore_invalid_headers  on;
    # 配置块:http、server
    
    # HTTP 头部是否允许下划线
    # 语法:underscores_in_headers  on | off;
    # 默认:underscores_in_headers  off;
    # 配置块:http、server
    
    # If_Modified_Since 头部的处理策略
    # 语法:if_modified_since   [off | exact | before]
    # 默认:if_modified_since   exact;
    # 配置块:http、server、location
    
    # 文件未找到时是否记录到error日志
    # 语法:log_not_found   on | off;
    # 默认:log_not_found   on;
    # 配置块:http、server、location
    
    # 是否合并相邻的“/”
    # 语法:merge_slashes   on | off;
    # 默认:merge_slashes   on;
    # 配置块:http、server、location
    
    # DNS解析地址
    # 语法:resolver    address...;
    # 配置块:http、server、location
    
    # DNS解析的超时时间
    # 语法:resolver_timeout    time;
    # 默认:resolver_timeout    30s;
    # 配置块:http、server、location
    
    # 返回错误页面是否在server中注明Nginx版本
    # 语法:server_tokens   on | off;
    # 默认:server_tokens   on;
    # 配置块:http、server、location
  • 相关阅读:
    redis liunx安装
    db2实现每条数据累加
    js实现目录链接,内容跟着目录滚动显示
    Anaconda3安装过程中遇到“Anaconda3-5.1.0-Linux-x86_64.sh:行350: bunzip2: 未找到命令 tar: 它似乎不像是一个 tar 归档文件 tar: 由于前次错误,将以上次的错误状态退出”
    java axis2生成wsdl
    java axis2解析xml(wsdl返回List数据Map<String,Object>
    java axis2解析xml(wsdl返回List数据Map<String,String>
    java axis2解析xml(wsdl返回List数据)
    jquery 合并单元格,rowspan
    poi导出excel
  • 原文地址:https://www.cnblogs.com/yeyang/p/12580757.html
Copyright © 2011-2022 走看看