# 按照cpu的核数进行worker进程数的启动,通常是1C,1worker
worker_processes        auto;
# 每个 worker 可用的句柄数
worker_rlimit_nofile    65535;
# 强制 CPU 亲和性, 在高并发情况下可以降低由于多核 CPU 的切换造成的寄存器等现场重建带来的性能损耗
worker_cpu_affinity     00000001 00000010;

events {
    # 多路复用的事件驱动模型, Linux2.6+
    use                 epoll;
    # 每个 worker 进程支持的最大连接数, 使用 `cat /proc/sys/fs/file-max` 获取系统最大句柄数
    worker_connections  102400;
    # worker 进程是否可以同时接受多个网络连接
    multi_accept        on;
}

http {
    include         mime.types;
    charset         UTF-8;

    log_format main '$http_x_forwarded_for - [$time_local] "$request" $status $body_bytes_sent $request_time "$http_referer" "sc
heme:[$scheme]" "$http_user_agent" $remote_addr "upstream:[$upstream_addr, $upstream_status, $upstream_response_time]"';

    access_log      logs/access.log main;
    default_type    application/octet-stream;

    # 读取客户端请求体时的缓冲区, 请求体超过缓冲区大小时, 请求体的全部或部分将被写入临时文件, 默认为两个内存页大小
    client_body_buffer_size     1024m;
    # 允许的客户端最大请求体大小, 0为不限制
    # 通过请求头中的 Content-Length 获取, 超过限定大小的请求将被返回 413
    # 上传大对象,需要设置较大值,如10240m
    client_max_body_size        0; 


    # 对哪种浏览器禁用长连接
    keepalive_disable           none;
    # 允许在一个长连接上最多可处理多少个请求
    keepalive_requests          10000;
    # 指定每个 TCP 连接最多可以保持多长时间, 默认 75秒, 0 为禁止长连接
    keepalive_timeout           65;

    server_tokens               off;
    underscores_in_headers      on;

    gzip                        on;
    gzip_vary                   on;
    # 当请求头中的 UserAgent 字段满足这个正则时,响应不会启用 GZip
    # 指令值 msie6 等价于 MSIE [4-6]\.,但性能更好一些
    gzip_disable                "msie6";
    # 默认 Nginx 只会针对 HTTP/1.1 及以上的请求才会启用 GZip, 因为部分早期的 HTTP/1.0 客户端在处理 GZip 时有 Bug
    gzip_http_version           1.1;
    gzip_types                  text/plain text/css application/json application/x-javascript text/xml application/xml applicati
on/xml+rss text/javascript application/javascript;
    #gzip的压缩率,1-9,数字越大,压缩率越高,占用cpu也越高
    gzip_comp_level             3;

    # 提高 Nginx 静态资源托管效率
    # sendfile 是一个系统调用,直接在内核空间完成文件发送,不需要先 read 再 write,没有上下文切换开销
    sendfile                    on;
    # 禁用 Nagle 算法, 尽快发送数据, 某些情况下可以节约 200ms
    # Nagle 算法原理是:在发出去的数据还未被确认之前,新生成的小数据先存起来,凑满一个 MSS 或者等到收到确认后再发送
    # Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay
    tcp_nodelay                 on;
    # 数据包会累计到一定大小之后才会发送,减小了额外开销,提高网络效率, 需要开启 sendfile
    tcp_nopush                  on;

    # tcp_nodelay 和 tcp_nopush 可以同时开启, 最终效果是先填满包,再尽快发送

     server {
        server_name localhost;
        # 开启 reuseport, Nginx 会在指定的端口上监听多个 socket,每个 Worker 都能分到一个. 请求过来时,系统内核会自动通过不同的 
socket 分配给对应的 Worker, 提高了分发效率
        # backlog, 连接已建立、但还未被处理的请求队列大小, 队列满时将会拒绝连接 "Connection refused";
        # backlog 太大, 可能导致等待时间长, 出现 "Broken pipe"
        # backlog 太小, 可能导致 "502 Bad Gateway"}