Назад | Перейти на главную страницу

nginx + php-fpm (chroot). Не указан входной файл

ОС: Centos PHP: 5.5.6 Nginx: 1.4.4

Конфигурация Nginx

server {
listen 80;
server_name example.ltd;

root /srv/example.ltd/www;
index index.php;
access_log /srv/example.ltd/logs/nginx-main.log main;
error_log /srv/example.ltd/logs/nginx-error.log warn;

autoindex on;

location / {
    try_files $uri $uri/ /index.php;
}

location ~ \.php$ {

fastcgi_pass unix:/srv/example.ltd/tmp/example.ltd.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_NAME /www$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SERVER_NAME $host;
    fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
    include fastcgi_params;
}

}

Конфигурация пула php-fpm

[example.ltd]
listen = /srv/example.ltd/tmp/example.ltd.sock
listen.allowed_clients = 127.0.0.1
listen.owner = example.ltd
listen.group = example.ltd
listen.mode = 0660
user = example.ltd
group = example.ltd
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 50
request_slowlog_timeout = 60
chroot = /srv/example.ltd
chdir = /www
catch_workers_output = yes
security.limit_extensions = .php .php3 .php4 .php5
env[HOSTNAME] = example.ltd
env[TMP] = /srv/example.ltd/tmp
env[TMPDIR] = /srv/example.ltd/tmp
env[TEMP] = /srv/example.ltd/tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -fno-reply@example.ltd
php_admin_value[error_log] = /srv/example.ltd/logs/php-fpm-error.log
slowlog = /srv/example.ltd/logs/php-fpm-slow.log
php_admin_flag[log_errors] = on
php_flag[display_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /srv/example.ltd/sessions
php_value[soap.wsdl_cache_dir] = /srv/example.ltd/wsdlcache
php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec
php_admin_value[open_basedir] = /srv/example.ltd:/usr/share/nginx/html

ls -la из / srv

drwxrwx---  8 example.ltd example.ltd 4096 Dec  2 11:57 example.ltd

ps aux | grep example.ltd

500      23102  0.0  2.7 702936  7304 ?        S    13:38   0:00 php-fpm: pool example.ltd
500      23103  0.0  2.7 702936  7308 ?        S    13:38   0:00 php-fpm: pool example.ltd
500      23104  0.0  2.7 702936  7304 ?        S    13:38   0:00 php-fpm: pool example.ltd
500      23105  0.0  2.7 702936  7304 ?        S    13:38   0:00 php-fpm: pool example.ltd
500      23106  0.0  2.7 702936  7340 ?        S    13:38   0:00 php-fpm: pool example.ltd

id example.ltd

uid=500(example.ltd) gid=500(example.ltd) groups=500(example.ltd),499(nginx)

идентификатор nginx

uid=498(nginx) gid=499(nginx) groups=499(nginx),500(example.ltd)

У меня ошибка:

Unable to open primary script: /www/index.php (No such file or directory)

Я пробую внести изменения в конфигурационный файл nginx из

fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;

к

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

также попробуйте:

fastcgi_param SCRIPT_FILENAME www$fastcgi_script_name;

но есть ошибка:

Unable to open primary script: /index.php (No such file or directory)

p.s. статические файлы работают без nginx, скрипты php не работают

Что я делаю не так?

На пуле php-fpm

У вас должно быть

prefix = /srv/example.ltd

Затем исправьте некоторые пути, которые будут связаны с chroot

chroot = $prefix
listen = tmp/example.ltd.sock
chdir = /
# yes, this is in /srv/example.ltd/tmp
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[error_log] = /logs/php-fpm-error.log
php_value[session.save_path] = /srv/example.ltd/sessions
php_value[soap.wsdl_cache_dir] = /wsdlcache
# only paths INSIDE your chroot
php_admin_value[open_basedir] = /www:/lib
# same here, only INSIDE
php_value[include_path] =".:/www:/www/include:/lib"
# this one does not use the chroot
slowlog = /srv/example.ltd/logs/php-fpm-slow.log

Для sendmail_path я почти уверен, что это не сработает, вам понадобятся утилита, библиотеки и устройства, работающие с этим в yout chroot, обычно для chrooted php-fpm вам лучше использовать SMTP на TCP / IP, а не sendmail.

Со стороны nginx все в порядке, вы можете использовать fastcgi_pass unix:$document_root/../tmp/example.ltd.sock; это тоже сработает. Вот что у меня на стороне:

fastcgi_split_path_info ^(.+\.php)(/.+)$
fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /www;
fastcgi_param HOME /www;
fastcgi_param PATH_TRANSLATED /www$fastcgi_path_info;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HOSTNAME $server_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_param  REDIRECT_STATUS    200;

@regilero: ваш пример настройки php-fpm не работает, то же самое, он ищет скрипты в:

корень /srv/example.ltd/www;

не в

DOCUMENT_ROOT / www;