MacOS - brew 里运行 nginx 和直接运行 nginx ,有什么区别吗?

2021-11-01 23:17:22 +08:00
 oooolongtea
最近在做一个项目,要用 nginx 做一个中间桥梁。

我试了 sudo brew services start nginx ,这个没让项目跑起来。brew services list 显示 nginx 的 status 是 error 。

于是我直接跑 nginx ,在 ps -ef | grep nginx 中也可以看到 nginx 跑起来了。我再试了一下项目,发现项目跑起来了。

我想知道这两种跑的方式有什么区别吗?我搜了一下没搜到什么有用的信息。
2641 次点击
所在节点    NGINX
6 条回复
clague
2021-11-01 23:54:17 +08:00
我觉得你看日志就行了
0superx0
2021-11-01 23:59:40 +08:00
个人了解,相当于 ubuntu 的 apt 跟 dpkg 的区别...
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 ,但记得修复文件权限。
dingwen07
2021-11-02 06:24:58 +08:00
@0superx0 #2 感觉更像是 systemd 和直接运行的区别吧
julyclyde
2021-11-02 12:22:27 +08:00
brew services 是托管给 launchd 的,相当于系统服务。和 linux 里 systemd 类似。都是定义了后台服务的生命周期和状态的

你手工运行那个,就仅仅是一个进程而已
kingxiangqi
2021-12-22 22:28:34 +08:00
@Kobayashi #3 这个问题应该已经被修复了?
https://github.com/Homebrew/homebrew-services/pull/188

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812279

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX