Данный мануал рассчитан на пользователей, которые умеют работать с командной строкой. Другими словами - у вас есть выделенный (виртуальный, облачный, неважно) сервер, к которому прилагается 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адресвашего_сервера, то вы увидите WELCOME-экран страндартного хоста Nginx.
Это означает, что всё в порядке и мы можем приступить к дальнейшей настройке!
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
- и тд =)