1. 全局配置

这些配置通常位于配置文件的最顶部,影响整个 NGINX 的行为。

  • worker_processes:

    • 作用:指定 NGINX 进程的数量。建议设置为服务器 CPU 核心的数量以提高性能。
    • 示例:worker_processes 1;
  • error_log:

    • 作用:指定错误日志文件的位置和日志级别(如 debug, info, notice, warn, error)。
    • 示例:error_log /var/log/nginx/error.log warn;
  • pid:

    • 作用:指定保存 NGINX 进程 ID 的文件。
    • 示例:pid /var/run/nginx.pid;

2. 事件配置

这些配置影响 NGINX 处理连接的方式。

  • worker_connections:
    • 作用:指定每个工作进程可以处理的最大连接数。
    • 示例:worker_connections 1024;

3. HTTP 模块

用于配置 HTTP 服务器相关的选项。

  • include:

    • 作用:包含外部文件或配置,例如 MIME 类型配置文件。
    • 示例:include mime.types;
  • default_type:

    • 作用:设置默认的 MIME 类型,用于无法识别的文件。
    • 示例:default_type application/octet-stream;
  • sendfile:

    • 作用:开启或关闭 sendfile 系统调用,提高静态文件的传输效率。
    • 示例:sendfile on;
  • keepalive_timeout:

    • 作用:指定客户端连接在空闲状态下保持连接的时间(秒)。
    • 示例:keepalive_timeout 65;
  • client_max_body_size:

    • 作用:指定客户端请求的最大请求体大小。用于限制上传文件的大小。
    • 示例:client_max_body_size 20M;
  • gzip:

    • 作用:启用或禁用 gzip 压缩,减少传输的数据量。
    • 示例:gzip on;
  • gzip_types:

    • 作用:指定要压缩的 MIME 类型。
    • 示例:gzip_types text/plain text/css application/json application/javascript;
  • map:

    • 作用:用于将变量的值映射到另一个变量。常用于复杂的条件判断。
    • 示例:
      map $http_upgrade $connection_upgrade {
          default upgrade;
          ''      close;
      }
      

4. Server 块

用于定义虚拟服务器,可以根据域名、IP 地址或端口进行匹配。

  • listen:

    • 作用:指定服务器监听的端口和协议。
    • 示例:listen 80;listen 443 ssl;
  • server_name:

    • 作用:指定虚拟主机名。可以使用多个主机名,或使用通配符。
    • 示例:server_name example.com www.example.com;
  • ssl_certificate:

    • 作用:指定 SSL 证书文件的位置。
    • 示例:ssl_certificate /etc/nginx/certs/ssl_certificate.crt;
  • ssl_certificate_key:

    • 作用:指定 SSL 证书私钥的位置。
    • 示例:ssl_certificate_key /etc/nginx/certs/ssl_certificate.key;
  • location:

    • 作用:定义如何处理特定的 URI 请求。
    • 示例:
      location / {
          root /var/www/html;
          index index.html;
      }
      
  • proxy_pass:

    • 作用:将请求转发到其他服务器或应用。
    • 示例:proxy_pass http://backend_server;

5. SSL 配置

配置 HTTPS 相关选项,确保安全通信。

  • ssl_ciphers:

    • 作用:指定支持的 SSL/TLS 加密套件。
    • 示例:ssl_ciphers HIGH:!aNULL:!MD5;
  • ssl_protocols:

    • 作用:指定支持的 SSL/TLS 协议版本。
    • 示例:ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  • ssl_prefer_server_ciphers:

    • 作用:启用此选项后,服务器将优先选择它自己的加密算法,而非客户端首选的。
    • 示例:ssl_prefer_server_ciphers on;

6. 生成 SSL 证书的基本步骤

  1. 生成私钥:openssl genpkey -algorithm RSA -out ssl_certificate.key
  2. 生成证书签名请求 (CSR):openssl req -new -key ssl_certificate.key -out ssl_certificate.csr
  3. 使用 CSR 生成自签名证书:openssl x509 -req -days 365 -in ssl_certificate.csr -signkey ssl_certificate.key -out ssl_certificate.crt

7. 常用的 NGINX 命令

  • 启动 NGINX: nginx
  • 停止 NGINX: nginx -s stop
  • 平滑重启 NGINX: nginx -s reload
  • 测试配置文件: nginx -t

8. 示例配置

# 全局配置
worker_processes 1;  # 指定工作进程的数量,通常设为 CPU 核心数

error_log /var/log/nginx/error.log warn;  # 指定错误日志的位置和日志级别
pid /var/run/nginx.pid;  # 指定保存 NGINX 进程 ID 的文件

# 事件配置
events {
    worker_connections 1024;  # 每个工作进程最大连接数
}

# HTTP 模块配置
http {
    include mime.types;  # 包含 MIME 类型配置文件
    default_type application/octet-stream;  # 默认 MIME 类型

    sendfile on;  # 启用高效的文件传输
    tcp_nopush on;  # 启用 TCP_NOPUSH 选项,优化大文件传输
    tcp_nodelay on;  # 启用 TCP_NODELAY 选项,减少延迟

    keepalive_timeout 65;  # 设置客户端连接保持的超时时间(秒)

    client_max_body_size 20M;  # 限制客户端请求体的最大尺寸
    client_body_buffer_size 128k;  # 设置客户端请求体缓冲区大小

    proxy_buffer_size 64k;  # 设置代理缓冲区大小
    proxy_buffers 32 64k;  # 设置代理缓存区的数量和大小
    proxy_busy_buffers_size 128k;  # 设置忙碌缓存区的大小

    gzip on;  # 启用 gzip 压缩
    gzip_http_version 1.1;  # 指定支持 gzip 压缩的 HTTP 协议版本
    gzip_vary on;  # 启用 Vary 头部,以便缓存代理根据 gzip 进行内容变更
    gzip_comp_level 6;  # 设置 gzip 压缩级别(1-9)
    gzip_proxied any;  # 启用对所有代理请求的 gzip 压缩
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;  # 指定需要 gzip 压缩的 MIME 类型

    map $http_upgrade $connection_upgrade {
        default upgrade;  # 支持 WebSocket 升级
        ''      close;  # 关闭连接
    }

    # 服务器配置
    server {
        listen 80;  # 监听 HTTP 80 端口
        server_name example.com www.example.com;  # 设定虚拟主机名

        root /var/www/html;  # 设置网站根目录
        index index.html index.htm;  # 设置默认首页文件

        location / {
            try_files $uri $uri/ =404;  # 尝试访问文件或目录,若未找到则返回 404
        }

        location /images/ {
            root /var/www/images;  # 配置图片目录
        }
    }

    # SSL 配置
    server {
        listen 443 ssl;  # 监听 HTTPS 443 端口
        server_name secure.example.com;  # 设置 HTTPS 主机名

        ssl_certificate /etc/nginx/certs/ssl_certificate.crt;  # 设置 SSL 证书路径
        ssl_certificate_key /etc/nginx/certs/ssl_certificate.key;  # 设置 SSL 证书私钥路径
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  # 配置 SSL 加密套件
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  # 启用的 SSL/TLS 协议版本
        ssl_prefer_server_ciphers on;  # 优先使用服务器配置的加密算法

        location / {
            root /var/www/secure;  # 设置 HTTPS 目录
            index index.html index.htm;  # 设置默认首页文件
        }
    }

    # 代理配置
    server {
        listen 8080;  # 监听 HTTP 8080 端口
        server_name proxy.example.com;  # 设置代理主机名

        location /api/ {
            proxy_pass http://backend_server;  # 将请求转发到后端服务器
            proxy_set_header Host $host;  # 设置请求头中的主机名
            proxy_set_header X-Real-IP $remote_addr;  # 设置客户端真实 IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 设置代理链中的客户端 IP
        }
    }
}