Featured image of post Nginx restart失败,原来是因为inotify设置太小

Nginx restart失败,原来是因为inotify设置太小

服务器使用 systemctl restart nginx 重启了一下Nginx,报了一个没遇到的错:

nginx.service: Failed to set a watch for PID file /run/nginx.pid: No space left on ,然而使用 df -h /run 查看,磁盘空间并没有满

使用 touch 命令新建 /run/nginx.pid 文件也没有用,restart nginx 报错信息没有变化,新建的 /run/nginx.pid 文件也被自动删除了

报错信息提到 Failed to set a watch,查找资料(问GPT)后发现,是由于inotify监视器数量设置的太小,使用 cat /proc/sys/fs/inotify/max_user_watches or sysctl fs.inotify.max_user_watches 查看,仅仅是8192

!(image2.png)

/etc/sysctl.conf 文件末尾追加 fs.inotify.max_user_watches=524288 , 重启nginx,一切恢复正常。

相关补充:

inotify 是 Linux 内核中的一个机制,用于监视文件系统事件。它允许程序监视文件或目录的变化,并在文件被修改、删除、创建等时发出通知。inotify 对文件系统的监控提供了一种高效的方式,避免了程序使用轮询(polling)来检测文件的变化。 fs.inotify.max_user_watches 定义了某个用户在其所有进程中能够创建的 inotify 监视器的总数量上限。 当监视器数量达到上限时,系统将无法再监控更多文件,这会导致错误,如 “No space left on device”。

PID 文件是 Linux 系统中常见的机制,用来记录某个服务的主进程 ID。 /run 目录(以前是 /var/run)是一个临时文件系统,系统启动时由内核挂载。该目录中的文件是临时的,系统重启后会被清除,通常用于存放进程的 PID 文件、套接字文件等短期存在的文件。 当 Nginx 启动时,它会根据配置文件中指定的路径创建一个 PID 文件,默认路径为 /run/nginx.pid

sysctl 是 Linux 和类 Unix 操作系统中的一个工具,用于 查看和动态修改内核参数。这些内核参数影响操作系统的网络、进程、内存管理、文件系统等方面的行为。 内核参数通常存储在 /proc/sys/ 目录下的文件中,sysctl 通过读取和修改这些文件来查看或更改内核配置。例如,/proc/sys/net/ipv4/ip_forward 文件存储了是否启用 IP 转发的设置。 要让修改永久生效(即系统重启后仍然保持),可以编辑 /etc/sysctl.conf 文件,或将配置添加到 /etc/sysctl.d/ 目录中的文件。