Установка стека FEMP на сервер FreeBSD 10.1

Программы Nginx, MySQL и PHP можно сгруппировать в мощное средство для обслуживания динамического контента в сети. Такая группа программ в системе FreeBSD называется аббревиатурой FEMP.

Данное руководство покажет, как установить стек FEMP на сервер FreeBSD 10.1. Программное обеспечение будет устанавливаться из пакетов, которые позволяют выполнить надёжную стандартную установку, подходящую для большинства серверов.

Установка компонентов

Для начала нужно установить все программы при помощи пакетной системы FreeBSD. Команда install обновляет локальные копии доступных пакетов и устанавливает требуемые пакеты.

sudo pkg install nginx mysql56-server php56 php56-mysql

Это загрузит и установит веб-сервер Nginx (для обслуживания контента), систему управления базами данных MySQL (для хранения данных) и PHP (для обработки данных).

После завершения установки запустите команду rehash, чтобы обновить стандартную оболочку tcsh и сообщить ей о новых пакетах.

rehash

После этого нужно включить и настроить компоненты.

Включение сервисов

Теперь нужно включить установленные программы как стандартные сервисы FreeBSD. После этого система будет обрабатывать их иначе (до этого они обрабатываются как одноразовые приложения) и запускать их автоматически при загрузке сервера.

Для начала нужно узнать параметр rc для каждого сервиса. Он необходим для включения сервисов и определяется при помощи переменной rcvar скриптами, которые хранятся в каталоге /usr/local/etc/rc.d. Чтобы узнать значение переменной rcvar, введите:

