Nginx

PHP FPM 授予權限被拒絕?

  • October 27, 2020

我閱讀了幾篇關於為什麼 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 配置包含很多文件,基本的 conf 是:

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

更新:發現問題,把它放在答案中

我已將 /var/lib/nginx/ tmp設置為 ec2-user/ec2-user (我什至 +777 所有要檢查的內容)

但是……我還必須將 /var/lib/ nginx設置為 ec2-user/ec2-user

…在 chown/chgrp 父 nginx 文件夾之後:沒有更多錯誤。

花了我幾個小時…

這通常會發生。當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

引用自:https://serverfault.com/questions/501258