Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Установка Nginx + PHP-FPM в Debian Linux

Автор: mike
Дата: 22 апреля 2011 года

Про установку PHP-FPM в связке с Nginx написана уйма инструкций. Но мне не подошло ни одной. Основная причина - PHP-FPM теперь включен в официальный дистрибутив PHP. Теперь не требуется устанавливать никаких патчей.

Я устанавливал эту связку на уже работающем сервере. На одном IP адресе работал Apache, на другом Nginx. Под Apache работал небольшой простой PHP скрипт, который выполнял совсем несложные действия, но при этом запрашивался очень часто. Основная задача - перенести этот скрипт с Apache+PHP на Nginx+PHP-FPM.

Если бы мне нужно было установить Nginx, то сделал я бы это так:

Код:
apt-get install nginx

Установка php-fpm

Код:
wget http://ru.php.net/get/php-5.3.6.tar.gz/from/this/mirror -O php-5.3.6.tar.gz
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 mysqlclient-dev
apt-get install zlib-dev

и т.п

После установки PHP-FPM полностью находится в каталоге /usr/local/php-fpm.

Теперь нужно создать конфигурационные файлы PHP-FPM и непосредственно интерпретатора PHP.

Код:
cp /usr/local/php-fpm/etc/php-fpm.conf.default /usr/local/php-fpm/etc/php-fpm.conf

В моем случае PHP-FPM сразу не запустился, пришлось в конфигурационном файле раскомментировать следующие опции:

Код:
pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers

Помимо этих опций, нужно указать группу и пользователя под которыми будут работать "work" процессы PHP-FPM, в случае с Debian это "www-data":

Код:
user = www-data
group = www-data

PHP-FPM настроен. Теперь можно пробовать его запустить:

Код:
/usr/local/php-fpm/sbin/php-fpm

Посмотреть работает ли:

Код:
ps aux | grep php-fpm

Попробовать приконнектиться:

Код:
wget http://127.0.0.1:9000

И выключить:

Код:
killall php-fpm

Если все работает, то можно добавить его в /etc/init.d:

Код:
#!/bin/sh

### 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();

Код:
cp /etc/php5/apache/php.ini /usr/local/php-fpm/lib/php.ini

Настройки вступают в силу только после перезапуска PHP-FPM:

Код:
/etc/init.d/php-fpm restart

Настройка связки Nginx + PHP-FPM

Теперь нужно заставить Nginx прокидывать запросы к php скриптам в php-fpm. Для этого нужно добавить следующие настройки в настройки виртуального сервера Nginx:

Код:
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;
        }

Помимо этих страндартных настроек мне пришлось вручную указать переменную оркужения DOCUMENT_ROOT:

Код:
fastcgi_param DOCUMENT_ROOT /var/www/site.com/;

Таким образом, конфигурационный файл выглядел следующим образом

Код:
server {
    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/;
        }
    }

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
86K
17 октября 2012 года
Nikolay Gromov
0 / / 17.10.2012
+5 / -0
Мне нравитсяМне не нравится
17 октября 2012, 12:36:45
надо добавить cgi.fix_pathinfo=0 в php.ini

Уязвимость:

если сделать запрос
http://example.com/1px.gif/test.php

то сервер выполнит как PHP-скрипт http://example.com/1px.gif

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог