nginx-common 包附带的 systemd 单元文件以 root 身份运行主进程,这让我很紧张。
我认为它以 root 身份运行的唯一原因是绑定端口 80,但以 root 身份运行有点小题大做,因此我以普通用户身份运行它并赋予它该CAP_NET_BIND_SERVICE
功能。
我已将单元文件调整为如下所示:
[Service]
Type=forking
PIDFile=/var/run/nginx/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=/usr/sbin/nginx -s quit
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
Capabilities=cap_net_bind_service+=ep
user=www-data
这种方法有什么缺点吗?nginx 是否因为其他原因需要 root 权限?有没有更好的方法来锁定 nginx?我知道有些人喜欢 chroot 它,但这似乎很麻烦。
答案1
主进程必须以 root 身份运行,否则 nginx 将无法绑定到端口 80,因为这是一个特权端口。
http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html
您应该确保工作进程使用不同的用户。您可以在 中指定此用户nginx.conf
。