Настройка NGINX, MySQL, PHP-FPM для OctoberCMS.

Данный мануал рассчитан на пользователей, которые умеют работать с командной строкой. Другими словами - у вас есть выделенный (виртуальный, облачный, неважно) сервер, к которому прилагается ssh-доступ и права на дальнейшие операции.

Здесь мы покажем, как установить комплекс NGINX, MySQL, PHP-FPM на сервер Ubuntu 18.04, так как сами, в большей части проектов, используем именно ее.

1. Установка Nginx

Да, да - Nginx, после долгих мытарств и тестирования связок Apache+PHP, Apache+Nginx+PHP, мы пришли к выводу, что наиболее оптимальная связка для наших проектов на OctoberCMS - Nginx+PHP-FPM.

Итак, начнем.

Всё ПО берем из хранилищ пакетов, заданных по-умолчанию в Ubuntu, используя команду apt

Выполним установку сервера Nginx:

sudo apt update
sudo apt install nginx

Дождемся выполнения установки.

UFW

Если вы не хотите использовать брандмауэр - можно пропустить этот раздел

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

Сделаем это с помощью утилиты UFW.

По-умолчанию, утилита ufw включена в дистрибутив современных версий Ubuntu. Для того, чтобы проверить наличие на вашем сервере, используйте команду

sudo ufw status
//если вы увидите сообщение, типа
Status: inactive

то всё в порядке - утилита установлена, но не активирована, если сообщение будет вида:

command not found: ufw //или нечто подобное =)

то вам необходимо будет установить ufw одной командой:

sudo apt install ufw

Теперь базовая настройка

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

sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx HTTP'

После ввода этих команд включите ufw командой

sudo ufw enable

Далее можно проверить все разрешения ufw следующей командой

sudo ufw status

Результат должен быть примерно таким

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Что мы имеем в результате этих процедур:

  • установленный Nginx
  • настроенный брандмауэр

Теперь, если ввести в браузере строку типа http://ip_адрес_вашего_сервера, то вы увидите такое сообщение

Это означает, что всё в порядке и мы можем приступить к дальнейшей настройке!

2. Установка MySQL

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

Для установки MySQL вводим следующее:

sudo apt install mysql-server

Можно заморочиться с настройками безопасности MySql, а можно ограничиться создание не-root пользователя, который будет иметь доступ только к одной базе данных вашего сайта. Чем мы и займемся немного позже.

Итак, MySql установлена, для проверки можно ввести в терминале

sudo mysql

Мы получим доступ к mysql без пароля, так как базовая конфигурация позволяет пользователю root СУБД MySQL получать доступ к MySQL с помощью команды sudo mysql

После ввода sudo mysql вы увидите командную строку MySQL, для выхода из используем команду exit.

Создание базы данных проекта

Лучший вариант: одна БД - один пользователь

Приступим.

В данном примере мы создаем БД с именем october и пользователя с именем user и паролем password. Вы конечно же поменяете эти имена и пароли на свои.

// вводим в терминале
sudo mysql

// далее создаем новую базу данных october
CREATE DATABASE october CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

// Теперь нам необходимо создать пользователя user для этой БД
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';

// Добавить немного прав для него
GRANT ALL ON 'october'.'*' TO 'user'@'localhost';

// Теперь применим внесенные изменения командой
FLUSH PRIVILEGES;

// На этом, мы заканчиваем и выходим из утилиты
exit;

Чуть не забыл, если мы всё таки используем брандмауэр - для MySql необходимо добавить правила в ufw

// Разрешаем бегать внутри нашего сервера
sudo ufw allow from 127.0.0.1 to 127.0.0.1 port 3306 proto tcp

// Конечно же можно можно написать просто
sudo ufw allow mysql
// Это позволит подключаться к БД удаленно через различные клиенты,
// но это уже другая история

3. Установка PHP-FPM и настройка Nginx

Итак, на предыдущих шагах мы поставили Nginx, Mysql, создали БД для проекта, создали пользователя MySql, который имеет доступ только к определенной базе данных. Настало время финального шага - поставить и настроить менеджер процессов fastCGI, он же php-fpm.

