< meta name="referrer" content="origin">
Home » Freebsd » Freebsd настройка php-fpm и nginx

Freebsd настройка php-fpm и nginx

Ранее я уже рассказывал, как установить и настроить Freebsd 10.1 в качестве web сервера ( 1 часть, 2 часть, 3 часть ) Там мы использовали Apache, nginx и php. Здесь же я хочу рассказать об установке и настройке связки nginx+php-fpm. По общепризнанному мнению, такая комбинация работает быстрее, чем связка с apache. Я на своем опыте в этом убедился. При прочих равных условиях, сайт wordpress выдерживает большую нагрузку с nginx и php fpm, нежели apache и php.

Приступим. У нас имеется:

# uname -v
FreeBSD 10.1-RELEASE

Обновим до последней версии с помощью вот этой инструкции. Проверяем, что получилось:

# uname -v
FreeBSD 10.1-RELEASE-p8

Отлично, обновления прошли. Я не буду давать общие рекомендации по настройке сервера, я их уже давал во 2-й части инструкции, ссылки на которую я приводил выше. Можно посмотреть при желании. Приступим сразу к делу.

Установка и настройка mysql на Freebsd

Устанавливаем mysql:

# cd /usr/ports/databases/mysql55-server
# make config-recursive
# make install clean

Добавляем Mysql в автозагрузку:

echo 'mysql_enable="YES"' >> /etc/rc.conf

Создаем для него конфигурационный файл:

# touch /etc/my.cnf

Конфигурацию каждый под свои потребности может сделать, описаний настроек в интернете много. Я предлагаю свой универсальный вариант:

[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]
port = 3306
bind-address = 127.0.0.1
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
log-bin=mysql-bin
log=/var/log/mysql.log
binlog_format=mixed
server-id = 1

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

В моем варианте сервер жестко привязан к локальному интерфейсу и удаленно с ним работать нельзя. Если вам нужны удаленные подключения, то в параметре bind-address добавьте внешний адрес сервера.

Создадим файл логов:

touch /var/log/mysql.log
chown mysql:mysql /var/log/mysql.log

Запускаем Mysql:

# /usr/local/etc/rc.d/mysql-server start

Проверяем, все ли в порядке:

# sockstat | grep mysql

mysql mysqld 46460 13 tcp4 127.0.0.1:3306 *:*
mysql mysqld 46460 15 stream /tmp/mysql.sock

Демон запущен и слушает локальный интерфейс.

Теперь запустим скрипт для настройки безопасности:

# /usr/local/bin/mysql_secure_installation

Задаем пароль для root и далее на все вопросы отвечаем утвердительно:

Установка mysql на Freebsd

На этом установка и настройка mysql закончена. Идем дальше.

Установка и настройка PHP-FPM на Freebsd

Начиная с версии php 5.3 php-fpm идет как модуль, поэтому просто начинаем установку php и указываем в опциях fpm:

# cd /usr/ports/lang/php5
# make config-recursive

php-fpm установка на freebsd

# make install clean

Ставим теперь дополнения php-extentions:

# cd /usr/ports/lang/php5-extensions
# make config-recursive

Дополнений много, все ставить не обязательно, можно будет остальное доставить потом в случае необходимости. Я обычно выбираю наиболее популярные и необходимые:

BZ2, CTYPE, CURL, DOM, EXIF, FILTER, FTP, GD, GETTEXT, HASH, ICONV, JSON, MBSTRING, MCRYPT, MYSQL, MYSQLI, PDF, PDO, PDO_SQLITE, PHAR, POSIX, SESSION, SIMPLEXML, SQLITE3, YOKENIZER, XML, XMLREADER, XMLWRITER, ZIP

# make install clean

Добавляем php-fpm в автозагрузку:

# echo 'php_fpm_enable="YES"' >> /etc/rc.conf

Редактируем файл с настройками, приводим его к следующему виду:

# mcedit /usr/local/etc/php-fpm.conf

