---
URL: "/zh-CN/blog/2024-10/nginx_too_many_files.html"
LLMS_URL: "/zh-CN/blog/2024-10/nginx_too_many_files.md"
lastUpdated: true
commentabled: true
recommended: true
title: "解决Nginx出现“Too many open files”的问题"
description: "解决Nginx出现“Too many open files”的问题"
date:

pageClass: "blog-page-class"
cover: "/covers/nginx.svg"
---

---
lastUpdated: true
commentabled: true
recommended: true
title:  解决Nginx出现“Too many open files”的问题
description: 解决Nginx出现“Too many open files”的问题
date: 2024-10-23 10:18:00
pageClass: blog-page-class
cover: /covers/nginx.svg
---

# 解决Nginx出现“Too many open files”的问题 #

## 引言 ##

在进行压力测试时，自建`CDN`节点的Nginx可能会出现`“Too many open files”`错误。这通常意味着Nginx尝试打开的文件数量超出了系统的限制，而这在高并发情况下尤为明显。本文将详细介绍如何识别和解决这一问题，确保Nginx在负载较高时仍能正常运行。

## 什么是ulimit ##

`ulimit`是一个用于限制系统用户对`shell`资源访问的命令。它的主要功能是控制单个用户或进程能够使用的资源数量，防止因资源占用过多而导致系统崩溃或性能下降。在压力测试期间，`Nginx`需要处理大量的并发请求，这会导致打开的文件描述符数量急剧增加。

具体来说，`ulimit`可以限制以下几种资源：

- 打开的文件描述符数量（nofile）
- 最大进程数（nproc）
- 内存使用量（memlock）

这些限制确保每个用户或进程不会过度消耗系统资源。

## 查看当前限制 ##

要查看当前用户的文件打开限制，可以在终端输入以下命令：

```bash
ulimit -n
```

这条命令将返回当前用户最大可打开的文件数，通常默认值为`1024`。这个值在进行压力测试时很可能会成为瓶颈，因为`Nginx`的工作进程和客户端连接数都可能超过这个限制。

## 修改ulimit限制 ##

### 临时修改 ###

在进行压力测试之前，您可以通过以下命令临时修改打开文件的数量（例如设置为65535）：

```bash
ulimit -n 65535
```

此修改仅在当前终端会话中生效，关闭终端后将失效。因此，对于临时的测试需求，这种方法是快速的解决方案。
永久修改
为了使更改在系统重启后依然有效，需要编辑`/etc/security/limits.conf`文件。可以在文件底部添加以下配置：

```plaintext
* soft nofile 65535
* hard nofile 65535
```

- *表示对所有用户生效。
- soft nofile定义了软限制，用户可以在不需要提升权限的情况下修改。
- hard nofile定义了硬限制，表示管理员设置的最大限制，用户无法超过。

保存文件后，再次执行`ulimit -n`命令以确认修改已经生效。

## 修改Nginx配置 ##

为了确保Nginx能够使用新的打开文件限制，您还需要修改Nginx的配置文件。在`nginx.conf`中添加以下行：

```text
worker_rlimit_nofile 65535;
```

- `worker_rlimit_nofile`指令允许Nginx的工作进程增加打开文件的数量限制。这意味着在不重启主进程的情况下，工作进程能够处理更多的文件描述符。

修改完配置后，请使用以下命令重载Nginx配置：

```bash
nginx -s reload
```

这将使更改立即生效。

## 总结 ##

通过上述步骤，您成功地修改了`ulimit`和Nginx的相关限制，从而解决了在压力测试中出现的`“Too many open files”`错误。这将确保Nginx能够处理更多的并发连接，提升服务的稳定性和性能。建议在进行高负载测试前，检查系统设置，以确保它们适应不断变化的需求。
