PHP FPM cho phép bị từ chối?


9

Tôi đã đọc một số mục về lý do tại sao PHP-FPM có thể cho phép tôi bị từ chối nhưng tôi không thể giải quyết nó.

Nhật ký lỗi đọc như sau:

    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/"

Tôi hơi mất nhưng mất:

  1. Tôi đã đặt / var / lib / nginx / tmp thành ec2-user (tôi thậm chí +777 mọi thứ để kiểm tra)
  2. Tôi đã đặt /tmp/php-fpm.sock thành ec2-user
  3. tập tin conf nginx được đặt thành ec2-user
  4. php-conf được đặt thành người dùng và nhóm ec2-user
  5. ps aux cung cấp cho người dùng ec2 trên tất cả các quy trình php-fpm và nginx

Cấu hình Nginx của tôi bao gồm rất nhiều tệp, thông tin cơ bản là:

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/ trống của tôi

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

CẬP NHẬT: tìm thấy vấn đề, đặt nó trong câu trả lời


1
Selinux có được bật không? chạy getenforce hoặc cat / selinux / thi hành nếu không bật 0
silviud

1
Phần còn lại của cấu hình nginx của bạn là gì?
Michael Hampton

1
ổ cắm của bạn từ tệp nhật ký là /tmp/php-fpm.sock nhưng bạn đã thay đổi / var / lib / nginx / tmp - bạn đã làm chroot trong nginx chưa?
silviud

1
gửi đầu ra từ ngàm lệnh
silviud

1
cũng xem tất cả các thư mục trong nhà của bạn ... xem serverfault.com/questions/170192/ cấp
silviud

Câu trả lời:


16

Tôi đã đặt / var / lib / nginx / tmp thành ec2-user / ec2-user (tôi thậm chí +777 mọi thứ để kiểm tra)

Nhưng ... tôi cũng phải đặt / var / lib / nginx thành ec2-user / ec2-user

... sau đó cũng chown / chgrp thư mục nginx cha: không còn lỗi.

Mất vài giờ ...


7
chown -Rf www-data:www-data /var/lib/nginxđã làm cho tôi. không cần phải chmod bất cứ điều gì.
Chris

Kiểm tra các tệp nhật ký luôn giúp ích, hãy nhớ kiểm tra chúng trước mọi thứ :)
thơ buồn

9

Điều này thường xảy ra. Khi usercài đặt trong nginx.conf được thay đổi từ

user nginx;

để một cái gì đó khác. Trong trường hợp này,

user ec2-user ec2-user;

Lệnh chmod không cần thiết theo nhận xét của Chris và có thể mở ra một lỗ hổng bảo mật.

Giải pháp:

Kiểm tra quyền sở hữu nhóm và người dùng hiện tại trên / var / lib / nginx.

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

Điều này cho bạn biết rằng một người dùng và nhóm có thể không tồn tại có tên nginxsở hữu thư mục này. Điều này ngăn chặn tải lên tập tin.

Thay đổi quyền sở hữu thư mục thành người dùng được xác định trong nginx.conf trong trường hợp này ec2-user(sudo có thể không bắt buộc).

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

Xác nhận rằng nó thực sự đã thay đổi.

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

Các quyền bị từ chối lỗi bây giờ sẽ biến mất. Kiểm tra error.log (dựa trên vị trí nginx.conf error_log).

$ sudo nano /opt/nginx/error.log

Nếu điều đó không hiệu quả, bạn có thể cần tải lại nginx và php-fpm.

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

Điều đó đã đánh lừa máy chủ Google đám mây Centos 7 của tôi.
Damodar Bashyal

3

Không có giải pháp nào khác hiệu quả với tôi, nhưng tôi thấy nó có hiệu quả:

$ 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

Nguồn


Ok, chúng tôi đã thử một số giải pháp và đây là giải pháp hiệu quả. Chúng tôi không biết tại sao nó hoạt động hoặc vấn đề là gì, nhưng nó đã làm.
Neil Masters

1

Tôi đã có vấn đề tương tự với tải lên tập tin. lỗi 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"

Vấn đề chỉ liên quan đến sự cho phép, tôi chỉ cần thiết lập chmod -R 755 /var/lib/nginxvà mọi thứ đã hoạt động!


0

Chỉ cần giải quyết vấn đề của tôi với quyền. Cách dễ nhất và đơn giản nhất là không chạy php-fpm hoặc nginx như sudo (siêu người dùng). Những gì bạn sẽ phải làm là:

  1. chown tất cả các vị trí đầu ra nhật ký cho nginx vào yourUserName: yourUserName ví dụ :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Ví dụ máy chủ cập nhật tiếp theo cũng là ví dụ :chown yourUserName:yourUserName -R /var/www

Bằng cách không sử dụng root, tôi không phải thay đổi người dùng hoặc nhóm php-fpm hoặc bất kỳ người dùng hoặc nhóm nghe nào. Hãy chắc chắn rằng bạn cũng nhận xét nginx.conf 'người dùng' vì đó sẽ là tên người dùng hiện tại.


Xin đừng đăng cùng một câu trả lời nhiều lần. Ngoài ra, vấn đề này đã được giải quyết từ lâu.
Sven

0

Thay vì chỉnh sửa quyền trên / var / lib / nginx / bất cứ điều gì, sẽ không có ý nghĩa hơn khi chỉ nói với nginx sử dụng một đường dẫn khác như / tmp / nginx? Điều này đã khắc phục vấn đề cho tôi:

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

Quyền / tmp / nginx tốt nhất nên là 700 (không nên là vấn đề miễn là chủ sở hữu là cùng một người dùng được chỉ định trong /etc/nginx/nginx.conf 'chỉ thị của người dùng) hoặc 770 nếu vì lý do nào đó bạn cần phải có chủ sở hữu tệp khác và nginx để thực hiện i / o thông qua quyền của nhóm. Chưa từng thấy mà ai biết.

Trên centos7, chỉnh sửa /etc/nginx/nginx.conf để nói với nginx sử dụng thư mục mới đó cho các ứng dụng khách

...

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

và khởi động lại nginx (lại centos7)

systemctl restart nginx

Không bao giờ chmod 777 bất cứ điều gì. Đặc biệt không phải là bộ nhớ cache! Giờ đây, bất kỳ người dùng cục bộ nào cũng có thể viết lại bộ nhớ cache của bạn và gửi dữ liệu độc hại tiềm ẩn cho người dùng của bạn. Để tải lên, ai đó có thể thay thế tải lên của riêng họ thay vào đó.
Michael Hampton

Chúa ơi hãy thư giãn, bản dựng này là một phần của cụm demo. Nhưng nắm bắt tốt cho những người có thể không biết rõ hơn, tôi sẽ chỉnh sửa câu trả lời.
siliconrockstar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.