[global]
pid = run/php-fpm.pid

[www]
user = www
group = www

# работа через unix сокет, а не tcp, дает небольшой прирост производительности
listen = /tmp/php-fpm.sock
# права доступа к сокету
listen.owner = www
listen.group = www
listen.mode = 0660

# как будут создаваться новые рабочие процессы
pm = dynamic
# максимальное оличество рабочих процессов
pm.max_children = 10
# число запущенных процессов при старте сервера
pm.start_servers = 2
# минимальное и максимальное количество процессов в простое
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Проверяем синтаксис настроек:

# php-fpm -t

NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful

Стартуем php-fpm:

# /usr/local/etc/rc.d/php-fpm start

Проверяем запустился ли:

# sockstat | grep php-fpm

www php-fpm 504 0 stream /tmp/php-fpm.sock
www php-fpm 503 0 stream /tmp/php-fpm.sock
root php-fpm 502 4 stream -> ??
root php-fpm 502 6 stream -> ??
root php-fpm 502 7 stream /tmp/php-fpm.sock

Все в порядке. Идем дальше.

Установка и настройка nginx на Freebsd

Устанавливаем nginx на наш Freebsd сервер:

# cd /usr/ports/www/nginx
# make config-recursive

Выбираем настройки по-умолчанию.

# make install clean

Добавляем nginx в автозагрузку:

# echo 'nginx_enable="YES"' >> /etc/rc.conf

Редактируем файл настроек. Я приведу пример с двумя виртуальными серверами, на одном из которых будут настройки для wordpress, другой будет для phpmyadmin, я люблю его вешать на отдельный поддомен.

# mcedit /usr/local/etc/nginx/nginx.conf

user www;
worker_processes 1;

pid /var/run/nginx.pid;
error_log /var/log/nginx-error.log warn;

events {
worker_connections 1024;
use kqueue;
}

