温馨提示×

Debian系统中Nginx权限设置指南

小樊
46
2025-11-16 07:13:03
栏目: 智能运维

一 运行身份与最小权限原则

  • Debian 上,Nginx 通常以系统用户 www-data 运行(可在 /etc/nginx/nginx.conf 的顶层 user 指令查看/调整)。涉及脚本执行时,还需确认 PHP-FPM 的运行用户与组,二者应仅拥有完成其功能所需的最小权限。
  • 文件与目录的访问遵循 Linux 基本规则:要读取目录内文件,需要对目录具备“执行(x)”权限;文件本身需对相应进程用户具备“读®”权限。
  • 禁止以 root 身份直接运行 Nginx 或 PHP-FPM 进程,避免权限过高导致风险。
  • 若配置中使用了 alias 指令,建议将 location 的路径以斜杠结尾,降低路径穿越风险。

二 目录与文件权限模板

  • 静态站点目录(示例:/var/www/html

    • 所有权:将站点目录的所有者设为 www-data:www-data,确保 Nginx 能读取内容。
    • 权限:目录 755(rwxr-xr-x),文件 644(rw-r–r–),既公开可读又避免对“其他用户”开放写权限。
  • 需要写入的目录(如 Laravelstoragebootstrap/cache

    • 所有权:保持为 www-data:www-data(或让 PHP-FPM 与 Nginx 使用同一用户组,便于协作)。
    • 权限:目录与可写子目录设为 775(rwxrwxr-x),允许同组写入,同时限制“其他用户”写入与执行。
  • 上传目录(如 /var/www/html/uploads

    • 所有权:建议由部署用户(如 deploy)拥有,组设为 www-data,便于应用写入、Nginx 读取。
    • 权限:目录 775,文件 664;同时在该目录禁用脚本执行(见第四部分)。
  • 快速示例命令

    • 静态站点
      sudo chown -R www-data:www-data /var/www/html
      sudo find /var/www/html -type d -exec chmod 755 {} +
      sudo find /var/www/html -type f -exec chmod 644 {} +
      
    • Laravel 可写目录
      sudo chown -R www-data:www-data /var/www/your-laravel-app
      sudo find /var/www/your-laravel-app -type d -exec chmod 755 {} +
      sudo find /var/www/your-laravel-app -type f -exec chmod 644 {} +
      sudo chmod -R 775 /var/www/your-laravel-app/storage /var/www/your-laravel-app/bootstrap/cache
      
    • 上传目录(示例)
      sudo chown -R deploy:www-data /var/www/html/uploads
      sudo chmod -R 775 /var/www/html/uploads
      sudo find /var/www/html/uploads -type f -exec chmod 664 {} +
      

    上述所有权与权限设置可确保 Nginx 正常读取静态资源,同时仅对需要写入的目录开放写权限,降低被上传脚本执行的风险。

三 日志与缓存目录权限

  • 确保 /var/log/nginx/var/cache/nginx 对 Nginx 运行用户(如 www-data)可写:
    sudo chown -R www-data:adm /var/log/nginx
    sudo chmod -R 750 /var/log/nginx
    
    sudo chown -R www-data:www-data /var/cache/nginx
    sudo chmod -R 750 /var/cache/nginx
    
  • 若遇到启动报错如 “Permission denied” 或 “getpwnam(“nobody”) failed”,应优先检查:
    • 配置中的运行用户是否存在(Debian 一般为 www-data,而非 nobody)。
    • 日志与缓存目录的所有权和权限是否正确。

四 访问控制与执行限制

  • 基于 IP 的访问控制
    server {
        listen 80;
        server_name example.com;
        location / {
            allow 192.168.1.0/24;
            deny all;
            root /var/www/html;
            index index.html;
        }
    }
    
  • 基于 HTTP 基本认证的目录
    sudo apt install apache2-utils  # 提供 htpasswd
    sudo htpasswd -c /etc/nginx/.htpasswd alice
    
    server {
        location /admin/ {
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/.htpasswd;
            root /var/www/html;
        }
    }
    
  • 禁用脚本执行(上传目录等敏感目录)
    location /uploads/ {
        location ~ \.(php|php5|phtml)$ {
            deny all;
        }
    }
    
  • 安全响应头(降低常见 Web 攻击面)
    add_header X-Frame-Options "DENY" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    server_tokens off;  # 隐藏版本号
    
    以上措施可结合使用,以“最小暴露面”为目标进行分层防护。

五 快速排错清单

  • 403 Forbidden:检查资源文件与父目录权限是否对 www-data 可读;目录需具备“x”权限才能进入与列目录。
  • 500/502 与脚本不可执行:确认 PHP-FPM 正在运行、监听地址与 Nginx 配置一致(如 /var/run/php/phpX.Y-fpm.sock),且脚本文件对 PHP-FPM 用户可读。
  • 上传后被执行:在上传目录禁用 .php 等脚本执行,并确保上传目录对 Web 服务仅开放必要的写入权限。
  • 启动失败与权限错误:核对 /var/log/nginx/var/cache/nginx 的所有权与权限;确认 nginx.conf 中的 user 为系统存在的用户(如 www-data),避免使用 nobody 导致 “getpwnam” 失败。

0