memorymax 可限制 nginx 最大内存使用量,需通过 systemctl edit nginx.service 创建覆盖配置设置(如 memorymax=512m),再 daemon-reload 并 restart 生效;其为硬限制,超限将触发 oom killer。

在 Linux 下使用 systemd 管理 Nginx 服务时,可以通过 MemoryMax 限制其最大内存使用量,防止因内存泄漏或突发请求导致 OOM(Out of Memory)被系统 kill。该设置需写入 Nginx 的 systemd 单元覆盖配置中,不能直接修改原始 unit 文件。
确认 Nginx 使用的 systemd 单元名
大多数发行版中,Nginx 对应的单元名为 nginx.service。可通过以下命令验证:
若使用 OpenResty 或自定义安装路径,单元名可能为 openresty.service 或其他名称,请以实际为准。
创建 systemd 覆盖配置(推荐方式)
不建议直接编辑 /usr/lib/systemd/system/nginx.service(会被包管理器覆盖),应使用 systemctl edit 创建覆盖片段:
- 运行 sudo systemctl edit nginx.service
- 输入以下内容(示例限制为 512MB):
MemoryMax=512M
保存后,systemd 会自动在 /etc/systemd/system/nginx.service.d/override.conf 中生成对应文件。
生效并验证配置
执行以下步骤使新限制生效:
- sudo systemctl daemon-reload —— 重新加载 unit 配置
- sudo systemctl restart nginx.service —— 重启服务
- 检查是否加载成功:systemctl show nginx.service | grep MemoryMax
- 运行中验证内存限制是否生效:cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.max(返回值如 536870912 表示 512MB)
注意事项与常见问题
MemoryMax 是硬限制,超出后内核会触发 OOM killer 杀死 Nginx 进程(而非仅限流或拒绝请求)。因此建议结合监控(如 systemctl status nginx、journalctl -u nginx)观察实际内存占用,留出安全余量。
- 单位支持
K、M、G、B,如1G、256M - 若系统未启用 memory controller(cgroup v2),
MemoryMax不生效;可检查 cat /proc/cgroups | grep memory,确保enabled列为 1 - Nginx 多 worker 进程共享该限制,不是每个 worker 独立限制
- 搭配
MemoryHigh可实现更温和的内存压力响应(如触发内核回收页缓存),但MemoryMax才是强制上限