http {
include 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"';

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_tokens off;

fastcgi_intercept_errors on;
client_max_body_size 50m;

server {
listen 80;
server_name www.site1.ru;
rewrite ^ http://site1.ru$request_uri? permanent;
}

# wordpress
server {
listen 80;
server_name site1.ru;
root /web/sites/site1.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/site1.ru/log/access.log main;
error_log /web/sites/site1.ru/log/error.log;

location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico)$ {
access_log off;
expires max;
}
location ~ \.php$ {
fastcgi_pass   unix:/tmp/php-fpm.sock;
fastcgi_index index.php;

fastcgi_param DOCUMENT_ROOT /web/sites/site1.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/site1.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/site1.ru/www$fastcgi_script_name;

include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ /\.ht {
deny all;
}
}
# phpmyadmin
server {
listen 80;
server_name pma.site1.ru;
root /web/sites/pma.site1.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/pma.site1.ru/log/access.log main;
error_log /web/sites/pma.site1.ru/log/error.log;

location ~ \.php$ {
fastcgi_pass   unix:/tmp/php-fpm.sock;
fastcgi_index index.php;

fastcgi_param DOCUMENT_ROOT /web/sites/pma.site1.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/pma.site1.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/pma.site1.ru/www$fastcgi_script_name;

include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}
}

Создаем необходимые каталоги:

# mkdir /web && mkdir /web/sites && mkdir /web/sites/site1.ru && mkdir /web/sites/site1.ru/www && mkdir /web/sites/site1.ru/log && mkdir /web/sites/pma.site1.ru && mkdir /web/sites/pma.site1.ru/www && mkdir /web/sites/pma.site1.ru/log
# chown -R www:www /web

Проверяем конфигурацию:

# rehash
# nginx –t

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: [emerg] mkdir() "/var/tmp/nginx/client_body_temp" failed (2: No such file or directory)
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

Почему-то nginx не смог создать папку во временном каталоге. Поможем ему сами:

# mkdir /var/tmp/nginx
# nginx -t

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Все в порядке. Наш web сервер на Freebsd готов. Запускаем nginx и проверяем, нормально ли запустился:

# /usr/local/etc/rc.d/nginx start
# sockstat | grep nginx

www      nginx      3488  10 tcp4   *:80                  *:*
www      nginx      3488  11 stream -> ??
root     nginx      3487  3  stream -> ??
root     nginx      3487  10 tcp4   *:80                  *:*
root     nginx      3487  11 stream -> ??

Все в порядке, сервер запущен и слушает 80-й порт. Теперь проверим работу web сервера с помощью тестовой странички. Создаем ее:

# touch /web/sites/site1.ru/www/index.php
# mcedit /web/sites/site1.ru/www/index.php

php

Переходим на сайт по адресу http://site1.ru Не забудьте настроить DNS для доступа к установленному серверу, либо отредактируйте в windows файл hosts, добавив туда строку:

192.168.1.21 site1.ru

где 192.168.1.21 адрес web сервера Freebsd 10.

Вы должны увидеть картинку:

phpinfo на php-fpm+nginx

Если видите ее у себя, поздравляю, вы все настроили правильно и web сервер полностью готов к работе. Остался только маленький штрих. Для удобства управления mysql установим phpmyadmin.

Установка phpmyadmin на web сервер Freebsd

 

# cd /usr/ports/databases/phpmyadmin
# make install clean

Перемещаем файлы из установочной директории по-умолчанию в наш поддомен pma.site1.ru:

# mv /usr/local/www/phpMyAdmin/* /web/sites/pma.site1.ru/www
# mv /usr/local/www/phpMyAdmin/.* /web/sites/pma.site1.ru/www

Меняем владельца:

# chown -R www:www /web/sites/pma.site1.ru/www

Настраиваем DNS записи на pma.site1.ru или просто добавляем в винде в файл hosts строку

192.168.1.21 pma.site1.ru

И заходим по адресу http://pma.site1.ru

phpmyadmin php-fpm nginx

У вас должно открыться окно приветствия phpmyadmin. Вводим сюда пользователя и пароль root, которые мы задали в самом начале настройки и попадаем в панель управления базами.

На этом настройка web сервера на базе Freebsd 10.1 и связки nginx + php-fpm закончена.


Помогла статья? Есть возможность отблагодарить автора

Дополнительные материалы по Freebsd

Рекомендую полезные материалы по Freebsd:
  • Установка
  • Настройка
  • Обновление
  • Шлюз
  • Прокси сервер
  • Веб сервер NGINX
  • Веб сервер Apache
Описание установки Freebsd 11 на одиночный диск, либо на софтовый raid1, сделанный средствами zfs, которые поддерживает стандартный установщик.
Базовая настройка Freebsd, которую можно выполнить после установки сервера общего назначения. Представлены некоторые рекомендации по повышению удобства пользования и безопасности.
Описание и нюансы обновления системы Freebsd с помощью утилиты freebsd-update. Показано пошагово на конкретном примере обновления.
Настройка Freebsd шлюза для обеспечения выхода в интернет. Используется ipfw и ядерный нат, dnsmasq в качестве dhcp и dns сервера. Мониторинг сетевой активности с помощью iftop.
Подробная настройка на Freebsd прокси сервера squid + sams2 - панели управления для удобного администрирования.
Настройка максимально быстрого web сервера на базе Freebsd и nginx + php-fpm. Существенный прирост производительности по сравнению с классическим apache.
Настройка web сервера на Freebsd в связке с apache, nginx, php и mysql. Пошаговая установка и настройка каждого компонента.

3 комментария

  1. Спасибо, полезный гайд.

  2. При создании php-fpm.conf закоментаренные символом ‘#’ строки неизбежно дадут ошибку. Исправьте на ‘;’

    • В какой-то новой версии появилось это изменение. Я на centos тоже заметил. На момент написания статьи символ # нормально помечал комментарии.

Добавить комментарий

Ваш e-mail не будет опубликован.