闲不下来-nginx 配置文件(四)

1,194 阅读12分钟

闲不下来-nginx 配置文件

咱们都知道,nginx 架构采用一个 master 主进程管理多个 worker 进程,master 主要负责管理 worker 进程,就比如 leader 管理多个自己的手下,真正干事的就是自己的手下 worker。

worker 的线程一般和 cpu 的核数一致,为什么这么说呢?目的是防止切换进程带来的损耗,当然,worker 之间通过一些进程间通信机制实现负载均衡等功能。

nginx-master-eUOD0G

如上图,清晰明了...

咱们知道,Nginx 服务启动时会读入配置文件,后续的行为则按照配置文件中的配置进行。Nginx 的配置文件可以说是类似于 txt 纯文本文件。

默认安装 Nginx 后,其配置文件一般在/usr/local/nginx/conf目录下。其中,nginx.conf为主配置文件。配置文件以#开始的行,或者前面有若干空格或者 TAB 键,然后再跟``的行,都被认为是注释。这里只是了解主配置文件的结构。

关于 Nginx 的配置文件,但凡我们需要部署一些服务,需要用到它的反向代理、或者其他的功能的时候,不得不去接触它的配置文件,鄙人相信你肯定会查一下 nginx 的一些相关配置,让自己的服务完美运行。

我们讲一讲 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;”,注意参数间可用任意数量空格分隔,最后要加分号

我们看一下 block 层级图:

nginx-config-block-cd1KbV

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

  1. 用于调试、定位的配置项
  2. 正常运行的必备配置项
  3. 优化性能的配置项
  4. 事件类配置项

接下来,简单的看看各个模块的配置项:

配置项

nginx 服务基本配置项

  1. 以守护进程 Nginx 运行方式:
语法:daemon off | on;
默认:daemon on;
  1. error 日志设置:
                   路径        错误级别
语法:error_log    /path/file  level;
默认:error_log    logs/error.log  error;
其中/path/file是一个具体文件;level是日志的输出级别,其取值如下:
   debug info notice warn error crit alert emerg

从左至右级别增大;若设定一个级别后,则在输出的日志文件中只输出级别大于或等于已设定的级别;

  1. 处理特殊调试点:
语法:debug_points [stop | abort]
这个设置是来跟踪调试 Nginx 的;
  1. 仅对指定的客户端输出 debug 级别的日志:
语法:debug_connection [IP | DIR]
  1. 限制 coredump 核心转储文件的大小:
语法:worker_rlimit_core   size;
  1. 指定 coredump 文件的生成目录
语法:working_directory    path;

正常运行的配置项

  1. 定义环境变量
语法:env  VAR | VAR=VALUE;
VAR 是变量名,VALUE 是目录;
  1. 嵌入其他配置文件
语法:include  /path/file;
include 配置项可以将其他配置文件嵌入到 Nginx 的 nginx.conf 文件中;
  1. pid 的文件路径
语法:pid  path/file;
默认:pid  logs/nginx.pid;
保存 master 进程 ID 的 pid 文件存放路径;
  1. Nginx worker 运行的用户及用户组
语法:user username    [groupname];
默认:user nobody nobody;
  1. 指定 Nginx worker 进程可打开最大句柄个数
语法:worker_rlimit_nofile limit;
  1. 限制信号队列
语法:worker_rlimit_sigpending limit;
设置每个用户发给 Nginx 的信号队列大小,超出则丢弃;

优化性能配置项

  1. Nginx worker 进程的个数
语法:worker_process   number;
默认:worker_process   1;
  1. Nginx worker 进程到指定的 CPU 内核
语法:worker_cpu_affinity  cpumask [cpumask...]
  1. SSL 硬件加速
语法:ssl_engine   device;
  1. 系统调用 gettimeofday 的执行频率
语法:timer_resolution t;
  1. Nginx worker 进程优先级设置
语法:worker_priority  nice;
默认:worker_priority  0;

事件类配置项

  1. 是否打开 accept 锁
   语法格式:accept_mutex [on | off];
  1. lock 文件的路径
   语法格式:lock_file  path/file;
  1. 使用 accept 锁后到真正建立连接之间的延迟时间
   语法格式:accept_mutex_delay Nms;
  1. 批量建立新连接
语法格式:multi_accept [on | off];
  1. 选择事件模型
语法格式:use [kqueue | rtisg | epoll | /dev/poll | select | poll | eventport];
  1. 每个 worker 进行的最大连接数
语法格式:worker_connections number;

HTTP 核心模块的配置 为 http 而服务... 这一块还是挺重要的

  1. 监听端口
语法:listen   address:port[default | default_server | [backlong=num | rcvbuf=size | sndbuf=size |
accept_filter | deferred | bind | ipv6only=[on | off] | ssl]];
默认:listen:80;
配置块范围:server

