Я настраиваю новый сервер с PHP 5.3.9 и nginx, поэтому я скомпилировал PHP с параметрами SAPI php-fpm. Сам по себе он отлично работает с использованием следующей записи сервера в nginx:
server {
listen 80;
server_name domain.com www.domain.com;
root /var/www/clients/domain.com/www/public;
index index.php;
log_format gzip '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /var/www/clients/domain.com/logs/www-access.log;
error_log /var/www/clients/domain.com/logs/www-error.log error;
location ~\.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/clients/domain.com/www/public$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Он отлично обслуживает мои файлы PHP. Для дополнительной безопасности я хотел вырезать свой экземпляр FPM, поэтому я добавил следующие строки в свой файл conf для этого экземпляра FPM:
# FPM config
chroot = /var/www/clients/domain.com
и изменил конфиг nginx:
#nginx config for chroot
location ~\.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
С этими изменениями nginx дает мне File not found
сообщение для любых скриптов PHP. Глядя в журнал ошибок, я вижу, что он добавляет root
путь к моей переменной DOCUMENT_ROOT, переданной в fastcgi, поэтому я попытался переопределить его в блоке местоположения следующим образом:
fastcgi_param DOCUMENT_ROOT /www/public/;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
но я по-прежнему получаю ту же ошибку, а журнал отладки показывает полный путь без прав доступа, отправляемый в PHP-FPM.
Что мне не хватает, чтобы заставить это работать?
Похоже, ты забыл /
.
fastcgi_param SCRIPT_FILENAME www/public$fastcgi_script_name;
Должен прочесть:
fastcgi_param SCRIPT_FILENAME /www/public$fastcgi_script_name;
У меня такая же ситуация, и это мое решение:
Конфигурация fpm:
prefix = /var/www/example.com
chroot = $prefix
chdir = /
listen = tmp/php5-fpm.sock
slowlog = log/$pool.log.slow
Конфигурация nginx:
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/www/example.com/tmp/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME /htdocs$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /htdocs;
}
структура папок /var/www/example.com
drwxr-x--- 6 www-data www-data 4096 May 22 10:57 .
drwxr-xr-x 10 root root 4096 May 22 08:52 ..
drwxr-x--- 2 www-data www-data 4096 May 22 10:57 htdocs
drwxr-x--- 2 www-data www-data 4096 May 22 10:34 log
drwxr-x--- 2 www-data www-data 4096 May 22 10:56 tmp
Nginx не знает, настроили ли вы chroot на PHP-FPM. Итак, вам все равно нужно будет указать полный путь в fastcgi_param. По сути, ваша первоначальная конфигурация - это то, что вам нужно.