Debian.pro/

Про Debian


debian, nginx + fastcgi php. Веб-сервер без апача. Nginx, как полноценный веб сервер — часть 1.

Я не хочу рассуждать в рамках данной статьи что лучше — nginx+fastcgi или nginx+apache2 mod_php. У каждого из способов свои преимущества. Но сразу скажу, что если вы впервые настраиваете свой вебсервер — эта статья не для вас. По крайней мере — пока что.

Данная статья открывает цикл статей «nginx, как полноценный веб сервер». Мы поговорим об установке nginx и fastcgi php как back-end’a для nginx. Напоминаю, что апача у нас не будет вообще.

Итак. Берем гипотетически чистую Ubuntu или Debian. Удаляем оттуда апач и весь фарш. В Ubuntu сначала сделайте sudo su и все команды выполняйте уже от рута.

Установим собственно php, в подходящей нам комплектации:
root@debian-nginx-fastcgi:~$ aptitude install php5 php5-cgi

Теперь нам нужно исправить конфигурационный файл php до нужного нам состояния. Откроем файл /etc/php5/cgi/php.ini в любимом текстовом редакторе. Поиском находим строку, содержащую cgi.fix_pathinfo. Нам нужно привести её к виду:

cgi.fix_pathinfo = 1
Если перед ней есть символ ; — уберите его, расскоментировав тем самым эту строку. Если там 0 — замените на 1.

Теперь нам нужно установить lighttpd или spawn-fcgi. В комплекте с lighttpd идёт утилита spawn-fcgi. В более старых дистрибутивах (etch, убунты 8.х и, возможно, lenny) нет отдельного пакета spawn-fcgi.

Для начала проверим, есть ли пакет spawn-fcgi:
root@debian-nginx-fastcgi:~$ aptitude search spawn-fcgi
Если вы увидите строку:
p spawn-fcgi — A fastcgi process spawner
то спаунер у нас есть и мы его установим:
root@debian-nginx-fastcgi:~$ aptitude install spawn-fcgi
и переходим к части статьи «установка nginx»
Если спаунера у нас нет, то ставим lighttpd:
root@debian-nginx-fastcgi:~$ aptitude install lighttpd
После чего отключаем его и «убираем из автозагрузки»:
root@debian-nginx-fastcgi:~$ /etc/init.d/lighttpd stop && update-rc.d -f lighttpd remove

Установим nginx:
root@debian-nginx-fastcgi:~$ aptitude install nginx

Создадим каталог для сайта:
root@debian-nginx-fastcgi:~$ mkdir /var/www/example.ru

Как вы уже догадались, имя сайта у нас будет example.ru. Для редактирования файлов сайта мы будем использовать пользователя web (например, вообще же — используйте кого хотите).
Для запуска же скриптов мы будем использовать пользователя www-data. Он появится у нас после установки nginx. Напоминаю, что fastcgi — это вполне себе обычный CGI. Так что запускать мы скрипты можем от любого пользователя. Над безопасностью будем думать в следующих статьях.

Выдадим соответствующие права на каталог:
root@debian-nginx-fastcgi:~$ chown -R web:www-data /var/www/example.ru && chmod -R 750 /var/www/example.ru
В дальнейшем, для каталогов, в которые скрипты могут записывать файлики — нам необходимо указывать chmod 770 для каталогов и 660 для файлов.

Запустим наш процесс fastcgi:
root@debian-nginx-fastcgi:~$ /usr/bin/spawn-fcgi -a 127.0.0.1 -p 8080 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php1.pid
Мы должны увидеть надпись вроде «Child spawned with PID xxxx». Если надпись какая то другая — обязательно сообщите мне. Я составляю список проблем для статьи «анализ ошибок». Почта — vlad@debian.pro.

Немного об опциях:
-a 127.0.0.1 — указываем IP, на котором будет запущен php процесс. В дальнейшем этот адрес мы укажем в конфиге nginx. Можно запустить php на одном сервере, а nginx’ом дергать php скрипты с другого сервера…) Но это вы уже сами решайте.
-p 8080 — указываем порт, который будет служен php процесс. Опцию так же укажем в конфиге nginx. Для разных процессов следует использовать разные порты. Я ещё не говорил, что мы можем запускать неограниченное количество процессов spawn-fcgi )?
-u www-data -g www-data — пользователь и группа, от которых будут выполняться скрипты.
-f /usr/bin/php5-cgi — не меняйте эту опцию, если не уверены.
-P /var/run/fastcgi-php1.pid — PID файл процесса. Не пытайтесь использовать один PID файл разными процессами.

Переходим к настройке nginx.
Как настроить конфиг самого nginx я уже писал в статье Debian, nginx + AMP. Отсюда вы можете почерпнуть тайные знания о том, как настроить nginx (файл /etc/nginx/nginx.conf)
Вообще же нам сейчас нужно создать файл виртуального хоста для нашего сайта. Напомню, что у нас это — example.ru.

Создаём файл /etc/nginx/sites-enabled/example.ru и пишем в него примерно следующую билиберду:

server {
listen 80;
server_name default.ru;
access_log /var/log/nginx-example.ru.log;
location / {
root /var/www/example.ru;
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:8080;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/example.ru$fastcgi_script_name;
include fastcgi_params;
}
# другие опции
}

Перезапускаем nginx:
root@debian-nginx-fastcgi:~$ /etc/init.d/nginx restart

Ну и осталось проверить работоспособность связки и повыпендриваемся перед друзьями — создадим файл /var/www/example.ru/info.php и впишем в него код:

После чего по адресу http://example.ru/info.php мы должны увидеть типичную страничку с информацией о том, каким образом запущен наш php. Вы должны увидеть CGI/FastCGI в строке Server API.
Не забудьте файлик удалить потом.

Теперь в общем то вы можете разместить в каталоге /var/www/example.ru вы можете размещать файлы сайта. Работать должна любая CMS, не требущая mod_rewrite (использования файла .htaccess). Данный недостаток мы устраним в следующих статьях.


Комментарии (9):

  1. soyayaos :

    Компилирую php с —enable-fastcgi —enable-fpm и прочими нужностями и вешаю на сокет: разница ощутима.

  2. soyayaos :

    А ну еще и suhosin ставлю

  3. Разница ощутима, пока не заточишь mod_php с применением всех наук и APC не поковыряешь хорошенько. В конечном результате акселераторы сводят всю необходимость геморроя к нулю. Разве только, что на очень вебдванольных проектах они не помогают и там, где каждая страница генерируются — биллинги и прочее.

  4. Oleg :

    Почему не пишите продолжение? Как быть с .htaccess ? и с тем что его использует
    Очень актуальные темы освещаете, спасибо!

  5. Готовлюсь к смене работы, времени нет на такие масштабные мануалы.

  6. Сергей :

    Можно ли как-нибудь посмотреть состояние nginx без /nginx-status — прямо из командной строки?

  7. inkvizitor68sl :

    Ага. Курлом. В /nginx-status.

  8. «для nginx — компилятора php. Напоминаю, что апача у нас не будет вообще»
    Напоминаю, что компиляторов для php нет вообще. Это интепретируемый язык.

  9. Строго говоря, они есть. Конечно, в данном случае, о них речи не шло)
    Спасибо за замечание, поправил статью.

Написать комментарий