Установка nginx и php FastCGI на FreeBSD 9.1

Для веб-сервера я использую связку nginx – php. Работает быстро, так как nginx будет раздавать всю статику кроме файлов php. Работать будет с php-fpm (FastCGI Process Manager).
MySQL мы установили раньше: notanony.ru/post/15/
И так приступим к установки.
Обновляем дерево портов и переходим
cd /usr/ports/www/nginx
Далее установим с нужными нам параметрами make install clean

Нечего лишнего, только то что необходимо для работы с php-fpm. Какая опции что дает читаем в документации на официальном сайте, там все подробно на русском написано.
Когда установка прошла, переходим
cd /usr/ports/lang/php5
Далее установим с нужными нам параметрами make install clean

Выбираем FPM. CLI – это работа php через консоль, у меня в cron есть php скрипты.
Дождавшись окончание установки переходим
cd /usr/ports/lang/php5-extensions
Далее установим с нужными нам параметрами make install clean
Хотя можно ставить каждое расширение по отдельности, но я привык выбирать общим списком. Выбираем то что нужно по минимуму, что бы нечего лишнего. Какой модуль для чего нужен читаем на официальном сайте документации.

Когда установили что было нужно переходим к настройки.
Настроим php и php-fpm.
В директории /usr/local/etc/ создадим файл php.ini (файл конфигурации php) на основе файла php.ini-production или загрузим свой php.ini
Настроим php-fpm, файл конфигурации /usr/local/etc/php-fpm.conf
Указал основные и обязательные переменные, за дополнительной информации в документацию на официальный сайт.
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

[global]
; Адрес pid файла
; Default Value: none
pid = /var/run/php-fpm.pid

; Путь для лога
; Default Value: log/php-fpm.log
error_log = /var/log/php-fpm.log

; Тип лога, установлю error, для SSD самое полезное.
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level =  error

; При данном числе рабочих процессов, завершенных с SIGSEGV или SIGBUS за промежуток времени, установленный emergency_restart_interval FPM будет перезагружен.
; Default Value: 0
;emergency_restart_threshold = 0

; Интервал времени, используемый emergency_restart_interval, чтобы определить, когда FPM будет мягко перезагружен. Это полезно для избежания случайных повреждений общей памяти ускорителя (accelerator).
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Время, в течение которого дочерние процессы ждут ответа на сигналы мастер-процессу.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Максимальное количество процессов, значение ноль означает неограниченное количество
; Default Value: 0
; process.max = 128

; Запуск в фоновом режиме. Установка параметра no для отладки.
; Default Value: yes
;daemonize = yes

; Установить открытые rlimit файловый дескриптор для основного процесса.
; Default Value: system defined value
;rlimit_files = 1024

; Установить максимальный размер ядра rlimit для основного процесса
; Default Value: system defined value
;rlimit_core = 0

; Specify the event mechanism FPM will use. The following is available:
; - select     (any POSIX os)
; - poll       (any POSIX os)
; - epoll      (linux >= 2.5.44)
; - kqueue     (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll  (Solaris >= 7)
; - port       (Solaris >= 10)
; Default Value: not set (auto detection)
events.mechanism =  kqueue

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

; Start a new pool named 'www'.
; pool name ('www' here)
[www]

; От кого запускать процесс. Если не указать group, то она будет равняться user. Обязательный параметр.
user = www
group = www

; Адрес по которому можно будет получить доступ к FastCGI
;   'ip.add.re.ss:port'    - IP адрес с портом;
;   'port'                 - Слушать на всех IP с определенным портом;
;   '/tmp/php-fpm.sock' – использовать unix socket.
listen = /tmp/php-fpm.sock

; Устанавливает listen(2) backlog.
; Default Value: 128 (-1 on FreeBSD and OpenBSD)
;listen.backlog = 128

; Задает права для unix socket
; Default Values: используется пользователь и группа, от имени которого запущен сервер, установлен режим 0666
;listen.owner = www
;listen.group = www
;listen.mode = 0666

; С каких IP адресов можно подключаться к FastCGI, мы используем сокет.
;listen.allowed_clients = 127.0.0.1

; Выбор того, как менеджер процессов будет контролировать создание дочерних процессов. Возможные значения: static, ondemand, dynamic. Этот параметр является обязательным
;   static - фиксированное число дочерних процессов (pm.max_children).
;   dynamic - динамически изменяющееся число дочерних процессов, задается на основании следующих директив: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
;   ondemand - число процессов, порождающихся по требованию (когда появляются запросы, в отличии от опции dynamic, когда стартует определенное количество процессов, равное pm.start_servers, вместе с запуском службы.
; Нужно все это мерить, отставлю так как стояло в конфигурации.
pm = dynamic

; Максимальное количество дочерних процессов которые будет созданы.
pm.max_children = 5

; Число дочериных процессов которые будет созданы при запуске
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 2

; Желаемое минимальное число неактивных процессов сервера.
pm.min_spare_servers = 1

; Желаемое максимальное число неактивных процессов сервера.
pm.max_spare_servers = 3

; Через какой промежуток времени будет завершены нерабочие процессы. Работает только с ondemand.
; Default Value: 10s
;pm.process_idle_timeout = 10s;

; Число запросов дочернего процесса, после которого процесс будет перезапущен.
; Default Value: 0
;pm.max_requests = 500

; Ссылка по которой будет отображаться страница статистика. Если не установлено, страница не будет отображаться
; Default Value: не установлено
;pm.status_path = /status

; Ссылка по которой будет отображаться ping-страница. Если не установлено, страница не будет отображаться
; Default Value: не установлено
;ping.path = /ping

; Ответ на ping запрос
; Default Value: pong
;ping.response = pong

; Лог доступа пула.
; Default: не установлено
;access.log = log/$pool.access.log

; Формат лога, читаем официальную документации PHP
; Default: "%R - %u %t \"%m %r\" %s"
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

; Адрес лога для медленных запросов.
slowlog = /var/log/php-fpm-slow.log

; Если запрос выполнялся дольше указано времени, он будет записан в лог slowlog. Значание ноль означает что лог не ведется.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_slowlog_timeout = 5s

Настроим теперь nginx, файл конфигурации /usr/local/etc/nginx/nginx.conf Укажу только основные параметры и как сделать связку с php-fpm. Все параметры описаны на официальном сайте в документации: nginx.org/ru/docs/
user www www;
# количество процессов, можно установить auto. Я поставлю количество ядер.
worker_processes 2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# Путь к pid файлу.
pid	/var/run/nginx.pid;


events {
	# Максимальное количество соединений одного процесса.
	worker_connections 1024;
}


http {
	include       mime.types;
	default_type  application/octet-stream;

	sendfile        on;

	# Время через которое будет закрыто соединение
	keepalive_timeout  65;
    
	# включить сжатие
	#gzip  on;

	server {
		# ip сервер и порт, в таком видел слушает все ip на 80 порту
		listen 80;
		# Домен сайта. Если есть домен которые ссылается на ip где запущен nginx пишем его.
		server_name  localhost;
		# Кодировка сайта по умолчанию.
		charset utf-8;
		# Выключаем логи доступа, так как SSD. Да и не нужно они в большинстве случаев
		access_log off;

		# Путь к всем статичным файлам, по умолчанию открываем index.html и index.php
        location / {
		# Путь к директории где находится наш сайт. По умолчанию во FreeBSD, внутри этой папки создаем папки для каждого домена, сайта.
		root	/usr/local/www/localhost/;
		index	index.html index.php;
		}
		
		# Файлы php обрабатываем через fastcgi_pass
		location ~ \.php$ {
		# IP ардес и порт или сокет, указывает в зависимости как настроили php-fpm
		fastcgi_pass	unix:/tmp/php-fpm.sock;
		fastcgi_index	index.php;
		# Путь к директории где будут php файла, в большинстве случаев такая же как и в location /
		fastcgi_param  SCRIPT_FILENAME  /usr/local/www/localhost/$fastcgi_script_name;
		# Файл параметров FastCGI
		include        fastcgi_params;
		}

	}
}

Добавляем в /etc/rc.conf следующие строчки:
nginx_enable="YES"
php_fpm_enable="YES"

Запускаем nginx и php-fpm:
/usr/local/etc/rc.d/nginx start
/usr/local/etc/rc.d/php-fpm start

Создаем файл index.php в папке /usr/local/www/localhost/ содержания
<?php
phpinfo();
?>
Открывает locahost в браузере или то что указали в настройка nginx, должно быть отображено phpinfo.
Просматриваем логи на наличие предупреждений или ошибок.
Установка и минимальная настройка завершена, если есть вопросы и пожелания с радостью отвечу.
0.10
24.08.2013 21:39