Настройка 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)quot;) { 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
- и тд =)