Nginx 配置文件理解,基础使用

一、Nginx 配置文件核心模块解析

1. 全局模块(Main Context)
  • 作用:定义全局运行参数,影响整个 Nginx 实例。
  • 关键参数
    user nginx;                 # 以 nginx 用户和组运行进程(提升安全性)
    worker_processes auto;      # 工作进程数(auto 自动匹配 CPU 核心数)
    error_log /var/log/nginx/error.log warn;  # 错误日志路径及记录级别(warn 及以上)
    pid /run/nginx.pid;         # 主进程 PID 存储路径
    worker_rlimit_nofile 65535; # 单个工作进程可打开的最大文件描述符数(需结合系统 ulimit 调整)
    
2. Events 模块
  • 作用:定义连接处理模型和并发参数。
  • 关键参数
    events {
      worker_connections 4096;  # 单个工作进程的最大并发连接数
      use epoll;                # 事件驱动模型(Linux 用 epoll,BSD 用 kqueue)
      multi_accept on;          # 允许一次性接受所有新连接(高并发场景)
      accept_mutex off;         # 关闭连接互斥锁(高并发时减少延迟)
    }
    
3. HTTP 模块
  • 作用:配置 HTTP 服务器核心功能,包含全局设置、虚拟主机(server)和路由(location)。
  • 关键参数
    http {
      include /etc/nginx/mime.types;     # 引入 MIME 类型文件(定义 Content-Type)
      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; # 访问日志路径及格式
      sendfile on;                  # 启用零拷贝文件传输(提升性能)
      tcp_nopush on;                # 合并数据包减少网络开销(需 sendfile 开启)
      keepalive_timeout 65;         # 客户端长连接超时时间(秒)
      gzip on;                      # 启用 Gzip 压缩
      gzip_comp_level 5;            # 压缩级别(1-9,越高 CPU 消耗越大)
      gzip_types text/plain application/json; # 指定压缩类型
    
      # 包含其他配置文件(如虚拟主机配置)
      include /etc/nginx/conf.d/*.conf;
      include /etc/nginx/sites-enabled/*;
    }
    
4. Server 模块(虚拟主机)
  • 作用:定义单个虚拟主机的行为,如监听端口、域名匹配、路由规则。
  • 关键参数
    server {
      listen 80;                    # 监听端口(可指定 IP,如 127.0.0.1:80)
      server_name example.com www.example.com; # 匹配的域名(支持通配符和正则)
      root /var/www/html;           # 网站根目录
      index index.html index.htm;    # 默认索引文件
    
      # 自定义错误页面
      error_page 404 /404.html;
      error_page 500 502 503 504 /50x.html;
    
      # 路由规则(location 块)
      location / {
        try_files $uri $uri/ /index.html; # 用于前端单页应用路由
      }
    
      location /api/ {
        proxy_pass http://backend;  # 反向代理到上游服务器
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
      }
    
      # 静态文件缓存配置
      location ~* \.(jpg|png|css|js)$ {
        expires 30d;                # 客户端缓存时间(30天)
        access_log off;             # 关闭访问日志(减少磁盘 I/O)
      }
    }
    
5. Upstream 模块(负载均衡)
  • 作用:定义后端服务器组,支持负载均衡和健康检查。
  • 关键参数
    upstream backend {
      server 10.0.0.1:8080 weight=5;  # 权重负载均衡
      server 10.0.0.2:8080 max_fails=3 fail_timeout=30s; # 健康检查
      server 10.0.0.3:8080 backup;    # 备用服务器(主服务器宕机时启用)
      least_conn;                     # 使用最少连接数算法
      keepalive 32;                   # 与上游服务器的长连接池大小
    }
    
6. SSL/TLS 模块
  • 作用:配置 HTTPS 加密通信。
  • 关键参数
    server {
      listen 443 ssl;                 # 启用 SSL
      server_name example.com;
    
      ssl_certificate /etc/nginx/ssl/fullchain.pem;     # 证书链文件
      ssl_certificate_key /etc/nginx/ssl/privkey.pem;   # 私钥文件
      ssl_protocols TLSv1.2 TLSv1.3;  # 仅允许安全协议版本
      ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; # 安全加密套件
      ssl_prefer_server_ciphers on;   # 优先使用服务端加密套件
      ssl_session_cache shared:SSL:10m; # SSL 会话缓存(提升性能)
      ssl_session_timeout 10m;        # 会话超时时间
      ssl_stapling on;                # 启用 OCSP 装订(验证证书有效性)
    }
    

二、实际配置文件案例解析

案例:一个高安全、高性能的 Web 服务器配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;

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

http {
  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;

  sendfile on;
  tcp_nopush on;
  keepalive_timeout 65;

  # 安全响应头
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-Content-Type-Options "nosniff";
  add_header Content-Security-Policy "default-src 'self'";
  server_tokens off; # 隐藏 Nginx 版本号

  # Gzip 压缩
  gzip on;
  gzip_comp_level 5;
  gzip_types text/plain text/css application/json application/javascript;

  # 负载均衡配置
  upstream backend {
    server 10.0.0.1:8080 weight=3;
    server 10.0.0.2:8080;
    least_conn;
    keepalive 32;
  }

  # HTTP 虚拟主机
  server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri; # 强制跳转 HTTPS
  }

  # HTTPS 虚拟主机
  server {
    listen 443 ssl;
    server_name example.com;

    # SSL 配置
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    root /var/www/html;
    index index.html;

    # 静态文件路由
    location / {
      try_files $uri $uri/ /index.html;
    }

    # API 反向代理
    location /api/ {
      proxy_pass http://backend;
      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;

      # 连接超时控制
      proxy_connect_timeout 5s;
      proxy_read_timeout 30s;
    }

    # 禁止访问敏感文件
    location ~ /\.(env|git|htaccess) {
      deny all;
      return 404;
    }

    # 限制上传文件大小
    client_max_body_size 10m;
  }
}
逐行解析
  1. 全局模块

    • user nginx;:以低权限用户运行,提升安全性。
    • worker_processes auto;:自动分配工作进程数(与 CPU 核心数一致)。
    • error_log:记录错误日志,仅捕获警告及以上级别。
  2. Events 模块

    • worker_connections 4096:单个进程处理 4096 个并发连接。
    • use epoll:Linux 系统下高效的事件驱动模型。
  3. HTTP 模块

    • 安全响应头:防止点击劫持(X-Frame-Options)、MIME 类型嗅探(X-Content-Type-Options)、内容安全策略(CSP)。
    • Gzip 压缩:压缩文本内容,减少传输体积。
    • 负载均衡:定义 backend 服务器组,使用最少连接算法,并保持长连接。
  4. Server 模块

    • HTTP 跳转 HTTPS:强制将所有 HTTP 请求重定向到 HTTPS。
    • SSL 配置:仅启用 TLSv1.2 和 TLSv1.3,使用现代加密套件。
    • 静态文件路由try_files 用于前端单页应用的路由回退。
    • API 反向代理:将 /api/ 请求转发到负载均衡组,并携带真实客户端 IP。
    • 敏感文件防护:禁止访问 .env, .git 等隐藏文件。
    • 请求体限制:防止大文件上传攻击(client_max_body_size)。

三、关键优化与安全实践

  1. 性能优化

    • 启用 sendfiletcp_nopush 减少文件传输开销。
    • 使用 keepalive 保持长连接,降低 TCP 握手开销。
    • 静态文件设置 expires 缓存,减少重复请求。
  2. 安全加固

    • 隐藏 Nginx 版本号(server_tokens off)。
    • 强制使用 HTTPS,禁用不安全的 TLS 版本。
    • 通过 add_header 添加安全响应头。
    • 限制客户端请求体大小(client_max_body_size)。
  3. 高可用设计

    • 负载均衡配置健康检查(max_failsfail_timeout)。
    • 使用 backup 参数定义备用服务器。

四、调试与验证

  1. 语法检查

    nginx -t  # 检查配置文件语法
    
  2. 重载配置

    nginx -s reload  # 不中断服务重载配置
    
  3. 日志分析

    tail -f /var/log/nginx/access.log  # 实时监控访问日志
    grep '500' /var/log/nginx/access.log  # 查找 500 错误
    
  4. 性能测试

    ab -n 1000 -c 100 https://example.com/  # ApacheBench 压力测试
    

总结

通过模块化配置和合理参数调优,Nginx 可高效处理静态资源、反向代理、负载均衡等场景,同时通过安全加固抵御常见攻击。实际配置需结合业务需求调整,并通过 nginx -t 和日志监控确保稳定性。

你可能感兴趣的:(nginx,运维)