nginx配置文件详解

概述

Nginx 配置由全局块、events 块、http 块、server 块、location 块五层嵌套组成,

层级关系为:

复制代码
# 全局块(顶层,不属于任何块)
events { ... }       # 连接、IO、进程模型配置
http {               # 所有HTTP服务总入口
    # http全局配置
    server {         # 虚拟主机(站点)
        # server站点配置
        location / { # 路由匹配规则
            # 路由处理配置
        }
    }
}

默认主配置文件路径:

  • CentOS/RHEL:/etc/nginx/nginx.conf
  • Debian/Ubuntu:/etc/nginx/nginx.conf

nginx配置文件

全局块

作用:配置 Nginx 全局运行参数,影响所有子模块。

  • user

    user nginx nginx

    语法:user [用户名] [用户组];

    作用:worker进程运行身份,生产禁止root,防止权限泄露

    不写默认nobody,CentOS默认nginx用户,ubuntu系列默认www-data

  • worker_processes

    worker_processes auto;

    语法:worker_processes 数字 | auto;

    auto:自动匹配CPU核心数(推荐生产)

    例:4核CPU写4;最大不超过CPU核心*2

    原理:每个worker单进程单线程,无锁,高并发核心

  • worker_cpu_affinity CPU 亲和绑定

    worker_cpu_affinity 0001 0010 0100 1000;
    worker_cpu_affinity auto;

    4核CPU绑定示例,0001 0010 0100 1000 分别对应4个核心

    作用:固定worker进程跑在指定CPU,减少CPU切换损耗,高并发优化

    生产环境建议使用worker_cpu_affinity auto;

  • error_log 全局错误日志

    error_log /var/log/nginx/error.log warn;

    语法:error_log 路径 日志级别;

    级别(从低到高):debug | info | notice | warn | error | crit | alert | emerg

    生产推荐warn/error,debug会大量打印日志,仅调试使用

    可写多个error_log分文件存储不同级别日志

  • pid 进程 PID 文件

    pid /run/nginx.pid;

    存储master主进程PID,nginx stop/reload会读取此文件

  • worker_rlimit_nofile 进程最大文件句柄

    worker_rlimit_nofile 65535;

    单个worker能打开的最大文件数,必须大于并发连接数

    系统内核也要同步修改 /etc/security/limits.conf nofile

  • worker_rlimit_core

    worker_rlimit_core 500M;

    core转储文件最大大小,崩溃调试使用

events模块

所有网络 IO、连接数、事件驱动都在这里,决定并发承载能力

复制代码
events {
    # 1. 单worker最大连接数
    worker_connections 10240;
    # 计算公式:理论最大并发 = worker_processes * worker_connections
    # 注意:一条HTTP连接会占用2个fd(客户端+后端),实际并发减半
    # 建议设置为10240:worker_connections 10240;,注意不能超过系统最大文件句柄数限制
    # worker_connections 上限受 worker_rlimit_nofile 限制

    # 2. IO多路复用模型(linux推荐epoll,freebsd kqueue,windows select)
    use epoll;

    # 3. 批量接收连接,性能优化
    multi_accept on;
    # on:一次性接收所有等待连接;off:一次只接收1个

    # 4. 事件通知方式,减少系统调用
    epoll_events 1024;

    # 5. 锁优化,多核防惊群
    #是否启用连接分配互斥锁,防止惊群现象
    accept_mutex on;
    # 互斥锁等待时间
    accept_mutex_delay 500ms;
}

http模块

所有虚拟主机共享配置,包含 mime、缓存、超时、压缩、反向代理、日志、长连接等

