[[Установка Nginx + PHP + FastCGI на Gentoo Linux]]

Gentoo

Установка 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

Тест странички phpinfo()

Работоспособность на малых нагрузках

Запуск 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/

Тест странички phpinfo()



Обсуждение

lexa, 2011/01/06 22:53
fastcgi_param  HTTPS on;
Ваш комментарий. Вики-синтаксис разрешён:
73 -12 = ?
 
howto/gentoo/nginx.txt · Последние изменения: 2012/11/29 01:10 — noxilie
Gentoo Linux Driven by DokuWiki