说明一下:

  • 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 协议;
  1. 主机名称
语法:server_name  name[...];
默认:server_name  "";
配置块范围:server
  1. server name 是使用散列表存储的,每个散列桶占用内存大小
语法:server_names_hash_bucket_size    size;
默认:server_names_hash_bucker_size    32|64|128;
  1. 散列表最大 bucket 数量
语法:server_names_hash_max_size   size;
默认:server_names_hash_max_size   512;
默认:server_name_in_redirect  on;
配置块范围:server、http、location
  1. 处理重定向主机名
语法:server_name_in_redirect  on | off;
默认:server_name_in_redirect  on;
配置块范围:server、http、location
  1. 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;

  1. root 方式设置资源路径
语法:root path;
默认:root html;
配置块范围:server、http、location、if
  1. 以 alias 方式设置资源路径
语法:alias path;
配置块范围:location
  1. 访问主页
语法:index    file...;
默认:index    index.html;
配置块范围:http、server、location
  1. 根据 HTTP 返回码重定向页面
语法:error_page code [code...] [= | =answer-code] uri | @named_location;
配置块范围:server、http、location、if
  1. 是否允许递归使用 error_page
语法:recursive_error_pages [on | off];
配置块范围:http、server、location
  1. try_files
语法:try_files path1 [path2] uri;
配置块范围:server、location
  1. HTTP 包体只存储在磁盘文件中
语法:client_body_in_file_only    on | clean | off;
默认:client_body_in_file_only  off;
配置块范围:http、server、location
  1. HTTP 包体尽量写入到一个内存 buffer 中
语法:client_body_single_buffer   on | off;
默认:client_body_single_buffer   off;
配置块范围:http、server、location
  1. 存储 HTTP 头部的内存 buffer 大小
语法:client_header_buffer_size   size;
默认:client_header_buffer_size   1k;
配置块范围:http、server
  1. 存储超大 HTTP 头部的内存 buffer 大小
语法:large_client_header_buffer_size   number    size;
默认:large_client_header_buffer_size   4   8k;
配置块范围:http、server
  1. 存储 HTTP 包体的内存 buffer 大小
语法:client_body_buffer_size   size;
默认:client_body_buffer_size   8k/16k;
配置块范围:http、server、location
  1. HTTP 包体的临时存放目录
语法:client_body_temp_path   dir-path    [level1 [level2 [level3]]];
默认:client_body_temp_path   client_body_temp;
配置块范围:http、server、location
  1. 存储 TCP 成功建立连接的内存池大小
语法:connection_pool_size    size;
默认:connection_pool_size    256;
配置块范围:http、server
  1. 存储 TCP 请求连接的内存池大小
语法:request_pool_size    size;
默认:request_pool_size    4k;
配置块范围:http、server
  1. 读取 HTTP 头部的超时时间
语法:client_header_timeout   time;
默认:client_header_timeout   60;
配置块范围:http、server、location
  1. 读取 HTTP 包体的超时时间
语法:client_body_timeout   time;
默认:client_body_timeout   60;
配置块范围:http、server、location
  1. 发送响应的超时时间
语法:send_timeout   time;
默认:send_timeout   60;
配置块范围:http、server、location
  1. TCP 连接的超时重置
语法:reset_timeout_connection   on | off;
默认:reset_timeout_connection   off;
配置块范围:http、server、location
  1. 控制关闭 TCP 连接的方式
语法:lingering_close off | on | always;
默认:lingering_close on;
配置块范围:http、server、location
  • always 表示关闭连接之前无条件处理连接上所有用户数据;
  • off 表示不处理;on 一般会处理;
  1. lingering_time
语法:lingering_time   time;
默认:lingering_time   30s;
配置块范围:http、server、location
  1. lingering_timeout
语法:lingering_timeout   time;
默认:lingering_time   5s;
配置块范围:http、server、location
  1. 对某些浏览器禁止 keepalive 功能
语法:keepalive_disable   [mise6 | safari | none]...
默认:keepalive_disable   mise6  safari;
配置块范围:http、server、location
  1. keepalive 超时时间
语法:keepalive_timeout   time;
默认:keepalive_timeout   75;
配置块范围:http、server、location
  1. keepalive 长连接上允许最大请求数
语法:keepalive_requests  n;
默认:keepalive_requests  100;
配置块范围:http、server、location
  1. tcp_nodelay
语法:tcp_nodelay on | off;
默认:tcp_nodelay on;
配置块范围:http、server、location
  1. tcp_nopush
语法:tcp_nopush on | off;
默认:tcp_nopush off;
配置块范围:http、server、location
  1. MIME type 与文件扩展的映射
