5 高级配置

felix.shao2025-02-18

5 高级配置

TIP

 本小节主要介绍以下知识:

  • 针对 IPv4 的内核参数优化
  • 针对处理器的指令配置
  • 针对网络连接的指令配置
  • 与事件驱动相关的指令配置

概述

 Nginx 服务器运行的实际环境和提供的功能千差万别,如何根据自己的工作经验和具体的使用环境为 Nginx 服务器配置恰当的指令,才是 Nginx 配置的核心内容。

针对 IPv4 的内核 7 个参数的配置优化

 这里提及的参数是和 IPv4 网络有关的 Linux 内核参数。我们可以将这些内核参数的值追加到 Linux 系统的/etc/sysctl.conf文件中,然后使用如下命令使修改生效:# /sbin/sysctl -p

  1. net.core.netdev_max_backlog 参数
     该参数net.core.netdev_max_backlog,表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。一般默认值为 128。Nginx 服务器中定义的 NGX_LISTEN_BACKLOG 默认为 511。我们可以将它调整以下:
    net.core.netdev_max_backlog = 262144

  2. net.core.somaxconn 参数
     该参数用于调节系统同时发起的 TCP 连接数,一般默认值为 128。在客户端存在高并发请求的情况下,该默认值配置较小,可能导致链接超时或者重传问题,我们可以根据实际需要结合并发请求数来调节此值。示例设置为:
    net.core.somaxconn = 262144

  3. net.ipv4.tcp_max_orphans 参数
     该参数用于设定系统中最多允许存在多少 TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的TCP套接字将立即被复位,同时给出警告信息。这个限制只是为了防止简单的 DoS 攻击。一般在系统内存比较充足的情况下,可以增大这个参数的赋值:
    net.ipv4.tcp_max_orphans = 262144

  4. net.ipv4.tcp_max_syn_backlog 参数
     该参数用于记录尚未收到客户端确认信息的连接请求的最大值。对于拥有 128 MB 内存的系统而言,此参数的默认值是 1024,对小内存的系统则是 128.一般在系统内存比较充足的情况下,可以增大这个参数的赋值:
    net.ipv4.tcp_max_syn_backlog = 262144

  5. net.ipv4.tcp_timestamps 参数
     该参数用于设置时间戳,这可以避免序列号的卷绕。在一个 1Gb/s 的链路上,遇到以前用过的序列号的概率很大。当此值赋值为 0 时,禁用对于 TCP 时间戳的支持。在默认情况下,TCP 协议会让内核接受这种“异常”的数据包。针对 Nginx 服务器来说,建议将其关闭:
    net.ipv4.tcp_timestamps = 0

  6. net.ipv4.tcp_synack_retries 参数
     该参数用于设置内核放弃 TCP 连接之前向客户端发送 SYN + ACK 包的数量。为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送 SYN 并附带一个回应前一个 SYN 的 ACK,一般赋值为1,即内核放弃连接发送一次 SYN + ACK 包,可以设置其为:
    net.ipv4.tcp_synack_retries = 1

  7. net.ipv4.tcp_syn_retries 参数
     该参数的作用与上一个类似,设置内核放弃连接之前发送 SYN 包的数量,它的赋值和上个参数一样即可:
    net.ipv4.tcp_syn_retries = 1

针对 CPU 的 Nginx 配置优化的 2 个指令

worker_processes 指令

 worker_processes 指令用来设置 Nginx 服务的进程数。官方文档建议此指令一般设置为 1 即可,赋值太多会影响系统的 IO 效率,降低 Nginx 服务器的性能。
 设置好 worker_processes 指令之后,就很有必要设置 work_cpu_affinity 指令。 :::  参考《Nginx 高性能 Web 服务器详解》  根据作者经验,为了让多核 CPU 能够很好的并行处理任务,我们可以将 worker_processes 指令的赋值适当地增大一些,最好是赋值为机器 CPU 的倍数。当然,这个值并不是越大越好,Nginx 进程太多可能增加主进程调度负担,也可能影响系统的 IO 效率。针对双核 CPU,建议设置为 2 或 4。示例:
worker_processes 4; :::

work_cpu_affinity 指令

 work_cpu_affinity 指令用来为每个进程分配 CPU 的工作内核。这个指令的设置比较麻烦,与二进制有关,具体略。示例值如下:
work_cpu_affinity 0001 0100 1000 0010;
 四组二进制数值分别对应 4 个进程,第一个进程对应 0001,表示使用第一个第一个 CPU 内核;第二个进程对应 0010,表示使用第二个 CPU 内核,以此类推。

