###############################################################################
#  nginx.conf · 学习版 · 带详细中文注释
#  目标：让你看完这一份配置，对"五层洋葱"有完整认知
###############################################################################

# ===== 第 1 层 · main（全局，写在文件顶部） =====================================

user  nginx;                    # worker 进程跑在哪个 OS 用户下（推荐非 root）
worker_processes  auto;         # auto = CPU 核数；要排查问题可临时设 1 调试
worker_rlimit_nofile 65535;     # 单进程最大文件描述符（含 socket）

# 错误日志：路径 + 级别。生产用 warn，调试时改 info / debug
error_log  /var/log/nginx/error.log  warn;
pid        /var/run/nginx.pid;

# ===== 第 2 层 · events（连接处理模型） ========================================
events {
    use epoll;                  # Linux 上首选 epoll；FreeBSD 用 kqueue
    worker_connections 10240;   # 每个 worker 同时能 hold 多少连接（含上游）
    multi_accept on;            # 一个事件循环尽量多接收新连接
    accept_mutex off;           # 现代多核机器关掉它，让所有 worker 都有机会 accept
}

# ===== 第 3 层 · http（全 HTTP 通用配置） ======================================
http {
    # ---- MIME / 默认类型 ----
    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" '
                      'rt=$request_time uct="$upstream_connect_time" '
                      'urt="$upstream_response_time"';
    access_log  /var/log/nginx/access.log  main;

    # ---- 性能 ----
    sendfile        on;         # 零拷贝传输文件（kernel 直接把文件丢给 socket）
    tcp_nopush      on;         # 配合 sendfile：等满 1 个 MSS 再发，省小包
    tcp_nodelay     on;         # 长连接里小包立刻发（Nagle 算法关闭）
    keepalive_timeout  65;      # 长连接保活时间（秒）
    keepalive_requests 1000;    # 一条长连接最多复用多少次

    # 隐藏 Nginx 版本号（防止扫描器盯上）
    server_tokens off;

    # 默认请求体上限（上传文件大的可在 server / location 内单独覆盖）
    client_max_body_size 8m;

    # ---- 压缩（gzip） ----
    gzip on;
    gzip_min_length 1k;         # 小于 1KB 的不压（不划算）
    gzip_comp_level 5;          # 1 ~ 9，数字越大压缩比越高 / CPU 越累
    gzip_vary on;               # 加 Vary: Accept-Encoding 头，给 CDN 用
    gzip_types
        text/plain text/css application/json application/javascript
        application/xml application/xml+rss image/svg+xml;

    # ---- 引入子配置（推荐拆文件管理） ----
    include /etc/nginx/conf.d/*.conf;
}
