1. Nginx 支持的负载均衡算法

    • 轮询
    • 加权轮询
    • ip 哈希
    • url 哈希
    • 最小连接数
    • 最小平均响应时间
    • 随机
  2. location 的匹配顺序

    • 精准匹配 =
    • ^~:路径长者优先
    • 正则匹配:~~*
    • 通用匹配:/,路径长者优先。
  3. servername 的匹配顺序

    1. 精准 server name 匹配
    2. 以 * 通配符开始的泛域名
    3. 以 * 通配符结束的泛域名
    4. 匹配正则表达式
    5. listen 指定的 default server_name
    6. http 模块下的第一个 server 配置块中的 server_name
  4. 重新加载配置文件的流程

    1. 向 master 发送 reload 信号
    2. 校验配置文件语法
    3. 打开新的监听端口
    4. master 用新配置文件启动新的 worker 子进程
    5. master 进程向旧 worker 子进程发送 quit 信号
    6. 旧 worker 进程关闭监听句柄,处理完当前连接后结束进程
  5. Nginx 调优

    • 合理设置 Nginx worker 进程数,并绑定不同 CPU

      可以通过 worker_cpu_affinity 将 Nginx worker 进程绑定到不同的 CPU 上,避免多个进程竞争同一个 CPU 资源,充分利用 CPU 多核资源.

      1
      2
      
      worker_processes  4;
      worker_cpu_affinity 0001 0010 0100 1000;
      
    • 使用 epoll 时间驱动模型,合理设置单个进程的最大连接数以及最大打开文件数量

      1
      2
      3
      4
      5
      
      events {
          use epoll;
          worker_connections 15000;
          worker_rlimit_nofile 65535;
      }
      
    • 开启 access_log_buffer缓冲区

      在高并发场景下,nginx 日志写入磁盘可能会极大的影响 nginx 的性能。

    • 开启高效文件传输模式,开启 gzip 压缩

      • 配置段 sendfile 参数用于开启文件高效传输模式
      • 配置段 gzip 参数可用于开启压缩功能
      1
      2
      3
      4
      
      http {
          gzip  on;
          sendfile on;
      }
      
    • 配置 Nginx 连接超时时间

      • 配置段 keepalive_timeout 参数用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接
      • 配置段 client_header_timeout 参数用于设置读取客户端请求头数据的超时时间。如果读取请求头超时,服务器将返回 “Request time out (408)” 错误.
      • 配置段 client_body_timeout 参数用于设置读取客户端请求主体数据的超时时间。如果读取请求体超时,服务器将返回 “Request time out (408)” 错误.
      • 配置段 send_timeout 参数用于指定响应客户端的超时时间,如果超时,Nginx 将会关闭连接.
      1
      2
      3
      4
      5
      6
      7
      
      http {
          # 在大并发时,需要合理调小如下参数
          keepalive_timeout  65;
          client_header_timeout 15;
          client_body_timeout 15;
          send_timeout 25;
      }
      
    • 限制连接和限制请求速率

      1
      2
      3
      4
      5
      
      http {
          limit_conn_zone $binary_remote_addr zone=addr:10m; # 设置 $binary_remote_addr 客户端地址的地址区域为 10m
          limit_conn ${zone} ${num}; # 设置指定 zone 的最大连接数
          limit_conn_status ${http_code}; # 设置超过最大连接数的状态码,默认 503
      }
      
    • 使用缓存,合理配置 Nginx expires

      expires 参数用于设置用户访问内容的缓存时间。用户会在本地浏览器中缓存这些内容,直到超过缓存时间。多用于配置静态内容

      1
      2
      3
      
      location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
          expires     3650d;
      }
      
    • 限制上传文件大小

      1
      2
      3
      
      http {
          client_max_body_size 8m;    # 设置客户端最大请求体大小为8M
      }
      
  6. 安全

    • 隐藏版本号

      在配置文件 http 配置段中添加 server_tokens off;

    • 只允许指定客户端访问

      1
      2
      3
      4
      
      location / {
          allow 192.168.1.1/24;
          deny all;
      }
      
    • 配置防盗链

      根据 HTTP referer 字段实现防盗链: referer 是 HTTP 的一个首部字段,用于指明用户请求的 URL 是从哪个页面通过链接跳转过来的

      1
      2
      3
      4
      5
      6
      
      location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ {
          valid_referers  none  blocked  *.test.com  *.abc.com; # 表示这些地址可以访问上面的媒体资源
          if ($invalid_referer) {
              # 如果不是从以上域名访问,则返回 403
              return 403
          }
      
  7. Nginx常用信号

    kill 信号 解释 nginx 命令
    TERM(15), INT(2) 快速停止 nginx -s stop
    QUIT(3) 优雅的停止 nginx -s quit
    HUP(1) 优雅的启动新的进程重新加载配置文件 nginx -s reload
    USR1(10) 日志文件滚动 nginx -s reopen
    USR2(12) 升级二进制可执行文件 -
    WINCH(28) 优雅的关闭 worker 进程