Доброго времени суток. Переношу свой проект на живой сервер и столкнулся с проблемой. У меня есть функция которая записывает данные в файл, а тут она перестала работать и в логи пишет следующее:
2017/06/01 15:08:57 [error] 8736#8736: *2 FastCGI sent in stderr: "PHP message: PHP Warning: fopen(tx.txt): failed to open stream: Permission denied in /var/www/apteka/config/wr.php on line 3" while reading response header from upstream, client: 192.168.хх.хх, server: localhost, request: "GET /apteka/config/wr.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/php-fpm.sock:", host: "192.168.хх.хх"Сам код файла я создал просто для пробы, чтоб отсечь всё ненужное:
<?PHP
$file = 'tx.txt';
fopen($file, 'x+');
echo $file;1. Права на каталог 777,
2. Владелец каталога nginx,
3. Установлена связка CentOS 7.3.1611+nginx 1.12 +php7.1.5 +php-fpm 3.1.0
4. В файле php.ini функция allow_url_fopen = On
В чём может быть проблема?
ответ в вопросе:под каким пользователем работпет php-fpm?
> ответ в вопросе:
> под каким пользователем работпет php-fpm?Под nginx.
selinux ?
> selinux ?getsebool -a | grep -i http
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> on
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> on
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> on
httpd_run_ipa --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
named_tcp_bind_http_port --> off
prosody_bind_http_port --> offНеужели нужно первую строчку разрешать?
Но Вы похоже правы, дело в SELinux. Логи его говорят вот что:
type=AVC msg=audit(1496731832.959:389): avc: denied { write } for pid=23482 comm="php-fpm" name="config" dev="dm-0" ino=918003 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=dir
type=SYSCALL msg=audit(1496731832.959:389): arch=c000003e syscall=2 success=no exit=-13 a0=7ffe44a1a9b0 a1=c2 a2=1b6 a3=1d items=0 ppid=23478 pid=23482 auid=4294967295 uid=995 gid=993 euid=995 suid=995 fsuid=995 egid=993 sgid=993 fsgid=993 tty=(none) ses=4294967295 comm="php-fpm" exe="/usr/sbin/php-fpm" subj=system_u:system_r:httpd_t:s0 key=(null)Здесь меня интересует вот что "name="config"" это по сути каталог в котором находится файл который я выполняю(т.е. код в котором говорится о том что нужно произвести запись в файл), в этом же каталоге я пытаюсь создать/изменить файл.
> Здесь меня интересует вот что "name="config"" это по сути каталог в котором
> находится файл который я выполняю(т.е. код в котором говорится о том
> что нужно произвести запись в файл), в этом же каталоге я
> пытаюсь создать/изменить файл.С точки зрения ИБ неразумно разрешать создавать файлы в том же каталоге, откуда разрешено исполнение скриптов.
>[оверквотинг удален]
> Warning: fopen(tx.txt): failed to open stream: Permission denied in /var/www/apteka/config/wr.php
> on line 3" while reading response header from upstream, client: 192.168.хх.хх,
> server: localhost, request: "GET /apteka/config/wr.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/php-fpm.sock:",
> host: "192.168.хх.хх"
> Сам код файла я создал просто для пробы, чтоб отсечь всё ненужное:
> <?PHP
> $file = 'tx.txt';
> fopen($file, 'x+');
> echo $file;
> 1. Права на каталог 777,Вы уверены что текущий каталог этот, путь то в fopen не полный - относительный?
Надо в этом php посмотреть что возвращает string getcwd ( void ).
> 2. Владелец каталога nginx,
> 3. Установлена связка CentOS 7.3.1611+nginx 1.12 +php7.1.5 +php-fpm 3.1.0
> 4. В файле php.ini функция allow_url_fopen = On
> В чём может быть проблема?
>[оверквотинг удален]
>> fopen($file, 'x+');
>> echo $file;
>> 1. Права на каталог 777,
> Вы уверены что текущий каталог этот, путь то в fopen не полный
> - относительный?
> Надо в этом php посмотреть что возвращает string getcwd ( void ).
>> 2. Владелец каталога nginx,
>> 3. Установлена связка CentOS 7.3.1611+nginx 1.12 +php7.1.5 +php-fpm 3.1.0
>> 4. В файле php.ini функция allow_url_fopen = On
>> В чём может быть проблема?Проверил, каталог верный.
В общем дело было в хитрых настройках SELinux.
Вот здесь я прочитал про нужные мне параметры: http://www.serverlab.ca/tutorials/linux/web-servers-linux/co.../А именно "httpd_sys_rw_content_t" после использования этой настройки всё начало записываться нормально.
Чё то они перемудрили с этим SELinux...