PHP FPM 权限被拒绝?

PHP FPM 权限被拒绝?

我阅读了几篇关于为什么 PHP-FPM 可能会拒绝我的权限的文章,但我无法解决它。

错误日志如下:

    2013/04/20 23:33:28 [crit] 15479#0: *6 open() "/var/lib/nginx/tmp/fastcgi
/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 
99.999.999.999, server: example.net, request: "GET /wp-admin/ HTTP/1.1", 
upstream: "fastcgi://unix:/tmp/php-fpm.sock:", host: "example.net", referrer:    
"http://example.net/"

我有点迷茫:

  1. 我已将 /var/lib/nginx/tmp 设置为 ec2-user(我甚至 +777 所有内容来检查)
  2. 我已将 /tmp/php-fpm.sock 设置为 ec2-user
  3. nginx conf 文件设置为 ec2-user
  4. php-conf 设置为用户和组 ec2-user
  5. ps aux 为所有 php-fpm 和 nginx 进程提供 ec2-user

我的 Nginx 配置包含很多文件,基本配置是:

user              ec2-user ec2-user;
worker_processes  5;  
error_log /opt/nginx/error.log;    
pid        /var/run/nginx.pid;    
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /opt/nginx/access.log main;    
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 13m;
    index index.php index.html index.htm;
    upstream php {
       server unix:/tmp/php-fpm.sock;
    }
    include /etc/nginx/conf.d/*.conf;
    include /mnt/web/nginx/conf.d/*.conf;
}

我的 /etc/nginx/conf.d/ 是空的,我的 /mnt/web/nginx/conf.d 包含很多网站配置,其中都包括“wordpress.conf”:

location / {
    try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
location ~ \.php$ {
    try_files $uri =404;    
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

我的 /opt/php/etc/php-fpm.conf:

include=/opt/php/etc/fpm.d/*.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-fpm.sock
user = ec2-user
group = ec2-user
pm = dynamic
pm.max_children = 250
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
pm.status_path = /fpm-status
ping.path = /fpm-ping
slowlog = log/$pool.log.slow
catch_workers_output = yes

更新:发现问题,将其放在答案中

答案1

我已经设置了 /var/lib/nginx/临时文件到 ec2-user/ec2-user (我甚至 +777 一切都检查)

但是...我还必须设置 /var/lib/nginx到 ec2-user/ec2-user

... 在 chown/chgrp 父 nginx 文件夹之后 :不再有错误。

花了我几个小时...

答案2

这通常会发生。当usernginx.conf 中的设置从

user nginx;

到别的东西。在这种情况下,

user ec2-user ec2-user;

根据 Chris 的评论,chmod 命令不是必需的,并且可能会带来安全漏洞。

解决方案:

检查 /var/lib/nginx 上的当前用户和组所有权。

$ ls -ld /var/lib/nginx
drwx------ 3 nginx nginx 4096 Aug  5 00:05 /var/lib/nginx

这告诉您,可能不存在的用户和组nginx拥有此文件夹。这会阻止文件上传。

在这种情况下,将文件夹所有权更改为 nginx.conf 中定义的用户ec2-user(可能不需要 sudo)。

$ sudo chown -Rf ec2-user:ec2-user /var/lib/nginx

验证其确实发生了变化。

$ ls -ld /var/lib/nginx
drwx------ 3 ec2-user ec2-user 4096 Aug  5 00:05 /var/lib/nginx

权限被拒绝错误现在应该消失了。检查 error.log(基于 nginx.conf error_log 位置)。

$ sudo nano /opt/nginx/error.log

如果这不起作用,您可能需要重新加载 nginx 和 php-fpm。

$ sudo service nginx reload
$ sudo service php-fpm reload

答案3

其他解决方案都不适用于我,但我发现这个有效:

$ apt-get install php-pear php5-dev
$ pecl install timezonedb
$ echo 'extension=timezonedb.so'> /etc/php5/mods-available/timezonedb.ini
$ ln -sf /etc/php5/mods-available/timezonedb.ini /etc/php5/conf.d/30-timezonedb.ini
$ service php5-fpm restart

来源

答案4

刚刚解决了我的权限问题。最简单、最容易的方法是不要以 sudo(超级用户)身份运行 php-fpm 或 nginx。您需要做的是:

  1. chown nginx 的所有日志输出位置为 yourUserName:yourUserName例子chown yourUserName:yourUserName /var/log/nginx/error.log
  2. 下一步更新服务器目录例子chown yourUserName:yourUserName -R /var/www

通过不使用 root,我不需要更改 php-fpm 用户或组或任何监听用户或组。请确保您还注释掉 nginx.conf 'user',因为它将是当前用户名。

相关内容