У меня есть машина FreeBSD 11, на которой запущены последние версии Nginx и PHP-FPM в режиме chrooted. Все работало нормально, пока не добавил start_session();
к index.php
.
Тогда я получил следующую ошибку:
Fatal error: Uncaught Exception: Cannot open source device in /index.php:5 Stack trace: #0 /index.php(5): session_start() #1 {main} Next Exception: Cannot open source device in /index.php:5 Stack trace: #0 /index.php(5): session_start() #1 {main} Next Exception: Cannot open source device in /index.php:5 Stack trace: #0 /index.php(5): session_start() #1 {main} Next Exception: Cannot open source device in /index.php:5 Stack trace: #0 /index.php(5): session_start() #1 {main} Next Error: Failed to create session ID: files (path: /home/project/customers/john/tmp) in /index.php:5 Stack trace: #0 /index.php(5): session_start() #1 {main} thrown in /index.php on line 5
Пожалуйста посоветуй.
nginx.conf
server {
listen 443 ssl http2;
add_header Cache-Control no-cache;
ssl on;
ssl_certificate /home/project/ssl/project.chain;
ssl_certificate_key /home/project/ssl/project.key;
ssl_prefer_server_ciphers on;
server_name john.project.net;
error_log /home/project/logs/john-error.log;
access_log /home/project/logs/john-access.log;
root /home/project/customers/john;
index index.php;
location / { deny all; }
location = / { }
location = /index.php {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_pass unix:/var/run/php-fpm-project-john.sock;
try_files $uri =404;
}
location ~ \.(txt|css|map|jpg|png|gif|ico|htc|otf|eot|svg|ttf|woff|woff2|js|ogg)$ { }
}
php-fpm.conf
[project-john]
prefix = /home/project/customers/john
user = www
group = www
listen = /var/run/php-fpm-project-john.sock
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chroot = $prefix
chdir = /
php_admin_value[session.save_path] = /home/project/customers/john/tmp ; Writable
index.php
<?php
ini_set('display_errors', 1);
echo "test";
session_start();
?>
Сеансы PHP полагаются на /dev/urandom
по умолчанию для генерации случайного идентификатора, который, конечно, недоступен в chrooted режиме PHP-FPM. Существуют сотни других зависимостей ОС, от которых мои проекты должны правильно работать.
На этом этапе я отказываюсь от любой возможной возможности использования chrooted режима PHP-FPM.
Но если кому-то еще интересно, нужно смонтировать: /dev/urandom
к /home/project/customers/john/dev/urandom
.
https://www.vennedey.net/resources/3-Secure-webspaces-with-NGINX-PHP-FPM-chroots-and-Lets-Encrypt
Ваш php_admin_value[session.save_path]
должен быть относительно chroot-пути. (После chroot он просто должен будет выглядеть как /tmp
). Прямо сейчас он ищет это значение в корне процесса, что приводит к поиску "реального пути" /home/project/customers/john/home/project/customers/john/tmp
, который вряд ли существует.