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 (я навіть +777 все, щоб перевірити)
  2. Я встановив /tmp/php-fpm.sock на користувача ec2
  3. Конфігураційний файл nginx встановлений користувачем ec2
  4. php-conf встановлений користувачем та групою ec2-користувач
  5. ps aux надає користувачеві ec2 для всіх процесів 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 / примусово, якщо не включено 0
silviud

1
Яка інша частина вашої nginx конфігурації?
Майкл Хемптон

1
ваш сокет з файлу журналу є /tmp/php-fpm.sock, але ви змінили / var / lib / nginx / tmp - чи зробили ви chroot в nginx?
silviud

1
відправити вихід з команди mount
silviud

1
також дивіться, що всі каталоги у вашому домі ... дивіться serverfault.com/questions/170192/…
silviud

Відповіді:


16

Я встановив / var / lib / nginx / tmp на ec2-користувача / ec2-користувача (я навіть +777 все, щоб перевірити)

Але ... мені також довелося встановити / var / lib / nginx на ec2-user / ec2-user

... після також chown / chgrp батьківської папки nginx: більше помилок немає.

Взяв мене кілька годин ...


7
chown -Rf www-data:www-data /var/lib/nginxпрацював на мене. нічого не потрібно було chmod.
Кріс

перевірка файлів журналів допомагає завжди, не забудьте перевірити їх перед чим завгодно :)
скорботна поезія

9

Це взагалі трапляється. Коли userналаштування в nginx.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 хмара Centos 7.
Дамодар Башіял

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

Щойно вирішив мою проблему з дозволами. Найпростіший і найпростіший спосіб - не запускати php-fpm або nginx як sudo (суперкористувач). Що ви повинні зробити:

  1. порушити всі вихідні місця журналу для nginx до вашогоUserName: приклад вашогоUserName :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Наступний приклад сервера оновлення, також приклад :chown yourUserName:yourUserName -R /var/www

Не використовуючи root, мені не довелося змінювати користувача або групу php-fpm або будь-якого користувача чи групи, що слухає. Не забудьте також прокоментувати nginx.conf "user", оскільки це буде ім'я поточних користувачів.


Будь ласка, не публікуйте одну і ту ж відповідь кілька разів. Також ця проблема давно вирішена.
Sven

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 для виконання вводу-виводу через групові дозволи. Ніколи цього не бачив, але хто знає.

У centos7 відредагуйте /etc/nginx/nginx.conf, щоб сказати nginx використовувати цей новий каталог для органів клієнта

...

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

та перезапустіть nginx (знову ж centos7)

systemctl restart nginx

Ніколи не chmod 777 нічого. Тим більше не кеш! Тепер будь-який місцевий користувач може переписати кеш і надіслати потенційно шкідливі дані вашим користувачам. Для завантажень хтось замість цього може замінити власне завантаження.
Майкл Хемптон,

Ісус, чувак, розслабиться, ця збірка є частиною демо-кластера. Але гарний вилов для людей, які, можливо, не знають кращого, я відредагую відповідь.
siliconrockstar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.