grep rcvar /usr/local/etc/rc.d/*

На экране появится примерно такой список:

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/mysql-server:rcvar=mysql_enable
/usr/local/etc/rc.d/nginx:rcvar=nginx_enable
/usr/local/etc/rc.d/php-fpm:rcvar=php_fpm_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

Как видите, эта команда позволяет легко определить параметр для каждого сервиса. Имя самого скрипта (последний компонент пути, после двоеточия) совпадает с именем сервиса, которое использует FreeBSD.

Чтобы включить сервисы, отредактируйте файл /etc/rc.conf:

sudo vi /etc/rc.conf

В этот файл нужно вставить строку для каждого сервиса, который нужно включить. Укажите значение rcvar и добавьте YES:

mysql_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"

Сохраните и закройте файл.

Настройка PHP

Теперь нужно настроить сервис PHP-FPM, который будет отвечать за обработку PHP-запросов веб-сервера.

Откройте каталог /usr/local/etc, в котором хранятся конфигурации опциональных программ.

cd /usr/local/etc

В нем находится ряд конфигурационных файлов PHP, которые нужно отредактировать. Сначала откройте файл PHP-FPM:

sudo vi php-fpm.conf

В нём нужно изменить несколько опций. Сначала нужно настроить PHP-FPM для использования сокета Unix вместо сетевого порта, что повысит безопасность сервера.

Найдите строку:

listen = 127.0.0.1:9000

Отредактируйте её, указав сокет каталога /var/run:

listen = /var/run/php-fpm.sock

После этого нужно изменить владельца, групп и права доступа к сокету. В файле находится закомментированный блок опций, отвечающий за эти настройки:

;listen.owner = www
;listen.group = www
;listen.mode = 0660

Удалите комментарии, чтобы включить эти опции:

listen.owner = www
listen.group = www
listen.mode = 0660

Сохраните и закройте файл.

После этого нужно создать файл php.ini, который настроит общее поведение PHP. Для этого можно использовать один из двух предоставленных образцов этого файла.

Файл php.ini-production больше соответствует требованиям данной настройки. Скопируйте его содержимое в новый файл:

sudo cp php.ini-production php.ini

Затем откройте файл:

sudo vi php.ini

В нём нужно найти строку cgi.fix_pathinfo. По умолчанию она закомментирована и имеет значение 1. Нужно раскомментировать её и изменить значение на 0. После этого PHP не будет пытаться выполнить часть пути в случае, если запрошенный файл не найден (такое поведение может позволить злоумышленникам выполнить случайный код).

Раскомментируйте строку и измените значение:

cgi.fix_pathinfo=0

Сохраните и закройте файл.

Настройка PHP-FPM завершена. Теперь можно запустить сервис.

sudo service php-fpm start

Настройка MySQL

Сначала нужно запустить сервис MySQL:

sudo service mysql-server start

Эта команда, запущенная впервые, создаст необходимую структуру каталогов и установит все файлы БД. После этого будет запущен сервер MySQL.

После запуска сервиса нужно обезопасить установку. Для этого предназначен скрипт mysql_secure_installation. Запустите его:

sudo mysql_secure_installation
. . .
Enter current password for root (enter for none):

Сначала скрипт запросит текущий root пароль MySQL; поскольку такого пароля пока ещё нет, просто нажмите Enter.

Set root password? [Y/n]

После этого скрипт предложит создать такой пароль. Для этого нажмите Enter, а затем введите и подтвердите пароль.

После этого скрипт удалит ненадёжные стандартные настройки. На остальные его сообщения можно просто нажать Enter.

Перезапустите сервис MySQL, чтобы обновить настройки.

sudo service mysql-server restart

Настройка Nginx

Сначала запустите веб-сервер:

sudo service nginx start

В каталоге /usr/local/etc откройте каталог nginx:

cd /usr/local/etc/nginx

Теперь откройте главный конфигурационный файл Nginx:

sudo vi nginx.conf

В нём можно настроить взаимодействие веб-сервера с остальными компонентами группы.

Раскомментируйте и измените директиву user в начале файла. Веб-сервер должен работать как пользователь www, поскольку так его находит PHP-FPM.

user www;

В директиве worker_processes нужно указать количество CPU или ядер системы.

worker_processes 2;

Примечание: Чтобы узнать количество CPU сервера, введите в командную строку sysctl hw.ncpu.

Теперь нужно настроить логирование ошибок при помощи директивы error_log. Укажите путь к логу (/var/log/nginx/error.log) и уровень логирования (info).

error_log /var/log/nginx/error.log info;

В блоке http нужно настроить лог доступа (/var/log/nginx/access.log).

access_log /var/log/nginx/access.log;

В блоке server нужно отредактировать директиву server_name и указать в ней доменное имя или IP сервера. Также здесь можно настроить доступ к домену с префиксом www.

server {
listen          80;
server_name     example.com www.example.com;
. . .

В главном блоке server нужно настроить директивы root и index. Каталог document root будет находиться в /usr/local/www/nginx, а директива index должна обслуживать файлы index.php прежде index.html и index.htm.

Поскольку эти директивы определяются в контексте server, их не нужно добавлять в блок location /. В этом блоке нужно настроить try_files, чтобы сервер пытался обработать пользовательский запрос как файл, а потом как каталог, прежде чем вернуть ошибку 404.

server {
. . .
root /usr/local/www/nginx;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
. . .

В завершение нужно настроить блок location, отвечающий за обработку файлов PHP. Он обрабатывает запросы, которые заканчиваются на .php; он будет обрабатывать только сами файлы, а в случае если файл не найден он вернёт ошибку 404.

Здесь нужно использовать настроенный в php-fpm.conf сокет. Также нужно настроить некоторые другие опции проксирования FastCGI (частично – в файле fastcgi_params). Настройте параметр SCRIPT_FILENAME, чтобы PHP знал, какие файлы выполнять.

server {
. . .
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}

Общий вид раскомментированных настроек веб-сервера:

user  www;
worker_processes  2;
error_log /var/log/nginx/error.log info;
events {
worker_connections  1024;
}
http {
include       mime.types;
default_type  application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile        on;
keepalive_timeout  65;
server {
listen       80;
server_name  example.com www.example.com;
root /usr/local/www/nginx;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page      500 502 503 504  /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}
}

Сохраните и закройте файл.

Теперь нужно создать каталог для логов и файлов, на который ссылается конфигурационный файл.

sudo mkdir -p /var/log/nginx

В этом каталоге создайте пустые лог-файлы:

sudo touch /var/log/nginx/access.log
sudo touch /var/log/nginx/error.log

Теперь можно настроить document root. Согласно конфигурации каталог document root находится в /usr/local/www/nginx, но символьная ссылка указывает на каталог /usr/local/www/nginx-dist.

Нужно удалить ссылку и создать новый каталог:

sudo rm /usr/local/www/nginx
sudo mkdir /usr/local/www/nginx

Чтобы протестировать работу веб-сервера, скопируйте файл index.html в новый root-каталог.

sudo cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx

Также нужно создать временный файл info.php, чтобы проверить, может ли Nginx передавать запросы PHP-FPM.

sudo vi /usr/local/www/nginx/info.php

Добавьте в файл следующий код, который сгенерирует HTML-страницу, предоставляющую информацию о настройках PHP:

<?php phpinfo(); ?>

Сохраните и закройте файл.

После этого можно перезапустить Nginx, чтобы обновить настройки. Но прежде рекомендуется проверить синтаксис конфигурационного файла на наличие ошибок:

sudo 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

Если же команда вернула сообщение об ошибках, вернитесь в конфигурационный файл и исправьте их.

Перезапустите Nginx:

sudo service nginx restart

Тестирование установки

Итак, теперь стек полностью установлен, осталось только проверить его работу.

Откройте следующую ссылку в браузере:

http://example.com

На экране появится страница index.html:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. […]

Это значит, что сервер Nginx запущен и может обрабатывать HTML-страницы.

После этого нужно проверить info.php. откройте домен или IP-адрес в браузере, добавив секцию /info.php:

http://example.com/info.php

На экране появится информация о настройке PHP.

Если обе эти страницы открылись, стек FEMP успешно установлен на FreeBSD.

После тестирования рекомендуется удалить info.php из каталога document root, поскольку этот файл может открыть доступ к конфиденциальной информации.

sudo rm /usr/local/www/nginx/info.php

При необходимости его всегда можно создать повторно.

Заключение

Теперь на сервер установлен стек FEMP – надёжная основа для запуска сайта. Производительный веб-сервер Nginx может обрабатывать PHP-запросы и хранить данные в MySQL.

Tags: , , , ,

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