Задать вопрос

Nginx+php-fpm (chroot). Из-за чего no input file specifed?

OS: Centos
PHP: 5.5.6
Nginx: 1.4.4

Nginx vhost conf
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 pool config

[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 from /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)


id 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)


nginx статику отдает хорошо

**что я делаю не так?**
  • Вопрос задан
  • 6988 просмотров
Подписаться 4 Оценить 2 комментария
Решения вопроса 2
papahoolio
@papahoolio
По конфигу все должно работать. Ну на первый взгляд. Как вариант, могу предложить сделать
strace -e trace=open, read, close, connect  -p <pid>

pid это php-fpm, который желательно поднять c pm = static, чтобы проще было процесс найти, либо на каждый child повесить strace

а там уже видно будет, что он пытается открыть
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
include fastcgi_params нужно вставлять самой первой строкой в требуемый location.

Пути в самом конфиге заданного pool нужно писать относительно chroot. Т.е. писать "fastcgi_param SCRIPT_NAME /www$fastcgi_script_name;" в контексте "root /srv/example.ltd/www;" неправильно.

strace лучше анализировать полный, т.е. без фильтрации определенных вызовов. Он гарантированно может показать, что и куда стучится и почему достучаться не может.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ruFelix
@ruFelix
Предсказание будущего по руке, таро, кофе.
Противоречие:
root /srv/example.ltd/www;
fastcgi_param SCRIPT_NAME /www$fastcgi_script_name;

у вас должно быть типа:
fastcgi_param SCRIPT_NAME /srv/example.ltd/www$fastcgi_script_name;
Ответ написан
kenny_opennix
@kenny_opennix
в location /
нужно доавить root /srv/example.ltd/www;
в location ~ \.php$
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Если не помогает скажите что за cms.
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
но тогда не было доступа к ../logs ../tmp а он нужен был,

В случае chroot папки logs и tmp создаются внутри chroot. Собственно, в этом же и есть мысл chroot, закрыться в определенной директории.

При желании можно логи вынести за пределы через nginx error_log (ибо он то не в chroot) через stderr.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы