Найти в Дзене

Настройка 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

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

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

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;
}
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; }
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
  • и тд =)

#octoberCms #nginx #mysql #php-fpm