В зависимости хостинга вам может потребоваться установить хранилище Ubuntu universe, которое включает бесплатное ПО, прежде чем устанавливать пакет php-fpm. Для этого можно ввести следующую команду:

sudo add-apt-repository universe

Далее необходимо установить php-fpm с пакетом php-mysql, который позволит PHP взаимодействовать с серверной частью вашей базы данных.

// Поставит самые свежие версии
// Делайте так - если уверены, что ваш проект сможет на этом работать
sudo apt install php-fpm php-mysql

// Так же можно указать версионность (лучше так и сделать)
// Например
sudo apt install php7.4-fpm php-mysql

Что дальше?

Необходимо проверить что и как установилось, пишем

php -v

// Видим подобный ответ
PHP 7.4.3 (cli) (built: Oct  6 2020 15:47:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

Еще не мешает проверить какие расширения установлены для PHP

php -m

// Видим подобный ответ
[PHP Modules]
calendar
Core
ctype
curl
...
...
xmlwriter
xsl
Zend OPcache
zip
zlib

Также, вспоминаем, что OctoberCMS требует наличия обязательных для него модулей - список можно посмотреть тут

Проверяем, всё ли установлено - если нет, то доустанавливаем требуемые модули
Пример установки модулей (для версии 7.4)

apt install php7.4-ctype 
apt install php7.4-curl 
apt install php7.4-xml 
apt install php7.4-fileinfo 
apt install php7.4-gd 
apt install php7.4-json 
apt install php7.4-mbstring 
apt install php7.4-zip

Ура - мы всё установили! Осталось настроить =)

4. Настройка под проект на OctoberCMS

Итак, теперь всё в порядке - есть сервер, сервер баз данных,

Создадим директорию проекта, для примера назовем его october

mkdir /var/www/october

Далее переходим в созданную директорию и устанавливаем OctoberCMS

cd /var/www/october

Установить можно несколькими способами:

// Способ 1 (не тру и возможно его исключат из документации)
php -r "eval('?>'.file_get_contents('https://octobercms.com/api/installer'));"

// Способ 2 (тру)
composer create-project october/october ./

Про различия можно почитать здесь

Не забываем дать права на директорию для пользователя nginx

// по-умолчанию nginx - это пользователь www-data в группе www-data
chown www-data:www-data /var/www/october -R

// И права на запись в папки storage и themes
chmod 775 /var/www/october/storage -R
chmod 775 /var/www/october/themes -R

Всё - основные вещи настроены, можно запустить установку OctoberCms из командной строки:

cd /var/www/october
php artisan october:install

// Если мы прошли все шаги верно, то после выполнения
// этой команды миграции OctoberCms накатятся на созданную
// ранее БД october

На этом этапе мы имеем установленный Nginx, MySql с базой и пользователем, PHP-FPM и установку OctoberCMS.

Осталось всё это дело подружить и запустить в работу!

5. Настройка хоста

Тут мы рассматриваем классическую ситуацию:

  • у вас есть доменное имя
  • в ДНС записи настроены и ссылаются на ваш сервер (который мы ковыряем)

Для примера будем использовать домен october.com (как будто мы богатые и купили его у дяди Сэма)

Настройка хоста

Создадим файл конфига в директории nginx

sudo nano /etc/nginx/sites-available/october.com

Содержимое этого файла такое

 server {
        listen 80;
        root /var/www/october;
        server_name october.com;

        # Тут небольшая хитрость
        # Для большей крутости мы будет хранить основные настройки
        # во внешнем файле и подключим его
        include /var/www/october/.nginx;
}

Теперь в директории нашего проекта создадим файл настроек для хоста

sudo nano /var/www/october/.nginx

с таким содержимым (можно смело копировать):

# Разрешаем пользователям заливать файлы не больше 8Мб
client_max_body_size 8M; 

# Далее стандартный конфиг для OctoberCMS с официального сайта

index index.php;
if ($request_uri ~* "^(.*/)index\.(?:php|html)$") {
    return 301 $1;
}

