CodeNet / Веб программирование / WEB Сервера
Установка Nginx + PHP-FPM в Debian Linux
Дата: 22 апреля 2011 года
Про установку PHP-FPM в связке с Nginx написана уйма инструкций. Но мне не подошло ни одной. Основная причина - PHP-FPM теперь включен в официальный дистрибутив PHP. Теперь не требуется устанавливать никаких патчей.
Я устанавливал эту связку на уже работающем сервере. На одном IP адресе работал Apache, на другом Nginx. Под Apache работал небольшой простой PHP скрипт, который выполнял совсем несложные действия, но при этом запрашивался очень часто. Основная задача - перенести этот скрипт с Apache+PHP на Nginx+PHP-FPM.
Если бы мне нужно было установить Nginx, то сделал я бы это так:
Установка php-fpm
tar -xzf php-5.3.6.tar.gz
cd php-5.3.6
./configure --prefix=/usr/local/php-fpm --enable-fpm --with-mcrypt --with-zlib \
--enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath \
--enable-inline-optimization --with-zlib --enable-sockets --enable-sysvsem \
--enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip \
--with-pcre-regex --with-gd --with-mysqli
make
make install
Для сборки такой конфигурации мне пришлось доустановить некоторое количество модулей, примерно так:
apt-get install zlib-dev
и т.п
После установки PHP-FPM полностью находится в каталоге /usr/local/php-fpm.
Теперь нужно создать конфигурационные файлы PHP-FPM и непосредственно интерпретатора PHP.
В моем случае PHP-FPM сразу не запустился, пришлось в конфигурационном файле раскомментировать следующие опции:
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
Помимо этих опций, нужно указать группу и пользователя под которыми будут работать "work" процессы PHP-FPM, в случае с Debian это "www-data":
group = www-data
PHP-FPM настроен. Теперь можно пробовать его запустить:
Посмотреть работает ли:
Попробовать приконнектиться:
И выключить:
Если все работает, то можно добавить его в /etc/init.d:
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the php-fpm server
# Description: starts php-fpm using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/php-fpm/sbin/php-fpm
NAME=php-fpm
DESC=php-fpm
test -x $DAEMON || exit 0
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
Настройка PHP
Я воспользоваться файлом настроек PHP который установлен у меня в связке с Apache. PHP был установлен из пакетов и конфигурационный файл находился в стандартном для Debian месте - /etc/php5/apache/php.ini. Я просо скопировал его в то место где его ожидал увидеть PHP-FPM. Место было определено с помощью phpinfo();
Настройки вступают в силу только после перезапуска PHP-FPM:
Настройка связки Nginx + PHP-FPM
Теперь нужно заставить Nginx прокидывать запросы к php скриптам в php-fpm. Для этого нужно добавить следующие настройки в настройки виртуального сервера Nginx:
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/site.com$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
Помимо этих страндартных настроек мне пришлось вручную указать переменную оркужения DOCUMENT_ROOT:
Таким образом, конфигурационный файл выглядел следующим образом
access_log /var/log/nginx/site.com-access_log;
error_log /var/log/nginx/site.com-error_log;
listen 192.168.1.1:80;
server_name site.com;
location / {
root /var/www/site.com;
index index.php;
}
# Эти ошибки можно обработать PHP скриптом
error_page 404 403 500 /404.php;
# 502 ошибку PHP скриптом обрабатывать не стоит, так как она возникает
# когда Nginx не может подключиться к PHP-FPM. По этому, сообщение о
# такой ошибке имеет смысл сделать статикой.
error_page 502 /502.html;
# Так как Nginx не обрабатывает файлы .htaccess и .htpasswd как Apache, то
# запретим их хотя бы скачивать
location ~ /\.ht { return 403; }
# все настройки из .htaccess нужно вынести в конфируграционный файл Nginx,
# например "Deny from all" в директории Nginx.
location ~ ^/scripts/.*$ { return 403; }
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/site.com$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/site.com/;
}
}
Оставить комментарий
Комментарии
Уязвимость:
если сделать запрос
http://example.com/1px.gif/test.php
то сервер выполнит как PHP-скрипт http://example.com/1px.gif