复制代码
http {
    # ===================== 1. 文件类型MIME配置 =====================
    # 引入媒体类型映射文件,定义后缀对应Content-Type
    include /etc/nginx/mime.types;
     # 未知文件默认二进制下载,不解析
    default_type application/octet-stream;

    # ===================== 2. 访问日志格式定义 =====================
    # log_format 自定义日志模板,main为格式名称,变量见文末变量大全
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # buffer:日志缓冲区,满了再落盘;flush:超时强制刷盘,减少IO
    access_log /var/log/nginx/access.log main buffer=64k flush=5s;
    # 日志文件缓存,减少打开关闭文件的开销
    open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
    # ===================== 3. 高效文件传输优化 =====================
    # 零拷贝,内核直接发送文件,不经过用户态,静态文件必开
    sendfile on;
    # sendfile配套,攒满数据包一次性发送,减少小包
    tcp_nopush on;
     # 动态接口可on降低延迟
    tcp_nodelay on;

    # ===================== 4. 长连接超时 =====================
    # 客户端空闲连接65秒断开
    keepalive_timeout 65;
    # 单条长连接最多处理1000次请求,防止单连接占资源
    keepalive_requests 1000;

    # ===================== 5. Gzip静态资源压缩 =====================
    gzip on;
    gzip_min_length 1k;          # 小于1k不压缩
    gzip_buffers 4 16k;          # 压缩缓冲区
    gzip_http_version 1.1;       # 兼容http1.1
    gzip_comp_level 4;            # 压缩等级1-9,越高越耗CPU,4平衡
    # 仅压缩文本类,图片/视频不压缩
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
    gzip_vary on;                # 响应头添加Vary: Accept-Encoding
    gzip_proxied any;            # 反向代理后端返回内容也压缩

    # ===================== 6. 隐藏Nginx版本号(安全) =====================
    # 关闭后错误页、响应头不再显示nginx版本,防止漏洞针对性攻击
    server_tokens off;


    # ===================== 7. 客户端请求限制 =====================
    # 客户端上传文件最大100M,超过返回413 Request Entity Too Large
    client_max_body_size 100M;
    # 请求体内存缓冲区,超过写入临时磁盘
    client_body_buffer_size 128k;
    client_header_buffer_size 1k;
    # 超大请求头缓冲区(如长cookie、JWT)
    large_client_header_buffers 4 8k;

    # 请求头读取超时
    client_header_timeout 10;
    client_body_timeout 10;
    send_timeout 30; # 响应发送超时,默认值60

    # ===================== 8. 连接限速、IP限流 =====================
    # 全局定义限流规则,server/location中调用
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s burst=20 nodelay;


    # ===================== 9. 文件缓存(静态文件元数据缓存) =====================
    open_file_cache max=10000 inactive=60s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # ===================== 10. 反向代理全局公共参数 =====================
    proxy_connect_timeout 60s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
    proxy_busy_buffers_size 8k;
    proxy_temp_file_write_size 16k;
    # 透传真实客户端IP给后端服务
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme; # 传递http/https协议

    # 安全相关
    add_header X-Frame-Options "SAMEORIGIN" always; # 防止点击劫持 
    add_header X-Content-Type-Options "nosniff" always; # 防止MIME类型嗅探 
    add_header X-XSS-Protection "1; mode=block" always; # 启用XSS防护 
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always; # CSP策略,根据业务调整
    # ===================== 11. 负载均衡上游集群(反向代理后端组) =====================
    upstream backend_server {
        server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
        server 127.0.0.1:8081 weight=2 backup;
        server 127.0.0.1:8082 down;
        # 负载均衡策略
        ip_hash; # 同一IP固定后端,解决session共享
        # least_conn; 最少连接优先
        # url_hash; 按url哈希
        # fair; 响应时间优先(第三方模块)
    }

    # ===================== 12. 引入独立站点配置(分文件管理) =====================
    include /etc/nginx/conf.d/*.conf;
    # 所有conf.d下的配置文件会自动加载,多站点分离,便于维护
}

server块

一个 server{} 代表一个网站,通过 listen 端口 + server_name 域名区分,支持多域名、泛域名、HTTPS 证书配置。

复制代码
# HTTP 80端口:所有域名统一301跳转HTTPS
server {
    listen 80;
    # 兼容IPv6
    listen [::]:80;
    # 同步把泛域名加上,所有http域名统一跳转
    server_name www.example.com example.com *.example.com;

    # 直接跳转,本块无需静态资源、限流、日志等配置(不会走到location)
    return 301 https://$host$request_uri;

    # 如需单独记录http跳转日志可保留,不需要直接删掉
    access_log /var/log/nginx/example_http_redirect.log main;
}

# HTTPS 443主站点(整合所有业务逻辑:证书、缓存、限流、黑白名单、SPA路由)
server {
    # http2多路复用,提升页面加载速度
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    # 补齐泛域名,统一管理所有域名
    server_name www.example.com example.com *.example.com;

    # ==================== SSL证书与安全加密 ====================
    # ssl证书
    ssl_certificate /etc/nginx/ssl/example.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;
    ssl_trusted_certificate /etc/nginx/ssl/ca.crt;

    # SSL安全加密套件(防中间人、弱加密)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # SSL会话缓存优化,减少握手耗时
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;

    # ==================== 安全响应头 ====================
    # HSTS强制浏览器使用HTTPS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options nosniff always;

    # ==================== 站点基础配置 ====================
    root /data/www/example;
    index index.html index.htm index.php;

    # 站点独立日志
    access_log /var/log/nginx/example_access.log main;
    error_log /var/log/nginx/example_error.log error;

    # ==================== 限流、IP黑白名单 ====================
    limit_conn conn_limit 20;
    limit_req zone=req_limit burst=10;

    deny 192.168.1.100;
    allow all;

    # ==================== SPA前端路由兜底 ====================
    location / {
        try_files $uri $uri/ /index.html;
    }
}

location模块

location 匹配语法与优先级

匹配符号优先级从高到低:

  • = 精准完全匹配(最高)
  • ^~ 前缀匹配,匹配成功后不再检索正则
  • ~ 区分大小写正则匹配
  • ~* 不区分大小写正则匹配
  • 无符号普通前缀匹配(最低)

示例:

复制代码
# 1. 精准匹配,仅访问 / 命中
location = / {
    return 200 "home page";
}

# 2. ^~ 静态资源前缀匹配,匹配后跳过正则,性能更高
location ^~ /static/ {
    root /data/www;
    expires 30d; # 静态资源浏览器缓存30天
}

# 3. 区分大小写正则,匹配图片后缀
location ~ \.(jpg|png|gif|jpeg)$ {
    expires 7d;
}

# 4. 不区分大小写正则
location ~* \.(css|js)$ {
    expires 1d;
}

# 5. 通用兜底匹配,所有未匹配路由
location / {
    proxy_pass http://backend_server;
}
  • alias指令

    root:拼接 root + location路径

    location /static/ {
    root /data/www;
    # 访问 /static/a.jpg 实际文件 /data/www/static/a.jpg
    }

    alias:直接替换location路径

    location /static/ {
    alias /data/www/static_files/;
    # 访问 /static/a.jpg 实际访问文件 /data/www/static_files/a.jpg
    }

    注意alias末尾必须带/,否则路径错乱

  • expires 浏览器缓存(静态资源性能优化)

    location ~* .(png|jpg|css|js)$ {
    expires 30d; # 缓存30天
    # expires -1; 禁止缓存
    # expires epoch; 立即过期
    add_header Cache-Control "public, no-transform";
    }

  • proxy_pass 反向代理(后端转发)

    location /api/ {
    # 转发到上游负载均衡集群
    proxy_pass http://backend_server/;
    # 末尾/作用:替换匹配前缀
    # proxy_pass http://127.0.0.1:8080 无/:/api/xxx -> /api/xxx
    # proxy_pass http://127.0.0.1:8080/ 有/:/api/xxx -> /xxx

    复制代码
      # 继承http块proxy参数,可单独覆盖超时
      proxy_read_timeout 120s;

    }

  • try_files 文件存在性判断(SPA、静态站点必备)

    依次查找uri文件、uri/目录,都不存在则跳转最后参数

    location / {
    try_files uri uri/ /index.html;
    }

  • PHP-FPM 解析配置(PHP 站点专用)

    location ~ .php { fastcgi_pass 127.0.0.1:9000; # php-fpm地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME document_root$fastcgi_script_name;
    include fastcgi_params;
    }

  • valid_referers

    location ~* .(jpg|png) { valid_referers none blocked server_names *.example.com; if (invalid_referer) {
    return 403; # 非法外链图片返回403
    }
    }

  • deny/allow IP 访问控制

    location /admin {
    allow 192.168.1.0/24;
    deny all; # 仅内网可访问后台
    }

  • limit_conn /limit_req 单路由限流

    location /login {
    limit_req zone=req_limit burst=5 nodelay;
    }