location / {
    rewrite ^/.*$ /index.php last;
}

location ~ ^/index.php {
    include snippets/fastcgi-php.conf;
    # Тут в зависимости от версии указываем сокет (у нас 7.4)
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_read_timeout 300;
}

location ~ ^/(.*\.(ac3|avi|bmp|bz2|css|cue|dat|doc|docx|dts|exe|flv|gif|gz|html|ico|img|iso|jpeg|jpg|js|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|png|ppt|pptx|qt|rar|rm|swf|tar|tgz|txt|wav|xls|xlsx|zip|7z|svg|ttf|woff|woff2|eot))$ {
    sendfile on;
    access_log off;
    expires max;
}

# Whitelist

## Let October handle if static file not exists
location ~ ^/favicon\.ico { try_files $uri /index.php; }
location ~ ^/sitemap\.xml { try_files $uri /index.php; }
location ~ ^/robots\.txt { try_files $uri /index.php; }
location ~ ^/humans\.txt { try_files $uri /index.php; }
location ~ ^/[0-9a-z]+.html { try_files $uri /index.php; }
location ~ ^/[0-9a-z]+.tar.gz {try_files $uri /index.php; }

## Let nginx return 404 if static file not exists
location ~ ^/.well-known { try_files $uri 404; }
location ~ ^/storage/app/uploads/public { try_files $uri 404; }
location ~ ^/storage/app/media { try_files $uri 404; }
location ~ ^/storage/temp/public { try_files $uri 404; }
location ~ ^/storage/app/cropped { try_files $uri 404; }
location ~ ^/storage/app/rss { try_files $uri 404; }
location ~ ^/storage/app/collections { try_files $uri 404; }
location ~ ^/modules/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/behaviors/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/behaviors/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/widgets/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/widgets/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/formwidgets/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/formwidgets/.*/resources { try_files $uri 404; }
location ~ ^/modules/.*/reportwidgets/.*/assets { try_files $uri 404; }
location ~ ^/modules/.*/reportwidgets/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/behaviors/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/behaviors/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/reportwidgets/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/reportwidgets/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/formwidgets/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/formwidgets/.*/resources { try_files $uri 404; }
location ~ ^/plugins/.*/.*/widgets/.*/assets { try_files $uri 404; }
location ~ ^/plugins/.*/.*/widgets/.*/resources { try_files $uri 404; }
location ~ ^/themes/.*/assets { try_files $uri 404; }
location ~ ^/themes/.*/resources { try_files $uri 404; }

# Можно включить сжатие (бывает полезным)
gzip on;
gzip_disable "msie6";
gzip_types
application/atom+xml
application/javascript
text/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
font/ttf
application/x-font-ttf
application/vnd.ms-fontobject
application/font-woff
application/font-woff2
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vnd.wap.wml
text/vtt
text/x-component
text/x-cross-domain-policy;
gzip_comp_level 6;
gzip_vary on;
gzip_static off;
gzip_proxied any;

После того, как создан файл настроек и файл-хоста, необходимо активировать файл хоста в nginx:

// Создаем символьную ссылку
ln -s /etc/nginx/sites-available/october.com /etc/nginx/sites-enabled

// Проверить корректность конфигурации можно командой
nginx -t

// Видим в выводе такое
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
// Отлично - работаем дальше (© Сокол)
// Если нет - гуглим, решаем проблемы =)

Перезапускаем сервер Nginx

service nginx restart

6. Запуск!

Теперь, если у нас корректно прописаны ДНС, работает сервер, мы не пропустили ничего важного с настройкой брандмауэра, то всё должно завестись.

Пишем в браузере имя домена - и видим любимую демо-тему OctoberCms.

Спасибо за уделенное время, надеемся, что данная статья хоть кому-то поможет!


PS. Если ком-то вдруг станет интересно, то мы продолжим написание паст, на следующие темы:

  • установка и настройка CertBot и получение самоподписанных сертификатов
  • оптимизация, redis, memcached
  • собственный cdn и кеширование изображение с помощью nginx
  • и тд =)