语法:type{...}
配置块范围:http、server、location
多个扩展名可映射到同一个 MIME type
  1. 默认 MIME type
语法:default_type    MIME-type;
默认:default_type    text/plain;
配置块范围:http、server、location
  1. type_hash_bucket_size
语法:type_hash_bucket_size   size;
默认:type_hash_bucket_size   32 | 64 | 128;
配置块范围:http、server、location
  1. type_hash_max_size
语法:type_hash_max_size   size;
默认:type_hash_max_size   1024;
配置块范围:http、server、location
  1. 按 HTTP 方法名限制用户请求
语法:limit_except    method...{...}
配置块:location
method 的取值如下:
GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、
PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH
  1. HTTP 请求包体的最大值
语法:client_max_body_size    size;
默认:client_max_body_size    1m;
配置块范围:http、server、location
  1. 对请求限制速度
语法:limit_rate  speed;
默认:limit_rate  0;
配置块范围:http、server、location、if
0 表示不限速
  1. limit_rate_after 规定时间后限速
语法:limit_rate_after  time;
默认:limit_rate_after    1m;
配置块范围:http、server、location、if
  1. sendfile 系统调用
语法:sendfile    on | off;
默认:sendfile    off;
配置块:http、server、location
  1. AIO 系统调用
语法:aio on | off;
默认:aio off;
配置块:http、server、location
  1. directio
语法:directio    size | off;
默认:directio    off;
配置块:http、server、location
  1. directio_alignment
语法:directio_alignment    size;
默认:directio_alignment    512;
配置块:http、server、location
  1. 打开文件缓存
语法:open_file_cache max=N [inactive=time] | off;
默认:open_file_cache off;
配置块:http、server、location
  1. 是否缓存打开文件的错误信息
语法:open_file_cache_errors  on | off;
默认:open_file_cache_errors  off;
配置块:http、server、location
  1. 不被淘汰的最小访问次数
语法:open_file_cache_min_user  number;
默认:open_file_cache_min_user  1;
配置块:http、server、location
  1. 检验缓存中元素有效性的频率
语法:open_file_cache_valid  time;
默认:open_file_cache_valid  60s;
配置块:http、server、location
  1. 忽略不合法的 HTTP 头部
语法:ignore_invalid_headers  on | off;
默认:ignore_invalid_headers  on;
配置块:http、server
  1. HTTP 头部是否允许下划线
语法:underscores_in_headers  on | off;
默认:underscores_in_headers  off;
配置块:http、server
  1. If_Modified_Since 头部的处理策略
语法:if_modified_since   [off | exact | before]
默认:if_modified_since   exact;
配置块:http、server、location
  1. 文件未找到时是否记录到 error 日志
语法:log_not_found   on | off;
默认:log_not_found   on;
配置块:http、server、location
  1. 是否合并相邻的“/”
语法:merge_slashes   on | off;
默认:merge_slashes   on;
配置块:http、server、location
  1. DNS 解析地址
语法:resolver    address...;
配置块:http、server、location
  1. DNS 解析的超时时间
语法:resolver_timeout    time;
默认:resolver_timeout    30s;
配置块:http、server、location
  1. 返回错误页面是否在 server 中注明 Nginx 版本
语法:server_tokens   on | off;
默认:server_tokens   on;
配置块:http、server、location

nginx 配置例子

看看我博客的 nginx 的配置:

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
        include       mime.types;
		include luawaf.conf;

		include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;

server
    {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
            location ~ /tmp/ {
                return 403;
            }

        error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;  #这里加载了vhost的nginx下面的所有conf, 包括下面博客的 server 的配置
}

看看我博客的 server 的配置:

server
{
    listen 80;
    listen 443 ssl;
    server_name tc.dreamcat.ink;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/tc.dreamcat.ink;

    SSL-START #SSL相关配置,请勿删除或修改下一行带注释的404规则
    error_page 404/404.html;
    ssl_certificate /etc/ssl/tc/full_chain.pem;
    ssl_certificate_key /etc/ssl/tc/private.key;
    SSL-END

    ERROR-PAGE-START  #错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    error_page 502 /502.html;
    ERROR-PAGE-END

    PHP-INFO-START  #PHP引用配置,可以注释或修改
    include enable-php-74.conf;
    PHP-INFO-END

    REWRITE-START #URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/tc.dreamcat.ink.conf;
    REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log off;
        access_log /dev/null;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log off;
        access_log /dev/null;
    }
    access_log  /www/wwwlogs/tc.dreamcat.ink.log;
    error_log  /www/wwwlogs/tc.dreamcat.ink.error.log;
}

小结

这一块理解一下 nginx 配置文件的形式即可,想配置什么,寻找一下配置项即可。

参考