Веб-сервер Nginx + PHP + spawn-fcgi
Статья рассказывает о построение небольшого хостинг веб-сервера на Gentoo Linux используя Nginx и spawn-fcgi для PHP.
Подготовительные операции
Сайты будут размещаться в папке /var/www по шаблону /var/www/${DOMAIN}/${SITE}, например:
- сайт test.my - папка /var/www/test.my/www.test.my/
- сайт admin.test.my - папка /var/www/test.my/admin.test.my/
Создадим папку /var/www:
mkdir /var/www
Создадим пользователя и группу www-data, которая будет иметь полный доступ к файлам сайта (под этим пользователем будет работать php):
groupadd -g 33 www-data adduser -u 33 -g 33 -d /var/www www-data
Для корректной работы необходима поддержка ACL для файловой системы и наличие пакета acl:
emerge sys-apps/acl -av
Установка прав на папку:
setfacl -d -m u:www-data:rwx /var/www/
Установка Nginx
Я использую следующие USE флаги:
echo 'www-servers/nginx addition fastcgi flv imap pcre perl random-index ssl status sub webdav zlib' >> /etc/portage/package.use
Установка:
emerge www-servers/nginx -av
Установка прав для пользователя nginx на чтение данных из папки с сайтами /var/www:
setfacl -d -m u:nginx:r-x /var/www/
Настройка nginx
Главный файл конфига:
/etc/nginx/nginx.conf
##### Начала конфига по умолчанию при установке пакета: user nginx nginx; worker_processes 1; error_log /var/log/nginx/error_log info; events { worker_connections 8192; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; client_header_timeout 10m; client_body_timeout 10m; send_timeout 10m; connection_pool_size 256; client_header_buffer_size 1k; large_client_header_buffers 4 2k; request_pool_size 4k; gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; output_buffers 1 32k; postpone_output 1460; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 75 20; ignore_invalid_headers on; ##### Конец конфига по умолчанию, дальше содержимое заменить указанными ниже стройками # Установите если ваш nginx находиться за проксирующим сервером set_real_ip_from 10.0.0.0/8; real_ip_header X-Real-IP; # Максимальный размер POST данных # (ограничивает макcимальный размер файла при загрузке на сайт) client_max_body_size 300m; # Параменты fastcgi include fastcgi_params; # Нужно для php fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # Подключание хостов include /etc/nginx/vhosts.d/*; }
Создаем папку /etc/nginx/vhosts.d где будут размешаться активные хосты nginx:
mkdir /etc/nginx/vhosts.d
И папку /etc/nginx/vhosts.avail с размещение неактивных конфигов хостов:
mkdir /etc/nginx/vhosts.avail
Создадим конфигурацию хоста по умолчанию:
/etc/nginx/vhosts.avail/100_default_vhost.conf
server { listen *:80 default; # задает имя сервера, можно испльзовать "_" для обработки всех доменов server_name _; # задает индексные страницы index index.php index.html index.htm; # определяет имя запрашиваемого сайта # !!! запрашиваемый хост обязательно должен содержать домен 3 уровня, # !!! т.е. server.my не правильно, нужно например WWW.server.ru # !!! (позднее это будет исправлено) if ($host ~* "(.*)\.(.*)\.(.*)$" ) { set $m_domain $2.$3; set $m_site $1.$m_domain; } # и устанавливает нужных docroot root /var/www/$m_domain/$m_site/htdocs; # Обработка файлов php через spawn-fcgi location ~ \.php$ { if ( -e $request_filename) { fastcgi_pass unix:/var/run/spawn-fcgi/spawn-fcgi.www-data.php.sock-1; } } # запрет на доступ к файлам .htpasswd и .htaccess location ~ /\.ht { deny all; } }
Активируем настройки хоста по умолчанию:
ln -s /etc/nginx/vhosts.avail/100_default_vhost.conf /etc/nginx/vhosts.d/100_default_vhost.conf
Выполняем запуск nginx:
/etc/init.d/nginx start
И добавляем в автозагрузку:
rc-update add nginx default
Установка MySQL
Я использую следующие USE флаги:
echo 'dev-db/mysql -*' >> /etc/portage/package.use
т.е. отключаю все USE, т.к. они редко нужны и только создают лишние зависимости.
Установка:
emerge dev-db/mysql -av
Настройка MySQL
Для инициализации выполните:
emerge --config dev-db/mysql
и задайте пароль для root.
Запуск:
/etc/init.d/mysql start
Автозагрузка:
rc-update add mysql default
Установка PHP
Я использую следующие USE флаги:
echo 'dev-lang/php bcmath berkdb bzip2 calendar cgi cli crypt ctype curl curlwrappers discard-path exif filter force-cgi-redirect ftp gd gmp hash iconv imap json mhash mysql mysqli ncurses nls pcntl pcre pdo pic posix readline reflection session sharedext simplexml snmp soap sockets spell spl ssl suhosin sysvipc tidy tokenizer truetype unicode wddx xml xmlreader xmlrpc xmlwriter xpm xsl zip zlib' >> /etc/portage/package.use
Установка:
emerge dev-lang/php -av
Установка spawn-fcgi
Для работы php вместе с nginx потребуется spawn-fcgi.
Возможно потребуется размаскировать пакет:
echo 'www-servers/spawn-fcgi' >> /etc/portage/package.keywords
Установка:
emerge www-servers/spawn-fcgi -av
Поправка прав доступа:
chmod 755 /var/run/spawn-fcgi/
Настройка spawn-fcgi
Скопируем шаблонный конфиг /etc/conf.d/spawn-fcgi в рабочий:
cp /etc/conf.d/spawn-fcgi /etc/conf.d/spawn-fcgi.www-data.php
И отредактируем его:
/etc/conf.d/spawn-fcgi.www-data.php
# Рабочий сокет FCGI_SOCKET=/var/run/spawn-fcgi/spawn-fcgi.www-data.php.sock # Используем сокет поэтому FCGI_ADDRESS и FCGI_PORT отключаем FCGI_ADDRESS= FCGI_PORT= # Использовать php-cgi в режиме fastcgi FCGI_PROGRAM=/usr/bin/php-cgi # Пользователь и группа по которым будет работать php # дописка "-M 0777" временно необходимо, т.к. сокет создается с не подходящими правами по умолчанию, а опции чтобы это изменить еще нет FCGI_USER=www-data FCGI_GROUP="www-data -M 0777" # Количество процессов php (чем больше нагрузка тем больше должно быть это значение) PHP_FCGI_CHILDREN=5 # Количество запросов через которые процесс php автоматически будет перезапушен. # Это защищает от возможных утечек памяти PHP_FCGI_MAX_REQUESTS=500 # Разрешить некоторые переменнные окружения ALLOWED_ENV="PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS"
Теперь нужно настроить скрипт запуска:
ln -s /etc/init.d/spawn-fcgi /etc/init.d/spawn-fcgi.www-data.php
Выполняем запуск spawn-fcgi:
/etc/init.d/spawn-fcgi.www-data.php start
И добавляем в автозагрузки:
rc-update add spawn-fcgi.www-data.php default
Пример работоспособности
Для простой проверки создадим папку сайта:
mkdir /var/www/my.test/www.my.test/htdocs
с файлом:
echo "test" > /var/www/index.html
И обратимся в браузере по адресу http://www.my.test/
Установка phpmyadmin
В качестве примера продемонстрируем установку phpmyadmin для управления MySQL.
Добавил USE флаг vhosts:
echo 'dev-db/phpmyadmin vhosts' >> /etc/portage/package.use/phpmyadmin
и выполним установку:
emerge dev-db/phpmyadmin -av
Сконфигурируем webapp-config нужным нам образом:
/etc/vhosts/webapp-config
# Установим vhost_root так: vhost_root="/var/www/${vhost_subdomain_2}.${vhost_subdomain_1}/${vhost_hostname}" # И установим управляющий веб-сервер nginx vhost_server="nginx"
Установка веб-приложения для хоста mysql.my.test:
webapp-config -I -h mysql.my.test phpmyadmin 2.11.9.5
Обсуждение