# 创建nginx进程 的用户和用户组
user nginx;
# worker 进程数
worker_processes auto;
# worker cpu亲和性
worker_cpu_affinity auto;
# nginx 事件的线程池 需要 --with-threads参数 默认35t 65536queue
thread_pool pool_1 threads=32 max_queue=65536;
# 定时器方案参数,不频繁调用时间函数时可不设定,调优参数
timer_resolution 100ms;
# 设定worker在系统中的优先级 越小优先级越高 -20 - 19
worker_priority -5;
# 工作进程打开文件数指令 需要设置linux系统参数
worker_rlimit_nofile 65535;
# 工作进程关闭等待事件是10s
worker_shutdown_timeout 10s;
# 是否允许主进程进行nginx服务,一般调试使用,默认on,off则只有一个master进程
master_process on;
# 是否以后台进程进行,docker需要设置成off docker容器中只有一个进程运行
daemon on;
# 正则表达式匹配加速,需搭配模块pcre-jit
pcre_jit off;
# 互斥锁文件,在accept_mutex开启时使用
lock_file logs/nginx.lock;
# nginx奔溃时文件存储位置
working_directory logs;

error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;


events {
    # 默认使用Linux epoll https://nginx.org/en/docs/events.html
    use epoll;
    # 每个worker允许连接的客户端最大连接数 65535
    worker_connections 1024;
    # 事件的互斥锁,默认关闭,采用性能更优的listen指令后的reuseport 套接字分片
    accept_mutex off;
    # 互斥锁等待事件
    accept_mutex_delay 300ms;
    # 多请求支持
    multi_accept off;
    # epoll事件模型下使用aio,单个工作进程未完成异步I/O操作的最大数
    worker_aio_requests 128;


}


http {
    # 忽略请求头无效属性
    ignore_invalid_headers off;
    # 请求头中下划线属性是否生效
    underscores_in_headers on;
    # 请求头缓冲区大小
    client_header_buffer_size 2k;
    # 超大请求头转移和缓存大小
    large_client_header_buffers 10 8k;
    # 读取请求头超时时间
    client_header_timeout 180s;
    # 请求头内存池大小 官网建议无必要调整
    request_pool_size 4k;
    # 请求体大小 为0时则没有限制
    client_max_body_size 100m;
    # 请求体缓冲区大小,超出部分会写入磁盘或者部分写入client_body_temp_path设定的文件中
    client_body_buffer_size 16k;
    # 将请求体写入单个缓存,推荐$request_body时启用该指令
    client_body_in_single_buffer off;
    # 开启时默认使用缓存,关闭则会使用client_body_temp_path文件,不使用缓存 clean http 请求结束后删除 on 则会保留请求的临时缓存
    client_body_in_file_only off;

    # 缓存位置,nginx docker镜像默认有配置
    client_body_temp_path client_body_temp;
    # 请求体超时 返回408
    client_body_timeout 120s;
    # exact 判断被请求文件的修改时间做精确匹配,则认为缓存有效,当指令为before时 被请求文件的修改时间小于if_modified_since则认为有效
    if_modified_since before;
    # 判断缓存实体标签,集群下需要关闭
    etag off;
    # 断点续传时使用
    max_ranges 1024;


    # 修改错误响应
    # error_page 404=200 /enpty.gif;
    # error_page /404.html;
    # error_page 500 502 503 504 /504.html;
    # 设定location内部访问
    # error_page 404 @fallback;
    # location /@fallback {
    #     proxy_pass http://backend;;
    # }
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;


    #设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
    keepalive_timeout 65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;


    server {
        #监听 127.0.0.1:8000端口
        listen 127.0.0.1:8000;
        # 监听默认80端口(root权限)
        listen 127.0.0.1;
        # 监听本子所有IP的8000端口
        listen 8000;
        # 监听本机所有IP的8000端口
        listen *:8000;

        listen localhost:8000;
        # 监听IPv6的8000端口
        listen [::]:8000
        # 监听IPv6的回环IP的默认80端口
        listen [::1];
        #
        listen *:8000 default_server fastopen=30 reuseport backlog=1024 so_keepalive=on;
        # default_server 当前服务是http指令域端主服务
        # fastopen=30 允许不通过三次握手的连接数
        # deferred 拒绝空数据连接
        # reuseport  套接字分片
        # so_keepalive=on 当socket为保持连接时,开启状态检测功能

        # 对所有连接开启保持连接机制
        keepalive_disable none;
        # 保持连接复用请求数
        keepalive_requests 1000;
        # 保持连接超时指令
        keepalive_timeout 75s;
        # 保持连接时最快发送数据
        tcp_nodelay on;
        # 主机名+
        server_name "ipisces42.com";

        server_name example.com .example.com;
        # 泛域名的使用
        server_name www.example.;
        # 多个后缀域名的使用server_name
        www.example.com ~^www.example.com$;
        # 正则表达式匹配
        # 正则匹配变量的场景
        server_name ~^(www\.)?(.+)$;
        location / {
            root /sites/$2;
        }

        # 正则匹配为变量的场景
        server_name ~^(www\.)?(?<domain>.+)$;
        location / {
            root /sites/$domain;
        }


    }
}
# 多级错误跳转指令