与网络连接相关的配置 4 个指令

  1. keepalive_timeout 指令
     该指令用于设置 Nginx 服务器与客户端保持连接的超时时间。
     这个指令支持两个选项,中间用空格隔开。第一个选项指定客户端连接保持活动的超时时间,在这个事件之后,服务器会关闭此连接;第二个选项可选,其指定了使用 Keep-Alive 消息头保持活动的有效时间,如果不设置它,Nginx 服务器不会向客户端发送 Keep-Alive 消息头以保持与客户端某些浏览器(如 Mozilla )的连接,超过设置的时间后,客户端就可以关闭连接,而不需要服务器关闭了。下面是此指令的设置示例:
    keepalive_timeout 60 50;
     该设置标识 Nginx 服务器与客户端连接保持活动的时间是 60s,60s 后服务器与客户端断开连接;使用 Keep-Alive 消息头保持与客户端某些浏览器的连接时间为 50s,50s 后浏览器主动与服务器断开连接。

  2. send_timeout 指令
     该指令用于设置 Nginx 服务器响应客户端的超时时间,这个超时时间仅针对两个客户端和服务器之间建立连接后,某次活动之间的时间。如果这个时间后客户端没有任何活动,Nginx 服务器将会关闭连接。此指令的设置需要考虑服务器访问数量和网络状况等方面。下面是此指令的设置示例:
    send_timeout 10s;
     该设置标识 Nginx 服务器与客户端建立连接后,某次会话中服务器等待客户端响应超过 10s,就会自动关闭连接。

  3. client_header_buffer_size 指令
     该指令用于设置 Nginx 服务器允许的客户端请求头部的缓冲区大小,默认为 1KB。此指令的赋值可以根据系统分页大小来设置。分页大小可以用以下命令取得:
    # getconf PAGESIZE
    一般将此指令赋值为 4KB 大小(同默认分页大小),即:
    client_header_buffer_size 4k;

  4. multi_accept 指令  该指令用于配置 Nginx 服务器是否尽可能多地接受客户端的网络连接请求,默认值为 off

与事件驱动模型相关的配置的 8 个指令

  1. use指令
     use 指令用于指定 Nginx 服务器使用的事件驱动模型

  2. worker_connections 指令
     该指令用于设置 Nginx 服务器的每个工作进程允许同时连接客户端的最大数量,语法为:
    worker_connections number
     其中,number 为设置的最大数量。结合 worker_processes 指令,我们可以计算出 Nginx 服务器允许同时连接的客户端最大数量 Client=worker_processes * worker_connections / 2
     此指令设置的就是 Nginx 服务器能接受的最大访问量,包括前端用户连接也包括其他连接,一般设置为 65535,注意要修改下句柄,不然会报错: worker_connections 65535

TIP

 worker_connections 不能超过 open file resourse limit (进程可以打开的文件句柄数量)
 查看 open file resourse limit 值命令:cat /proc/sys/fs/file-max
 可以将其设为 2390251:echo "2390251" > /proc/sys/fs/file-max; sysctel -p

  1. worker_rlimit_sigpending 指令
     该指令用于设置 Linux2.6.6-mm2 版本之后 Linux 平台的事件信号队列长度上限。其语法结构为:
    worker_rlimit_sigpending limit
     其中,limit 为 Linux 平台事件信号队列的长度上限值。
     该指令主要影响事件驱动模型中 stsig 模型可以保存的最大信号数。Nginx 服务器的每一个工作进程由自己的时间信号队列用于暂存客户端请求发生信号,如果超过长度上限,Nginx 服务器自动专用 poll 模型处理未处理的客户端请求。为了保证 Nginx 服务器对客户端请求的高效处理,请大家根据实际的客户端并发请求数量和服务器运行环境的处理能力设定该值。设置示例为:
    worker_rlimit_sigpending 1024;

  2. devpoll_changes 和 devpoll_events 指令
     这两个指令用于设置在 /dev/poll 事件驱动模式下 Nginx 服务器可以与内核之间传递事件的数量,前者设置传递给内核的事件数量,后者设置从内核获取的事件数量。语法结构如下,其中 number 为要设置的数量,默认值均为 32:

devpoll_changes number
devpoll_events number
  1. kqueue_changes 和 kqueue_events 指令 这两个指令用于设置在 kqueue 事件驱动模式下 Nginx 服务器可以与内核之间传递事件的数量,前者设置传递给内核的事件数量,后者设置从内核获取的事件数量。语法结构如下,其中,number 为要设置的数量,默认值均为 512:
kqueue_changes number
kqueue_events number

 使用 kqueue_changes 方式,可以设置与内核之间传递事件的数量。

  1. epoll_events 指令  该指令用于设置在 epoll 事件驱动模式下 Nginx 服务器可以与内核之间传递事件的数量,其语法结构为: epoll_changes number
     其中,number 为要设置的数量,默认值均为 512

  2. rtsig_signo 指令  该指令用于设置 rtsig 模式使用的两个信号中的第一个,第二个信号实在第一个信号的编号上加 1,语法为:
    rtsig_signo signo
     默认的第一个信号设置为 SIGRTMIN + 10

TIP

 在 Linux 中可以使用以下命令查看系统支持的 SIGRTMIN 有哪些:# kill -l | grep SIGRTMIN

  1. rtsig_oberflow_* 指令  该指令代表三个具体的指令,分别为 rtsig_oberflow_events、rtsig_oberflow_test、rtsig_oberflow_threshold 指令。这些指令用来控制当 rtsig 模式中信号队列溢出时 Nginx 服务器的处理方式。它们的语法结构为:
    rtsig_oberflow_* number
     其中,number 是要设定的值:
  • rtsig_oberflow_events:指定队列溢出时使用 poll 库处理的时间数,默认值为 16。
  • rtsig_oberflow_test:指定 poll 库处理完第几件事件后将清空 rtsig 模型使用的信号队列,默认值为 32。
  • rtsig_oberflow_threshold:指定 rtsig 模式使用的信号队列中的事件超过多少时就需要清空队列了。该指令只对 Linux2.4.x 及以下版本有效。在这些版本中包含两个参数:分别是 proc/sys/kernel/rtsig-nr 和 /proc/sys/kernel/rtsig-max/rtsig_overflow_threshold,后者就是该指令设定的值。当 Nginx 服务器检测到前者大于后者时,将清空队列。该指令默认值为 10,代表 rtsig-max 的 1/10。

参考文献

  • [Nginx 高性能 Web 服务器详解]
Last Updated 2/18/2025, 5:05:12 PM