Как установить стек Nginx, MySQL и PHP (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 запускала их как обычные сервисы, нам нужно сообщить FreeBSD, что мы хотим включить их. Это позволит нам обрабатывать их как службы вместо одноразовых приложений, а также настроить FreeBSD для автоматического запуска их при загрузке.

Во-первых, нам нужно знать правильный параметр rc для каждой службы. Сценарии обслуживания, которые находятся в каталоге + / usr / local / etc / rc.d +, определяют параметр, который должен использоваться для включения каждого сервера с помощью переменной + rcvar +. Мы можем увидеть, на что настроен + 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:
/usr/local/etc/rc.d/nginx:rcvar=
/usr/local/etc/rc.d/php-fpm:rcvar=
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

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

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

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 +:

sudo vi php-fpm.conf

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

Найдите строку, которая выглядит так:

listen = 127.0.0.1:9000

Измените это, чтобы использовать сокет в каталоге + / var / run +:

listen =

Далее мы настроим владельца, группу и набор разрешений создаваемого сокета. Есть закомментированная группа опций, которые обрабатывают эту конфигурацию, которая выглядит следующим образом:

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

Включите их, удалив маркер комментария в начале:

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

Сохраните и закройте файл, когда вы закончите.

Далее нам нужно создать файл + php.ini, который будет настраивать общее поведение PHP. Были включены два примера файлов, которые мы можем скопировать в файл + php.ini, который читает PHP.

Файл + php.ini-production будет ближе к тому, что нам нужно, поэтому мы будем его использовать. Скопируйте рабочую версию в файл, который PHP проверяет на:

sudo cp php.ini-production php.ini

Откройте файл для редактирования с правами + sudo +:

sudo vi php.ini

Внутри нам нужно найти раздел, который настраивает поведение + cgi.fix_pathinfo +. Он будет закомментирован и по умолчанию установлен в «1». Нам нужно раскомментировать это и установить его в «0». Это предотвратит попытки PHP выполнить части пути, если файл, переданный процессу, не найден. Это может быть использовано злоумышленниками для выполнения произвольного кода, если мы не предотвратим это поведение.

Раскомментируйте строку + cig.fix_pathinfo + и установите для нее значение «0»:

cgi.fix_pathinfo=0

Сохраните и закройте файл, когда вы закончите.

Теперь, когда мы полностью настроили PHP-FPM, мы можем запустить сервис, набрав:

sudo service php-fpm start

Теперь мы можем перейти к настройке нашего экземпляра MySQL.

Настроить MySQL

Чтобы начать настройку MySQL, нам нужно запустить службу MySQL:

sudo service mysql-server start

При первом запуске этой команды она создаст необходимую структуру каталогов в файловой системе и установит необходимые ей файлы базы данных. Затем он запустит процесс сервера MySQL.

После запуска службы нам нужно обезопасить установку. Это можно сделать с помощью скрипта с именем + mysql_secure_installation +. Запустите это с привилегиями + sudo +, чтобы заблокировать некоторые небезопасные значения по умолчанию:

sudo mysql_secure_installation
. . .

Enter current password for root (enter for none):

Сценарий начнется с запроса текущего пароля для учетной записи root MySQL. Поскольку мы еще не установили пароль для этого пользователя, мы можем нажать «ENTER», чтобы обойти это приглашение.

Set root password? [Y/n]

Затем он спросит вас, хотите ли вы установить пароль учетной записи root MySQL. Нажмите «ENTER», чтобы принять это предложение. Выберите и подтвердите административный пароль.

Затем скрипт продолжит работу с дополнительными предложениями, которые помогут отменить некоторые небезопасные условия при установке MySQL по умолчанию. Просто нажмите «ENTER» во всех этих подсказках, чтобы выполнить все предложенные действия.

Мы можем перезапустить службу MySQL, чтобы наш экземпляр немедленно внедрил изменения безопасности:

sudo service mysql-server restart

Наш экземпляр MySQL теперь работает и работает так, как мы этого хотим, поэтому мы можем двигаться дальше.

Настроить Nginx

Наша следующая задача - настроить Nginx. Для начала нам нужно запустить веб-сервер:

sudo service nginx start

Теперь мы можем начать настройку Nginx, перейдя в каталог + nginx + в каталоге + / usr / local / etc +:

cd /usr/local/etc/nginx

Здесь нам нужно открыть основной файл конфигурации Nginx с привилегиями + sudo +:

sudo vi nginx.conf

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

Для начала раскомментируйте и измените директиву + user + в верхней части файла. Нам нужно, чтобы веб-сервер работал как + www + пользователь, поскольку именно это ищет наш экземпляр PHP-FPM:

user www;

Мы также должны установить для + worker_processes + количество процессоров или ядер, которые есть в вашей системе. (Чтобы узнать, сколько процессоров имеет ваш сервер, введите + sysctl hw.ncpu + из командной строки):

worker_processes ;

Далее мы установим подробность и местоположение ошибки, используя директиву + error_log +. Мы войдем в каталог + / var / log / nginx / error.log на уровне журнала` + info`:

error_log ;

В блоке + http + мы также настроим журнал доступа. Это будет находиться в + / var / log / nginx / access.log +:

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

В блоке + server + нам нужно изменить директиву + server_name +, чтобы использовать доменное имя или IP-адрес нашего сервера. Мы также можем заставить наш сервер отвечать на имя хоста + www +, добавив его после основного домена:

server {
   listen          80;
   server_name      www.;

   . . .

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

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

server {

   . . .




   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;
   }

Все вместе, с удаленными комментариями, файл должен выглядеть примерно так:

worker_processes  ;


events {
   worker_connections  1024;
}

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



   sendfile        on;
   keepalive_timeout  65;

   server {
       listen       80;
       server_name   www.;



       location / {

       }

       error_page      500 502 503 504  /50x.html;
       location = /50x.html {
           root /usr/local/www/nginx-dist;
       }









   }
}

Сохраните и закройте файл, когда вы закончите.

Теперь нам нужно создать каталог журналов и файлы, на которые мы ссылаемся в нашем файле. Сначала создайте каталог + / var / log / nginx +:

sudo mkdir -p /var/log/nginx

Далее мы можем создать пустые файлы журнала:

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

Теперь мы готовы настроить корневой каталог вашего документа. Мы настроили наш корень на + / usr / local / www / nginx +, но в настоящее время это символическая ссылка на каталог + / usr / local / www / nginx-dist +, который может обновляться пакетом операция в будущем.

Мы должны уничтожить ссылку и снова создать несвязанный каталог:

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

Поскольку нам все еще нужно протестировать наш веб-сервер, мы можем скопировать файл + index.html в наш новый веб-корень:

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

Пока мы здесь, мы должны также создать временный файл + info.php +, который мы можем использовать для проверки способности Nginx передавать запросы в PHP-FPM. Создайте файл в корне документа с привилегиями + sudo +:

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 в том месте, где была обнаружена ошибка, и попытайтесь устранить проблему.

Когда ваша конфигурация проверена правильно, мы можем перезапустить Nginx:

sudo service nginx restart

Тестирование результатов

Наш веб-стек завершен. Все, что нам осталось сделать, это проверить.

В своем веб-браузере начните с перехода к имени базового домена или IP-адресу сервера:

http://

Вы должны увидеть содержимое файла + index.html +, который мы скопировали. Это будет выглядеть примерно так:

изображение: https: //assets.digitalocean.com/articles/freebsd_lemp/default_index.png [индекс FreeBSD Nginx по умолчанию]

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

Далее мы должны проверить созданный нами файл + info.php +. В вашем браузере зайдите на свое доменное имя или IP-адрес сервера, а затем + / info.php:

http:///info.php

Вы должны увидеть сгенерированную информационную страницу PHP, которая выглядит примерно так:

изображение: https: //assets.digitalocean.com/articles/freebsd lemp / phpinfo.png [страница FreeBSD phpinfo]

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

После тестирования вашей конфигурации, хорошей идеей будет удалить файл + info.php + из корня вашего документа, так как он может выдать некоторую конфиденциальную информацию о вашей установке:

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

Вы всегда можете легко восстановить этот файл позже.

Заключение

Теперь у вас должен быть полнофункциональный веб-сервер на базе Nginx, который может обрабатывать динамический контент PHP и использовать MySQL для хранения данных. Эта конфигурация может использоваться в качестве основы для множества других конфигураций и веб-приложений.

Related