PHP FPM授予权限被拒绝?


9

我阅读了几篇关于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为ec2-user提供所有php-fpm和nginx进程

我的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
selinux是否启用?如果未启用,则运行getenforce或cat / selinux / enforce启用
silviud13年

1
您其余的nginx配置是什么?
迈克尔·汉普顿

1
您的日志文件套接字是/tmp/php-fpm.sock,但是您更改了/ var / lib / nginx / tmp-您是否在nginx中执行chroot?
silviud

1
发送命令挂载的输出
silviud 2013年

1
也期待在你家中的所有目录......看到serverfault.com/questions/170192/...
silviud

Answers:


16

我已经将/ var / lib / nginx / tmp设置为ec2-user / ec2-user(我什至+777都要检查)

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

...之后还对父级nginx文件夹进行了chown / chgrp:没有更多错误。

花了我几个小时...


7
chown -Rf www-data:www-data /var/lib/nginx为我工作。不需要修改任何东西。
克里斯(Chris)

检查日志文件总是有帮助的,请记住在进行任何检查之前先检查一下它们:)
悲伤的诗歌

9

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

user nginx;

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

user ec2-user ec2-user;

克里斯的注释中不需要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

那在我的Google Cloud Centos 7服务器上成功了。
Damodar Bashyal

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

资源


好的,我们尝试了几种解决方案,这是行之有效的。我们不知道它为什么起作用,或者是什么问题,但是确实如此。
尼尔大师

1

我在上传文件时遇到了类似的问题。nginx 500错误 2015/07/05 03:50:36 [crit] 3656#0: *7 open() "/var/lib/nginx/tmp/client_body/0000000007" failed (13: Permission denied), client: 10.0.2.2, server: www.test.com, request: "POST /api/v1/users HTTP/1.1", host: "test"

该问题仅与许可有关,我刚刚设置好chmod -R 755 /var/lib/nginx,一切正常!


0

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

  1. 将nginx的所有日志输出位置都整理为yourUserName:yourUserName 示例chown yourUserName:yourUserName /var/log/nginx/error.log
  2. 下次更新服务器目录以及示例chown yourUserName:yourUserName -R /var/www

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


请不要多次发布相同的答案。另外,这个问题早已解决。
斯文

0

而不是编辑/ var / lib / nginx /上的权限,只告诉nginx使用类似/ tmp / nginx的路径不是更有意义吗?这为我解决了问题:

# create the directory
mkdir /tmp/nginx
chown -R nginx.nginx /tmp/nginx (assumes nginx user is named nginx)
chmod -R 700 /tmp/nginx

/ tmp / nginx权限最好为700(只要所有者是/etc/nginx/nginx.conf'user'指令中指定的同一用户,就不成问题)或770(如果出于某些原因需要)具有不同的文件所有者和nginx来通过组权限执行I / O。从来没有见过,但谁知道。

在centos7上,编辑/etc/nginx/nginx.conf以告知Nginx将新目录用于客户端

...

http {
  ...
  client_body_temp_path /tmp/nginx 1 2;
  ...
}

并重新启动nginx(再次centos7)

systemctl restart nginx

切勿使用chmod 777。特别是没有缓存!现在,任何本地用户都可以重写您的缓存并将潜在的恶意数据发送给您的用户。对于上传,某人可以替代自己的上传。
迈克尔·汉普顿

耶稣哥们放松一下,这个建筑是演示集群的一部分。但是对于那些可能不太了解的人来说,这很不错,我将编辑答案。
Siliconrockstar '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.