[[ Веб-сервер Nginx + PHP + spawn-fcgi ]]

Gentoo

Веб-сервер 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






Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
214 -15 = 
 
howto/gentoo/gentoo_nginx_php_spawn_fcgi.txt · Последнее изменение: 2022/08/31 14:53 — 127.0.0.1
Gentoo Linux Gentoo Linux Driven by DokuWiki