Nginx 性能调优?先从搞懂 `worker_processes` 和 `worker_connections` 开始


嘿,朋友!你的网站或应用是不是越来越受欢迎,但速度却开始有点跟不上了?别急,这很正常。在性能优化的世界里,Nginx 有两个最基础也最关键的配置项,它们就是 worker_processesworker_connections

把这两个参数设置好了,就像给你的跑车换上了合适的引擎和轮胎,能让它在信息的赛道上跑得更快、更稳。今天,我们就用最简单直接的方式,聊聊这两个“家伙”到底是什么,以及怎么把它们调到最佳状态。

Nginx 是怎么工作的?先了解主从架构

在深入配置之前,你得先知道 Nginx 是怎么干活的。它采用的是一种高效的“主从”工作模式(Master-Worker)。

  • Master 进程(主进程):相当于一个工头。它不处理具体的网络请求,主要负责读取和验证配置文件、管理手下的 Worker 进程。
  • Worker 进程(工作进程):这些才是真正干活的工人。它们由 Master 进程创建,负责接收和处理来自客户端的成千上万个请求。

我们要优化的,就是这些“工人”的数量和他们每个人的“工作能力”。

worker_processes:我该雇佣多少工人?

worker_processes 这个指令决定了 Nginx 要启动多少个 Worker 进程来处理请求。

黄金法则:CPU 有几个核,就设置多少个

最常见也是最推荐的做法是,将 worker_processes 的数量设置为你服务器的 CPU 核心数。 这样可以最大限度地利用硬件资源,每个核心都跑一个 Worker 进程,既避免了进程间争抢 CPU 资源,也保证了 CPU 的高效率运行。

如何查看你的 CPU 核心数?

在 Linux 系统上,用下面这个命令就能轻松搞定:

grep processor /proc/cpuinfo | wc -l

比如,这个命令返回了 4,那你的服务器就有 4 个 CPU 核心。

代码配置

知道了核心数,配置就很简单了。打开你的 nginx.conf 文件(通常在 /etc/nginx/ 目录下),找到 worker_processes 指令。

推荐方式(偷懒又高效):

Nginx 提供了一个 auto 选项,它会自动检测你的 CPU 核心数并进行设置。这是最省事也最不容易出错的方法。

worker_processes auto;

手动设置方式:

如果你想精确控制,也可以手动填上你查到的核心数。

# 假设你的服务器是 4 核
worker_processes 4;

小提示:是不是设置得越多越好?绝对不是!如果设置的数量超过了 CPU 核心数,多出来的进程大部分时间都会在“摸鱼”(空闲),反而会增加系统在不同进程之间切换的开销,得不偿失。

worker_connections:每个工人能同时接待多少客户?

worker_connections 定义了每一个 Worker 进程能够同时处理的最大连接数。 这里的“连接”不仅仅指浏览器和服务器的连接,还包括 Nginx 作为反向代理时与后端服务器的连接等。

所以,你的 Nginx 服务器理论上能处理的最大并发连接数可以用一个简单的公式来估算:

最大并发连接数 ≈ worker_processes × worker_connections

这个值该怎么定?

这个值的设定比 worker_processes 要灵活一些,但它受限于一个重要的系统参数:文件描述符(File Descriptor)。在 Linux 中,每一个网络连接都会占用一个文件描述符。如果 worker_connections 的值设置得太高,超出了系统的文件描述符限制,Nginx 就会报错。

如何查看系统的文件描述符限制?

使用 ulimit 命令:

ulimit -n

这个命令可能会返回 102465535 等数值。这个值就是操作系统允许单个进程打开的最大文件句柄数。

代码配置与案例

worker_connections 指令位于 nginx.confevents 配置块中。

案例一:小型博客(1核 CPU,低流量)

对于个人博客或小型网站,默认的 7681024 通常就够用了。

worker_processes 1;

events {
    worker_connections 1024;
}

这个配置意味着你的服务器最多能处理 1 * 1024 = 1024 个并发连接,对于小型应用来说绰绰有余。

案例二:中型电商网站(4核 CPU,高流量)

对于流量较高的网站,你需要把这个值调高,并且同时提升文件描述符的限制。直接在 Nginx 配置文件中调整是最方便的。

这里要引入另一个非常有用的指令:worker_rlimit_nofile。它可以直接为 Nginx 的 Worker 进程设置打开文件的数量限制,覆盖系统的默认值。

worker_processes 4;
# 为 Worker 进程设置更高的文件描述符限制
worker_rlimit_nofile 40960;

events {
    # 确保 worker_connections 小于或等于 worker_rlimit_nofile
    worker_connections 10240;
}
  • 配置解析
    • worker_rlimit_nofile 40960;:我们将每个 Worker 进程能打开的文件描述符上限提升到了 40960。
    • worker_connections 10240;:我们让每个 Worker 能处理 10240 个连接。
    • 总并发能力约为 4 * 10240 = 40960,这足以应对大多数高流量场景。

重点worker_rlimit_nofile 的值必须大于或等于 worker_connections 的值,否则配置会不生效或引发问题。

总结一下

好了,让我们快速回顾一下今天的核心要点:

  1. **worker_processes**:设置成 auto 是最佳实践,让 Nginx 自动匹配你的 CPU 核心数。
  2. **worker_connections**:根据你的预估流量来设置,但要确保它不超过系统的文件描述符限制。
  3. **worker_rlimit_nofile**:当你需要大幅提高 worker_connections 时,别忘了用它来“解锁”文件描述符的上限。

性能优化不是一蹴而就的,更没有一个放之四海而皆准的“完美配置”。最好的方法是:先了解你的业务场景,设置一个合理的初始值,然后通过压力测试工具(如 ApacheBench (ab)、Siege 等)来检验效果,并根据测试结果不断微调

现在,轮到你了!打开你的 nginx.conf 文件,动手优化,让你的网站飞起来吧!


  目录