最稳妥的做法是用 shell 脚本配合 launchd 实现——它原生、轻量、开机自启且能自动拉起失败服务;脚本检查 Nginx 主进程,缺失则校验配置后启动,异常时记录日志;再通过 launchd 每 30 秒调用该脚本实现自动恢复。

MacOS 下让 Nginx 在崩溃后自动重启,不依赖第三方进程管理器(如 launchd 以外的方式),最稳妥的做法是用 shell 脚本配合 launchd 实现——它原生、轻量、开机自启且能自动拉起失败服务。
一、编写检测并重启 Nginx 的 Shell 脚本
脚本核心逻辑:检查 Nginx 主进程是否存在,若无则尝试启动;有但无响应,先优雅停止再启动。避免重复启动或权限问题。
在终端执行以下命令创建脚本:
sudo nano /usr/local/bin/nginx-watchdog.sh填入内容:
#!/bin/bash
# 检查 nginx 是否运行(通过主进程)
if ! pgrep -x "nginx" > /dev/null; then
echo "$(date): nginx not running, restarting..." >> /var/log/nginx-watchdog.log
# 尝试启动(使用 brew 安装的 nginx,路径可能为 /opt/homebrew/bin/nginx 或 /usr/local/bin/nginx)
if command -v nginx >/dev/null 2>&1; then
nginx -t &>/dev/null && nginx
if [ $? -eq 0 ]; then
echo "$(date): nginx started successfully." >> /var/log/nginx-watchdog.log
else
echo "$(date): nginx start failed (config error?)." >> /var/log/nginx-watchdog.log
fi
else
echo "$(date): nginx command not found." >> /var/log/nginx-watchdog.log
fi
else
# 可选:进一步验证是否可响应(如 curl -Is http://localhost | head -1 | grep "200\|301")
true
fi
保存后赋予执行权限:
sudo chmod +x /usr/local/bin/nginx-watchdog.sh手动测试一次:
sudo /usr/local/bin/nginx-watchdog.sh二、配置 launchd 实现每 30 秒检测一次
macOS 不推荐用 cron 做高频轮询(尤其 launchd 更合适。需写一个 .plist 文件,放在系统级 LaunchDaemons 目录下(需 root 权限)。
创建 plist 文件:
sudo nano /Library/LaunchDaemons/local.nginx.watchdog.plist内容如下(注意替换 UserName 为你实际的管理员用户名,如 john;若用 brew 安装 nginx,通常无需指定用户,但 launchd 要求明确):
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict><key>Label</key><string>local.nginx.watchdog</string><pre class="brush:php;toolbar:false;"><key>ProgramArguments</key><array><string>/usr/local/bin/nginx-watchdog.sh</string></array><key>RunAtLoad</key><true></true><key>StartInterval</key><integer>30</integer><key>StandardOutPath</key><string>/var/log/nginx-watchdog.log</string><key>StandardErrorPath</key><string>/var/log/nginx-watchdog.log</string><key>UserName</key><string>root</string><key>KeepAlive</key><false></false>
加载并启用服务:
sudo launchctl load /Library/LaunchDaemons/local.nginx.watchdog.plistsudo launchctl start local.nginx.watchdog
查看状态是否运行:
sudo launchctl list | grep nginx三、关键注意事项与排错建议
-
Nginx 配置必须正确:脚本中调用了
nginx -t,若配置语法错误,重启会失败,日志里会有提示。 -
路径要匹配实际安装位置:M1/M2 Mac 用 Homebrew 安装时,nginx 可能在
/opt/homebrew/bin/nginx,脚本中可改成/opt/homebrew/bin/nginx -t && /opt/homebrew/bin/nginx。 -
日志目录需存在且可写:执行
sudo touch /var/log/nginx-watchdog.log && sudo chmod 644 /var/log/nginx-watchdog.log。 -
不要同时启用 brew services start nginx:避免和 watchdog 冲突,停用它:
brew services stop nginx。 - 调试时临时缩短 StartInterval 到 10 秒,验证逻辑后再改回 30 秒或 60 秒。
四、验证与日常维护
模拟 Nginx 崩溃测试:
sudo nginx -s stoptail -f /var/log/nginx-watchdog.log
几秒后应看到 “nginx started successfully” 日志。关闭 tail 后,也可用以下命令确认进程已恢复:
ps aux | grep nginx长期运行中,定期检查日志是否有频繁重启记录,可能是配置、端口占用或资源不足导致:
sudo tail -20 /var/log/nginx-watchdog.log如需禁用该守护任务,运行:
sudo launchctl unload /Library/LaunchDaemons/local.nginx.watchdog.plist不复杂但容易忽略细节:权限、路径、日志写入、冲突服务。按步骤配好后,Nginx 就真正“稳住”了。










