需调整 LimitMEMLOCK 是因为 systemd 默认 64KB 不足,Nginx 启用 SSL 缓存等特性时需锁定几 MB 内存;应通过 systemctl edit nginx 在 [Service] 中设 LimitMEMLOCK=2097152 或 infinity,再 daemon-reload 并 restart。

在 Linux 下使用 systemd 管理 Nginx 时,若配置了 memlock 限制(如通过 limit -l 或 ulimit -l 设置),而 systemd 未显式允许足够内存锁定额度,Nginx 启动可能失败并报错:nginx: [alert] failed to setrlimit(RLIMIT_MEMLOCK, ...) 或直接拒绝启动。
为什么需要调整 LimitMEMLOCK
Nginx 在启用某些特性(如 ssl_buffer_size、部分 TLS 优化、第三方模块如 ngx_http_vhost_traffic_status_module 的共享内存区,或使用 ssl_session_cache shared)时,会尝试将 SSL 会话缓存、计数器等关键数据锁定在物理内存中,防止被交换到磁盘,以提升安全性和性能。这依赖 RLIMIT_MEMLOCK 资源限制,而 systemd 默认将该值设为 64K(即 65536 字节),远低于实际需求(通常需几 MB 到几十 MB)。
如何正确设置 LimitMEMLOCK
不建议修改全局 /etc/security/limits.conf,因为 systemd 服务默认忽略该文件;必须在服务单元文件中显式声明。
- 编辑 Nginx 的 systemd 单元文件:
sudo systemctl edit nginx(推荐方式,生成覆盖片段) - 在打开的编辑器中写入:
[Service] LimitMEMLOCK=infinity
或指定具体字节数(更安全,例如允许 2MB):
[Service] LimitMEMLOCK=2097152
- 保存退出后重载配置:
sudo systemctl daemon-reload - 重启 Nginx:
sudo systemctl restart nginx - 验证是否生效:
sudo systemctl show nginx | grep LimitMEMLOCK(应显示LimitMEMLOCK=2097152或infinity)
也可进入进程查看:
cat /proc/$(pgrep nginx)/limits | grep memlock
注意事项与常见问题
使用 infinity 虽方便,但存在安全隐患:若 Nginx 配置错误导致无限增长的共享内存段,可能耗尽物理内存。生产环境建议设为合理上限(如 2–8 MB),具体取决于 ssl_session_cache 大小和并发连接数。
-
ssl_session_cache shared:SSL:10m至少需对应LimitMEMLOCK ≥ 10 * 1024 * 1024(即 10485760) - 若同时启用
ssl_buffer_size或大量虚拟主机,建议上浮 2–3 MB 余量 - 确保内核支持内存锁定:
grep -i lock /proc/cpuinfo非必需,但需确认未禁用RLIMIT_MEMLOCK(一般默认开启) - SELinux 或 AppArmor 若启用,需确认策略未阻止
mlock()系统调用(较少见,但排查时可临时禁用测试)
替代方案:仅对特定 worker 进程生效
如果只想让主进程或 worker 进程之一锁定内存,Nginx 本身不提供细粒度控制;LimitMEMLOCK 是整个服务所有进程共用的限制。因此,统一设置是唯一可靠方式。若需隔离资源,应考虑拆分为多个 service 单元(如 nginx-main.service 和 nginx-api.service),各自独立配置 LimitMEMLOCK。










