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

Хочу рассказать об установке и настройке связки 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 закончена. Идем дальше.

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

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

# cd /usr/ports/lang/php5
# make config-recursive
# 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

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

192.168.1.21 site1.ru

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

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

Если видите ее у себя, поздравляю, вы все настроили правильно и 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. Вводим сюда пользователя и пароль root, которые мы задали в самом начале настройки и попадаем в панель управления базами.

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

Статью взял тут.

Оставьте ответ

Ваш адрес email не будет опубликован.