Kobayashi
2021-11-02 00:29:31 +08:00
你没说清楚直接跑 nginx 用的什么命令。不过好像这并不重要。
区别
- brew: launchd 管理前台进程 nginx -g daemon off; 也就是类似于 systemd (毕竟 systemd 参考了 launchd )
- 你自己运行: nginx. nginx 自行管理进程(后台)
我觉得可能问题不在于这 2 个命令,而在于权限(执行权限和配置、日志等权限)。brew services 不支持 root (会有副作用,等下讲)。有些服务监听在小于 1024 端口,需要 root 权限。
brew services 创建用户级别 LaunchAgent (~/Library/LaunchAgents )。sudo brew services 创建系统级别 LaunchDaemon (/Library/LaunchDaemons )。
HOMEBREW_PREFIX (/usr/local for x86, /opt/homebrew for arm64 )下文件权限是 $USER:staff 。sudo brew services nginx 会修改 nginx 相关文件权限为 root:admin 。之后的 brew update 等命令由于无法访问 root:admin 权限的文件,从而执行报错。
所以,sudo brew services 不是不可以使用,但每次你使用过后应该修复文件权限。
# For x86 Mac
sudo chown -R "$(whoami):admin" /usr/local/*
# For M1 Mac
sudo chown -R "$(whoami):admin" /opt/homebrew/*
(可以用 find 优化一下)
结论 /使用策略:使用 Homebrew 时,能避免 sudo 就别用,如 监听在 3306 的 MySQL ,这端口完全可以用普通用户权限监听。Nginx (80, 443), dnsmasq unbound (53) 可以用 sudo brew services ,但记得修复文件权限。