nginx 二进制程序默认位于 sbin 目录下,运行权限通常需要 root 启动后降权到普通用户。以下是详细说明和最佳实践配置。
默认路径与权限
标准安装路径
| 类型 | 默认路径 | 说明 |
|---|---|---|
| 二进制程序 | /usr/sbin/nginx 或 /usr/local/nginx/sbin/nginx | 主程序文件 |
| 配置文件 | /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf | 主配置 |
| 日志目录 | /var/log/nginx/ | 访问/错误日志 |
| 临时文件 | /var/cache/nginx/ 或 /var/tmp/nginx/ | 缓存、临时数据 |
| pid 文件 | /var/run/nginx.pid 或 /run/nginx.pid | 进程标识 |
文件权限检查
# 查看二进制权限 ls -l /usr/sbin/nginx # -rwxr-xr-x 1 root root 1.4m jan 15 09:23 /usr/sbin/nginx # 查看运行用户(编译时指定,默认 nobody) nginx -v 2>&1 | grep "user" # --user=nginx --group=nginx # 查看当前运行进程的用户 ps aux | grep nginx # root 1234 0.0 0.1 ... nginx: master process /usr/sbin/nginx # nginx 1235 0.0 0.2 ... nginx: worker process
权限配置详解
1. 主进程(master)权限
# 必须由 root 启动(绑定 80/443 端口需要特权) sudo /usr/sbin/nginx # 或 systemd 管理 sudo systemctl start nginx
为什么需要 root:
- 绑定特权端口(< 1024,如 80、443)
- 写入
/var/run/nginx.pid - 打开日志文件(通常属主为 root)
2. 工作进程(worker)降权
在 nginx.conf 顶部配置:
# 指定 worker 进程运行的用户和组 user nginx nginx; # 格式:user 用户名 组名; # 或仅指定用户(组同名) user www-data;
降权流程:
root 启动 master → 读取配置 → fork worker → worker 切换到 nginx 用户
3. 目录权限设置
# 创建专用用户(如果不存在) sudo useradd -r -s /sbin/nologin nginx # 网站目录(worker 需要读取) sudo chown -r nginx:nginx /var/www/html sudo chmod -r 755 /var/www/html # 日志目录(worker 需要写入) sudo mkdir -p /var/log/nginx sudo chown -r nginx:nginx /var/log/nginx sudo chmod 755 /var/log/nginx # 缓存/临时目录(如启用 fastcgi_cache) sudo mkdir -p /var/cache/nginx sudo chown -r nginx:nginx /var/cache/nginx sudo chmod 750 /var/cache/nginx # pid 目录(master 写入,worker 只读) sudo chown root:root /var/run sudo chmod 755 /var/run
生产环境安全配置
最小权限原则配置
# /etc/nginx/nginx.conf # 1. 降权运行(必须配置在全局块顶部) user nginx nginx; # 2. 限制 worker 数量(通常等于 cpu 核心数) worker_processes auto; # 3. 限制单个 worker 连接数 worker_connections 1024; # 4. 禁用版本信息泄露 server_tokens off; # 5. 限制文件上传大小(防 dos) client_max_body_size 10m;
文件系统权限加固脚本
#!/bin/bash # nginx-permission-hardening.sh nginx_user="nginx" nginx_group="nginx" nginx_sbin="/usr/sbin/nginx" nginx_conf="/etc/nginx" nginx_log="/var/log/nginx" nginx_cache="/var/cache/nginx" # 1. 设置二进制权限(root 执行,其他只读) sudo chown root:root $nginx_sbin sudo chmod 755 $nginx_sbin sudo chmod u+s $nginx_sbin # 可选:suid,允许普通用户绑定特权端口(不推荐) # 2. 配置文件(root 可写,worker 只读) sudo chown -r root:root $nginx_conf sudo chmod -r 755 $nginx_conf sudo chmod -r 644 $nginx_conf/conf.d/* # 站点配置 # 3. 敏感文件保护(如包含密码的上游配置) sudo chown root:root $nginx_conf/conf.d/upstream.conf sudo chmod 600 $nginx_conf/conf.d/upstream.conf # 4. 日志目录(worker 可写) sudo mkdir -p $nginx_log sudo chown -r $nginx_user:$nginx_group $nginx_log sudo chmod 755 $nginx_log # 5. 缓存目录(worker 可写) sudo mkdir -p $nginx_cache sudo chown -r $nginx_user:$nginx_group $nginx_cache sudo chmod 750 $nginx_cache # 6. 设置 acl(如需多用户访问) sudo setfacl -r -m u:$nginx_user:rx $nginx_conf sudo setfacl -r -m d:u:$nginx_user:rx $nginx_conf echo "nginx permissions hardened."
特殊场景处理
场景 1:非 root 用户管理 nginx(开发环境)
# 编译时指定非特权端口和自定义路径
./configure \
--prefix=/home/dev/nginx \
--sbin-path=bin/nginx \
--conf-path=conf/nginx.conf \
--pid-path=logs/nginx.pid \
--http-log-path=logs/access.log \
--error-log-path=logs/error.log \
--http-client-body-temp-path=temp/client_body \
--http-proxy-temp-path=temp/proxy \
--http-fastcgi-temp-path=temp/fastcgi \
--user=dev \
--group=dev
# 监听 8080 端口(无需 root)
server {
listen 8080;
...
}场景 2:capabilities 特权降权(linux 特有)
# 给 nginx 二进制添加绑定特权端口的能力,无需 root 启动 sudo setcap cap_net_bind_service=+ep /usr/sbin/nginx # 验证 getcap /usr/sbin/nginx # /usr/sbin/nginx = cap_net_bind_service+ep # 此时可用普通用户启动,但仍能绑定 80/443 sudo -u nginx /usr/sbin/nginx
场景 3:systemd 服务配置
# /lib/systemd/system/nginx.service [unit] description=a high performance web server and a reverse proxy server after=network.target [service] type=forking pidfile=/run/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=/bin/kill -s quit $mainpid privatetmp=true # 安全加固 user=root # 启动用户(master) group=root umask=0027 nonewprivileges=true protectsystem=full protecthome=true [install] wantedby=multi-user.target
故障排查
# 检查权限错误 sudo -u nginx /usr/sbin/nginx -t # 如果报错 "permission denied",说明 worker 用户无法读取配置 # 检查端口绑定权限 sudo -u nginx /usr/sbin/nginx # bind() to 0.0.0.0:80 failed (13: permission denied) # 检查日志写入权限 sudo -u nginx touch /var/log/nginx/test # 测试 worker 是否能写入日志 # 查看详细启动日志 sudo strace -e trace=file /usr/sbin/nginx 2>&1 | grep -e "(open|access|stat)"
总结
| 组件 | 推荐属主 | 推荐权限 | 说明 |
|---|---|---|---|
| /usr/sbin/nginx | root:root | 755 | 二进制程序 |
| /etc/nginx/ | root:root | 755/644 | 配置文件 |
| /var/log/nginx/ | nginx:nginx | 755 | 日志目录 |
| /var/cache/nginx/ | nginx:nginx | 750 | 缓存目录 |
| 网站根目录 | nginx:nginx | 755/644 | 静态文件 |
| 上传目录 | nginx:nginx | 755/644 | 如有上传功能 |
核心原则:master 进程保持 root 启动以获取必要特权,worker 进程严格降权到普通用户运行,文件系统权限遵循最小必要原则。
到此这篇关于nginx二进制程序文件sbin路径及其运行权限的文章就介绍到这了,更多相关nginx sbin路径及权限内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论