http {
    proxy_intercept_errors on;
    # 当上游服务器返回非200状态码时,返回代理服务器处理
    recursive_error_pages on;
    # 启用多级错误跳转功能
    location / {
        error_page 404 = @fallback;
        # 当前URL请求为404时执行内部请求@fallback
    }
    location @fallback {
        proxy_pass http://backend;
        # 当前所有请求代理到上游服务器backend
        error_page 502 = @upfallback;
        # 当上游服务器返回502状态码时,执行内部请求@upfallback
    }
    location @upfallback {
        proxy_pass http://newbackend; # 当前的所有请求代理到上游服务器newbackend
    }
}
http {
    # 是否在响应体中标识nginx版本号
    server_tokens off;

    # location 匹配语法
    # 无视大小写匹配
    location /images {
        root /data/web;
    }
    # 大小写敏感匹配
    location = /images {
        root /data/web;
    }
}


http {
    # 合并空斜线指令
    merge_slashes off;
    #跳转主机名 需要查询资料再使用
    server_name_in_redirect on;
    # 跳转端口指令
    port_in_redirect on;
    # 绝对跳转指令
    absolute_redirect off;
}

http {
    # rewrite指令日志
    rewrite_log off;
    # 未初始化变量告警日志记录
    uninitialized_variable_warn off;
    # last:执行完当前重写规则跳转到新URI后继续执行后续操作
    # break:执行完当前重写规则,跳转到新的URI后不再执行后续操作
    # redirect: 重定向
    # permanent:永久重定向
    rewrite ^/users/(.*)$ /show?user=$1 last;
}

http {
    # 提前预读
    read_ahead 32k;
    # 打开文件缓存指令
    open_file_cache max=1000 inactive=20s;
    # 是否缓存错误
    open_file_cache_errors on;
    # 打开文件最小访问次数
    open_file_cache_min_uses 2;
    # 打开文件缓存有效性检查时间
    open_file_cache_valid 30s;
    # 零复制
    sendfile on;
    # 数据大于最大报文长度才会使用网络传输
    #tcp_nopush     on;
    # 零复制最小传输限制指令
    sendfile_max_chunk 1m;

    # 直接I/O读取指令,跳过内核读取,适合大文件读取
    directio 5m;
    # 4k对齐
    directio_alignment 4096;
    # 适用于大文件的输出场景
    output_buffers 2 32k;
}
# 开启异步文件I/O 必须搭配directio
http {
    aio on; # 启用异步I/O
    directio 2m; # 当文件大小大于2M时,启用直接读取模式
    directio_alignment 4096; # 与当前文件系统对齐
    output_buffers 3 128k; # 输出缓冲区为384K
    sendfile on; # 小于2M的文件用零复制方式处理
    sendfile_max_chunk 1m; # 零复制时最大传输大小为1M
    tcp_nopush on; # 零复制时启用最小传输限制功能
    thread_pool pool_1 threads 16; # 开启线程池
    aio threads =pool_1
    aio_write on;
    send_timeout 20s;
    postpone_output 2048; # 延迟发送
    chunked_transfer_encoding off;# 分段传输编码指令
}
http {
    # 延迟关闭控制指令
    lingering_close always;
    # 延迟关闭处理时间
    lingering_time 60s;
    # 延迟关闭超时时间
    lingering_timeout 10s;
    # 重置超时连接
    reset_timedout_connection on;
}


http {
    resolver 192.168.2.11 valid=30s;
    #全局域名解析服务器为 192. 168. 2. 11, 30s更新一次 DNS缓存
    resolver_timeout 10s;
    #域名解析超时时间为 10s
    variables_hash_max_size 1024;
    # Nginx变量的 hash表的大小为 1024字节
    variables_hash_bucket_size 64;
    # Nginx变量的 hash表的哈希桶的大小是 64字节
    types_hash_max_size 1024;
    # MIME类型映射表哈希表的大小为 1024字节
    types_hash_bucket_size 64;
    # MIME类型映射表哈希桶的大小是 64字节 #请求解析, HTTP全局有效
    ignore_invalid_headers on;
    #忽略请求头中无效的属性名
    underscores_in_headers on;
    #允许请求头的属性名中有下划线“_”
    client_header_buffer_size 2k;
    #客户请求头缓冲区大小为 2KB
    large_client_header_buffers 4 16k;
    #超大客户请求头缓冲区大小为 64KB
    client_header_timeout 30s;
    #读取客户请求头的超时时间是 30s
    request_pool_size 4k;
    #请求池的大小是 4K
    merge_slashes on;
    #当 URI中有连续的斜线时做合并处理
    server_tokens off;
    #当返回错误信息时,不显示 Nginx服务的版本号信息
    msie_padding on;
    #当客户端请求出错时,在响应数据中添加注释
    subrequest_output_buffer_size 8k;
    #子请求响应报文缓冲区大小为 8KB
    lingering_close on;
    # Nginx主动关闭连接时启用延迟关闭
    lingering_time 60s;
    #延迟关闭的处理数据的最长时间是 60s
    lingering_timeout 5s;
    #延迟关闭的超时时间是 5s
    reset_timedout_connection on;
    #当 Nginx主动关闭连接而客户端无响应时,
    #在连接超时后进行关闭
    log_not_found on;
    #将未找到文件的错误信息记录到日志中
    log_subrequest on;
    #将子请求的访问日志记录到访问日志中
    error_page 404 /404.html;
    #所有请求的 404状态码返回 404. html文件的数据
    error_page 500 502 503 504 /50x.html;
    #所有请求的 500、 502、 503、 504状态码返回 50 ×. html文件 #的数据
    server_names_hash_max_size 1024;
    #服务主机名哈希表大小为 1024字节
    server_names_hash_bucket_size 128;

     #服务主机名哈希桶大小为 128字节
    server {
        #监听本机的 8000端口,当前服务是 http指令域的主服务,开启 fastopen功能并限定最大队列数是
        # 30,拒绝空数据连接, Nginx工作进程共享 socket监听端口,当请求阻塞时挂起队列数是 1024
        #个,当 socket为保持连接时,开启状态检测功能
        listen *:8000 default_server fastopen=30 deferred reuseport backlog=1024 so_keepalive=on;
        server_name a.nginxbar.com b.nginxtest.net c.nginxbar.com a.nginxbar.com;
        

        #保持链接配置
        keepalive_disable msie6;
        #对 MSIE6版本的客户端关闭保持连接机制
        keepalive_requests 1000;
        #保持连接可复用的 HTTP连接为 1000个
        keepalive_timeout 60s;
        #保持连接空置超时时间为 60s
        tcp_nodelay on;
        #当处于保持连接状态时,以最快的方式发送数据包 #本地文件相关配置
        root /data/website;
        #当前服务对应本地文件访问的根目录是/data/website
        disable_symlinks off;
        #对本地文件路径中的符号链接不做检测 #静态文件场景
        location / {
            server_name_in_redirect on;
            #在重定向时,拼接服务主机名
            port_in_redirect on;
            #在重定向时,拼接服务主机端口
            if_modified_since exact;
            #当请求头中有 if_ modified_ since属性时, #与被请求的本地文件修改时间做精确匹配处理
            etag on;
            #启用 etag功能
            msie_refresh on;
            #当客户端是 msie时,以添加 HTML头信息的方式执行跳转
            open_file_cache max=1000 inactive=20s;
            #对被打开文件启用缓存支持,缓存元素数最大为 # 1000个,不活跃的缓存元素保存 20s
            open_file_cache_errors on;
            #对无法找到文件的错误元素也进行缓存
            open_file_cache_min_uses 2;
            #缓存中的元素至少要被访问两次才为活跃
            open_file_cache_valid 60s;
            #每 60s对缓存元素与本地文件进行一次检查
            } 
            #上传接口的场景应用
            location /upload {
                alias /data/upload;
                #将 upload的请求重定位到目录/data/upload
                limit_except GET {
                    #对除 GET以外的所有方法进行限制
                    allow 192.168.100.1;
                    #允许 192. 168. 100. 1执行所有请求方法
                    deny all;
                    #其他 IP只允许执行 GET方法
                }
                client_max_body_size 200m;
                #允许上传的最大文件大小是 200MB
                client_body_buffer_size 16k;
                #上传缓冲区的大小是 16KB
                client_body_in_single_buffer on;
                #上传文件完整地保存在临时文件中
                client_body_in_file_only off;
                #不禁用上传缓冲区
                client_body_temp_path /tmp/upload 1 2;
                #设置请求体临时文件存储目录
                client_body_timeout 120s;
                #请求体接收超时时间为 120s
            }
            #下载场景应用
            location /download {
                alias /data/upload;
                #将 download的请求重定位到目录/data/upload
                types{}
                    default_type application/octet-stream;
            #设置当前目录所有文件默认 MIME类型为  # application/octet-stream
            try_files $uri @nofile;
            #当文件不存在时,跳转到 location @nofile
            sendfile on;
            #开启零复制文件传输功能
            sendfile_max_chunk 1M;
            #每个 sendfile调用的最大传输量为 1MB
            tcp_nopush on;
            #启用最小传输限制功能
            aio on; #启用异步传输
            directio 5M;
            #当文件大于 5MB时以直接读取磁盘方式读取文件
            directio_alignment 4096;
            #与磁盘的文件系统对齐
            output_buffers 4 32k;
            #文件输出的缓冲区为 128KB
            limit_rate 1m;
            #限制下载速度为 1MB
            limit_rate_after 2m;
            #当客户端下载速度达到 2MB时,进入限速模式
            max_ranges 4096;
            #客户端执行范围读取的最大值是 4096B
            send_timeout 20s;
            #客户端引发传输超时时间为 20s
            postpone_output 2048;
            #当缓冲区的数据达到 2048B时再向客户端发送
            chunked_transfer_encoding on;
            #启用分块传输标识
        }
        location @nofile {
            index nofile.html;
        }
        
        location = /404.html {
            internal;
        }

        location = /50x.html {
            internal;
        }}}
        ```

Q.E.D.