Установка Nginx + PHP + FastCGI на Gentoo Linux
Установка Nginx
Посмотрим текущую стабильную версию в portage
emerge nginx -p
Разберемся с некоторыми флагами
flv | flv_module (streaming) |
fastcgi | Поддержка FastCGI |
addition | addition_module |
ssl | Поддержка SSL |
perl | perl_module |
pcre | Поддержка регулярных выражений |
zlib | gzip_module |
sub | sub_module |
webdav | dav_module |
imap | pop3/imap4 proxy support |
status | Модуль для сбора статистики How-to |
random-index | random_index_module |
Запишем выбранный нами набор флагов для nginx'a, которые не были выключены или наоборот включены по умолчанию:
echo "www-servers/nginx fastcgi" >> /etc/portage/package.use
Устанавливаем nginx
emerge nginx -av
Добавим в загрузку
rc-update add nginx default
Установка PHP
Посмотрим текущую стабильную версию в portage
emerge php -p
Разберемся с некоторыми флагами
cli | Интерфейс командной строки |
ncurses | модуль для доступа к функциям библиотеки ncurses, позволяющий разрабатывать приложения с псевдографическим интерфейсом faq |
readline | модуль для доступа к функциям библиотеки Readline |
gdbm | поддержка БД GNU Database Manager |
reflection | расширение, состоящее из набора классов, позволяет анализировать классы, интерфейсы, функции, методы.faq |
spl | cтандартная библиотека PHP (Standart PHP Library) faq |
iconv | Функции преобразования кодировок |
Запишем выбранный нами набор флагов для PHP (конечно здесь все индивидуально и в данном примере только необходимый минимум):
echo "dev-lang/php cgi force-cgi-redirect" >> /etc/portage/package.use
Устанавливаем PHP
emerge php -Nav
Установка spawn-fcgi
Размаскирование
echo www-servers/spawn-fcgi >> /etc/portage/package.keywords
На данный момент пакет spawn-cgi замаскирован
Установка
emerge spawn-fcgi -av
Настройка пользователей
Пользователь nginx создается при установке, теперь нам понадобится учетная запись с правами которой будет работать php
Создадим пользователя и группу www-data (id=33 мне так нравится)
groupadd -g 33 www-data useradd --uid 33 --gid 33 -d /var/www/ -s /bin/sh www-data
Создать каталог (для хоста по умолчанию, он же и домашняя директория пользователя www-data)
mkdir /var/www chown www-data:www-data /var/www chmod 750 /var/www
Добавить пользователя nginx в группу www-data
usermod -a -G www-data nginx
Комментарий к правам:
Nginx будет работать с правами nginx, состоит в группе www-data
PHP работает с правами www-data
chown www-data:www-data /var/www chmod 750 /var/www
При соблюдении такой маски прав, Nginx имеет доступ чтения, PHP имеет полный доступ
Если нужно разграничить права PHP между двумя сайтами, то создается другой пользователь под которым будет запускаться spawn-fcgi и добавить nginx в его группу.
Настройка Nginx
Создадим подключаемую папку с конфигурационными файлами
mkdir /etc/nginx/vhosts.d
Создадим папку для хранения конфигураций хостов
mkdir /etc/nginx/vhosts.a
В vhosts.d создаются символьные ссылки на файлы из vhosts.a
Исключительно для удобства работы с множеством хостов.
Правим основной конфиг
nano /etc/nginx/nginx.conf
Добавляем строчку
include /etc/nginx/vhosts.d/*;
Хост по умолчанию
nano /etc/nginx/vhosts.a/default
default
# секция server описывает виртуальный хост server { listen 80 default; server_name localhost; access_log /var/log/nginx/localhost.access_log main; error_log /var/log/nginx/localhost.error_log info; # корневой каталог сайта root /var/www/; index index.html; }
Если использовать следующего рода запись
access_log /var/log/nginx/$host.access_log main;
то необходимы права на создание файла для пользователя nginx, при явном указании имени, лог создается и ведется от root'a
Активируем хост default
ln -s /etc/nginx/vhosts.a/default /etc/nginx/vhosts.d/default
Сделаем тестовую страничку
echo "test" > /var/www/index.html
Рестарт
/etc/init.d/nginx restart
Проверка
http://192.168.0.1/
Ротация логов logrotate
Создать конфиг для nginx'a
/etc/logrotate.d/nginx
/var/log/nginx/*_log { daily missingok rotate 30 compress delaycompress notifempty create sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript }
Запуск PHP-CGI (ПРОСТО ДЛЯ ТЕСТА)
PHP-CGI это FastCGI сервер в PHP
Запуск php-cgi
su www-data -c 'php-cgi -b 127.0.0.1:9000' &
Пример настройки хоста nginx:
nano /etc/nginx/vhosts.a/test1
test1
server { listen 80 ; server_name test1.lan; access_log /var/log/nginx/test1.access_log main; error_log /var/log/nginx/test1.error_log info; # корневой каталог сайта root /var/www/; index index.php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #Подключается /etc/nginx/fastcgi_params include fastcgi_params; } }
Активируем хост test1
ln -s /etc/nginx/vhosts.a/test1 /etc/nginx/vhosts.d/test1
Сделаем тестовую страничку
echo -e "<?\necho \"PHP-CGI TEST\";\nphpinfo();\n?>" > /var/www/index.php
Рестарт
/etc/init.d/nginx restart
Проверка http://test1.lan/
Не забыть определить DNS имя test1.lan
Работоспособность на малых нагрузках
Запуск PHP-CGI используя SPAWN-FCGI
Основные два момента это :
- конфигурационный файл: /etc/conf.d/spawn-fcgi
- скрипт запуска: /etc/init.d/spawn-fcgi
Имя скрипта и файла в непосредственной связке.
Изначальный конфигурационный файл примем за шаблон и трогать не будем. По данному пути /etc/conf.d/ будут создавать копии файла, к которому, так же будет создаваться и одноименный скрипт (символическая ссылка на изначальный).
Создаем свой конфиг
cp -p /etc/conf.d/spawn-fcgi /etc/conf.d/spawn-fcgi.www-data
Редактируем
nano /etc/conf.d/spawn-fcgi.www-data
spawn-fcgi.www-data
# Рабочий сокет FCGI_SOCKET=/var/run/spawn-fcgi/spawn-fcgi.www-data.socket # Используем сокет поэтому FCGI_ADDRESS и FCGI_PORT отключаем FCGI_ADDRESS= FCGI_PORT= # Путь к файлу php-cgi FCGI_PROGRAM=/usr/bin/php-cgi # Пользователь и группа по которым будет работать php-cgi # права на сокет -M 0770, дают возможность nginx'у, который состоит в группе www-data обращаться к сокету FCGI_USER=www-data FCGI_GROUP="www-data -M 0770" # Количество управляющих (мастер) процессов fastcgi (работают не зависимо) FCGI_CHILDREN=1 # Количество запущенных подпроцессов php для каждого мастер процесса fastcgi # Чем больше нагрузка тем, больше должно быть больше значение PHP_FCGI_CHILDREN=5 # Количество запросов через которые процесс php автоматически будет перезапущен. # Это защищает от возможных утечек памяти PHP_FCGI_MAX_REQUESTS=500 # Разрешить некоторые переменные окружения ALLOWED_ENV="PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS"
В примере настройка работы через сокет!
В версии /etc/init.d/spawn-fcgi скрипта от 2012.04.02 директория /var/run/spawn-fcgi пересоздается каждый раз директивой «checkpath -q -d -m 700 /var/run/spawn-fcgi». Если все оставить как есть, то директория будет создана от имени root'а и ни nginx ни www-data не будут иметь прав на доступ к содержимому директории. Необходимо исправить checkpath следующим образом:
checkpath -q -d -o www-data:www-data -m 750 /var/run/spawn-fcgi
Создать ссылку
ln -s /etc/init.d/spawn-fcgi /etc/init.d/spawn-fcgi.www-data
Запуск
/etc/init.d/spawn-fcgi.www-data start
Добавить в автозагрузку
rc-update add spawn-fcgi.www-data default
Настройка хоста test1:
nano /etc/nginx/vhosts.a/test1
test1
server { listen 80 ; server_name test1.lan; access_log /var/log/nginx/test1.access_log main; error_log /var/log/nginx/test1.error_log info; # корневой каталог сайта root /var/www/; index index.php; location ~ \.php$ { #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/spawn-fcgi/spawn-fcgi.www-data.socket-1; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #Подключается /etc/nginx/fastcgi_params include fastcgi_params; } }
Рестарт
/etc/init.d/nginx restart
Проверка http://test1.lan/
Обсуждение