How to Install Drupal CMS with Apache2 on Ubuntu 22.04

Содержание
  1. ¶Изменения в релизах
  2. Create User Group (Optional)
  3. ¶Программное получение настроек
  4. ¶get()
  5. ¶getAll()
  6. ¶getHashSalt()
  7. Composer (Optional)
  8. ¶Создание файла
  9. MySQL Server
  10. Configure MySQL Server
  11. Create Website Database
  12. Create Website DB User
  13. Create DB Dump User (Optional)
  14. ¶$settings
  15. ¶Соль
  16. ¶Идентификатор деплоя
  17. ¶Контроль доступа для update. php
  18. ¶Прокси
  19. ¶Обратный прокси
  20. Cookie
  21. ¶TTL кеша для ответов 4xx
  22. ¶Время жизни кеша форм
  23. ¶Загрузчик классов
  24. ¶Разрешение авторизованных операций
  25. ¶Права доступа файлов
  26. ¶Основной URL публичных файлов
  27. ¶Путь до публичных файлов
  28. ¶Путь до приватных файлов
  29. ¶Интервал записи сессии
  30. ¶Переопределение строк локали
  31. ¶Тема оформления для режима обслуживания
  32. ¶Хранилище активных конфигураций
  33. ¶Класс Dependency Injection контейнера
  34. ¶Парсер YAML
  35. ¶Шаблоны доверенных хостов
  36. ¶Чёрный список директорий на сканирование
  37. ¶Количество обрабатываемых сущностей за раз
  38. ¶Резервная копия сущностей при обновлении
  39. ¶Отключение принудительного изменения прав на запись для директории сайта
  40. ¶Проверка схемы БД для синонимов
  41. ¶Включение классических миграций нод
  42. ¶Получение информации об обновлениях по HTTP
  43. ¶Управление заголовком для ответов Permissions-Policy
  44. ¶$config
  45. ¶Быстрые 404 страницы
  46. ¶Настройки PHP
  47. ¶Настройка во время выполнения
  48. Other Tools
  49. Apache
  50. Serve From Custom Directories (Optional)
  51. Drush Launcher (Optional)
  52. Installing Drush Launcher
  53. Global Drush (Optional)
  54. Thank You!

¶Изменения в релизах

Чаще всего вы можете обнаружить его по пути /sites/default, однако, фактически это зависит от того, как произведена настройка Drupal и какой подход в разработке был использован.

По умолчанию проверяется только /sites/default, но, если вы настроите мультисайтинг (т.е., присутствует файл /sites/sites.php), то поиск будет происходить по различным директориям.

Рассмотрим на примере. Если Drupal установлен по пути https://www.drupal.org:8080/mysite/test/ то файл settings.php будет искаться движком Drupal в следующих директориях, в порядке убывания их приоритета:

Create User Group (Optional)

So let’s start by creating the directory (if not already created):

$ sudo mkdir /opt/websites

Let’s create the security group:

$ sudo groupadd devs

Let’s change the ownership of the directory:

$ sudo chown root:devs /opt/websites

Finally, let’s permissions for the directory:

$ sudo chmod 2775 /opt/websites

$ touch /opt/websites/afile && rm /opt/websites/afile

¶Программное получение настроек

В Drupal присутствует специальный утилитарный объект DrupalCoreSiteSettings. При помощи данного объекта вы можете получать актуальные настройки которые используются для текущего запроса.

¶get()

Возвращает значение конкретной настройки, принимает два аргумента:

Данный метод вызовет ошибку если вы захотите получить значение для install_profile. Если вы хотите получить название инсталяционного профиля используйте сервис install_profile.

$batch_size = Settings::get(‘entity_update_batch_size’, 50);

¶getAll()

Возвращает все настройки и предназначен только для тестирования.

$settings = Settings::getAll();

¶getHashSalt()

Возвращает значение настройки hash_salt. Если данной настройки нет или она является пустой, то вызывается исключение.

$salt = Settings::getHashSalt();

Composer (Optional)

You can find the installation instructions at getcomposer.org/download, and here I’ll just provide some additional tips. The whole installation is quite simple, and it’s only about executing four lines of code. These lines, copied from the link provided at the moment of this writing, are:

The first line simply downloads composer-setup.php file into the current directory. I have a problem with this line because I’m using an outgoing proxy, and php command isn’t smart enough to pick up the system-wide proxy configuration, so it fails. If it happens, you can simply download the file in any other way, maybe with curl or wget. Here’s an example with curl:

$ curl https://getcomposer.org/installer —output composer-setup.php

The second line from the original code checks validity / integrity of the downloaded file. If the file isn’t valid the command will delete it.

$ sudo php composer-setup.php —filename=composer —install-dir=/usr/local/bin

Note that you can accomplish the same manually, step by step, by first executing the original line, without any arguments, and then manually renaming the file and moving it where you want it — the final result is the same. In fact, it happened to me that the variant with arguments didn’t work (I suspect because of some outgoing proxy setting), and if it happens you can simply do it manually.

The fourth (the last) line from the original script simply deletes composer-setup.php file which you can delete in any other way (i.e. rm composer-setup.php).

You can test the installation by checking the Composer version:

$ composer —version
Composer version 2.0.7 2020-11-13 17:31:06

¶Создание файла

Данный файл необходим для работы Drupal и обязательно должен присутствовать. Вы можете воспользоваться двумя вариантами создания данного файла:

Если у вас уже создан settings.php, то при попытке установки нового сайта, он и будет использован для автозаполнения настроек.

MySQL Server

To install MySQL Server execute:

$ sudo apt install mysql-server

Configure MySQL Server

For fresh MySQL installations, it’s a good idea to execute the included security script which will change some less secure default options. So let’s execute the security script:

$ sudo mysql_secure_installation

The script will guide you through the configuration by asking several questions that are easy to understand and answer. Here I’ll provide my answers only as a reference, but your’s may be different, of course:

Create Website Database

Enter the mysql shell by executing:

Now we can create a new database for the new Drupal site by executing:

Create Website DB User

Note that here I’ve used WITH mysql_native_password option, which is a bit older, but still very secure authentication mechanism. Some other options are also available, like WITH authentication_plugin and WITH caching_sha2_password (which is the default one, and used if WITH part is omitted completely), but mysql_native_password is probably the best choice for PHP applications, including Drupal.

Create DB Dump User (Optional)

В переменной $databases задаются настройки соединения с базами данных. Drupal имеет возможность работать в пределах одного запроса сразу с несколькими базами данных, в том числе разных типов.

Простой пример настройки подключения к БД:

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

Для каждой базы данных, опционально вы можете указать несколько «целей» БД. Целевая БД позволит Drupal пробовать отправлять некоторые запросы в другую БД, а если это не выйдет, будет использована БД по умолчанию. Это полезная особенность для репликаций БД. Drupal может подключаться к серверу с репликой когда это необходимо и если она недоступна, переключаться на основной сервер (термины основной сервер и реплика обычно обозначаются как master/slave в документациях БД).

Общий формат для массива $database следует структуре:

В примере выше, $info_array — массив с настройками подключения БД описанные выше. Первая строка задаёт настройки для набора «default», которая имеет настройки подключения к БД по умолчанию «default» (второй ключ). Вторая и третья строки задают настройки для потенциальных реплик БД. Drupal выберет одно из значений случайным образом в пределах запроса. В четвёртой строке создаётся новая БД с именем «extra».

Дополнительно:  Точка восстановления Windows 10: процесс создания, способ откатить систему

Опционально вы можете задать префикс для таблиц используя свойство prefix. Если префикс указан, название таблицы будет получать данный префикс перед основным названием. Убедитесь что вы указали допустимые символы и значения для БД, обычно это латинские буквы, цифры и нижнее подчёркивание. Если префиксов не требуется или не нужны, используется пустая строка ».

Для того чтобы все таблицы были с префиксом, задайте необходимое значение в prefix:

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

Например, для включения возможности MySQL SELECT превышать системное значение max_join_size и уменьшить таймаут подключения к БД до 5 секунд, используется следующая конфигурация:

Пример настройки подключения к PostgreSQL (pgsql):

Пример настройки подключения к SQLite (sqlite):

¶$settings

В массиве $settings указываются настройки для Drupal которые могут корректировать его поведение.

¶Соль

Соль используемая для генерации одноразовых ссылок, токенов форм, ссылок отписки и т.д.

Значение для данной переменной задаётся случайной генерацией в процессе установки. Если вы поменяете это значение на рабочем сайте, то все ссылки одноразового входа будут инвалидированы.

Для более продвинутой защиты вы можете вынести значение соли за пределы Drupal и запрашивать его из файла или иных мест. Вы также должны убедиться что данный файл не попадает в бэкапы сайта и не хранится в БД.

¶Идентификатор деплоя

Контейнер Drupal для Dependency Injection автоматически инвалидируется и перестраивается при изменении версии ядра. Когда обновляете контриб или кастом модули которые меняют контейнер, изменение данного идентификатора также инвалидирует и перестроит контейнер как только код будет задеплоен.

¶Контроль доступа для update. php

Благодаря этой настройке вы можете временно отключить данную проверку, если по каким-то причинам у вас нет возможности авторизоваться под соответствующим пользователем или пользователя с такими правами не существует.

Значение TRUE — пропускает проверку прав, FALSE (по умолчанию) — будет проверять права доступа.

¶Прокси

Если сайту необходимо обращаться во внешний интернет через прокси, вы можете указать соответствующие настройки.

Для различных запросов может использоваться различный прокси. Для этого имеется три настройки:

¶Обратный прокси

Обратные прокси часто используются для улучшения производительности высоконагруженных сайтов и также могут предоставить новые способы кеширования, безопасности и шифрования. В окружении где Drupal находится за обратным прокси, должен быть получен реальный IP адрес клиента для корректной работы различных подсистем, таких как логирование, статистика и управление доступом. В самом простом сценарии прокси сервер добавляет заголовок X-Forwarded-For в запрос, который содержит IP адрес клиента. Тем не менее HTTP заголовки уязвимы к спуфингу, что позволяет получить доступ к заголовку X-Forwarded-For. Следовательно, Drupal требует указывать адреса всех удалённых прокси для корректной работы.

Включение данной настройки позволяет корректно определять IP адрес клиента. Если ваш сайт работает на шаред хостинге или не имеет обратного прокси, данные настройки должны быть закомментированы (по умолчанию).

Вы также можете настроить доверенные HTTP заголовки для обратного прокси. Общие значения:

Например SymfonyComponentHttpFoundationRequest::HEADER_X_FORWARDED_ALL будет считать доверенными следующие заголовки: X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Proto, X-Forwarded-Port.

По умолчанию Drupal отправляет HTTP заголовок «Vary: Cookie» для всех анонимных пользователей. Это говорит HTTP прокси что он может возвращать результат страницы из своего локального кеша без обращения к веб-серверу если пользователь обращается с тем же заголовком Cookie как оригинальный запрос.

Без использования «Vary: Cookie», авторизованные пользователи также будут получать результат из анонимного кеша. Если сайт по большей части статичен и предназначен для анонимных пользователей, за исключением заранее известных редакторов и администраторов, то данный заголовок можно опустить.

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

¶TTL кеша для ответов 4xx

Элементы кеша которые хранятся на основе URL приводят к увеличению общего числа кеш элементов. Данное поведение может стать проблемой на 404 страницах, которых может быть очень много. Для данных страницы вы можете задать свой собственный TTL (Time To Live) в секундах. По умолчанию это значение равняется одному часу (3600 секунд). Для того чтобы отключить кеширование 4хх ответов, нужно задать значение 0.

¶Время жизни кеша форм

Form API Drupal хранит часть информации форм в кеше. По умолчанию время жизни данного кеша 6 часов (21600 секунд). Устаревшие данные удаляются при первом запуске cron.

При помощи данной настройки вы можете задать своё собственное время жизни кеша форм.

¶Загрузчик классов

Если для PHP включено расширение APC, то для увеличения производительности используется загрузчик классов Symfony APC. Данное поведение можно отключить при помощи данной опции.

Если APC расширение не найдено, или оно отключено, то будет использован автозагрузчик Composer, который хорошо подходит для разработки, так как не сломается если код был перемещён в файловой системе. Вы также можете задекорировать базовый загрузчик с любым другим решением, а не только Symfony APC, так как все продакшен сайты должны иметь кеш для загрузчика в том или ином виде.

Для того чтобы задекорировать автозагрузчик, нужно переопределить переменную $class_loader.

Пример использования Symfony APC без автоматического обнаружения:

¶Разрешение авторизованных операций

Менеджер обновлений (модуль update) предоставляет администраторам сайта механизм безопасной установки обновлений для сайта напрямую через веб-интерфейс. На серверах с дополнительной защитой менеджер обновлений потребует предоставить доступы для SSH или FTP прежде чем операция будет выполнена. Это позволяет обновлять файлы сайта от лица пользователя который владеет ими, вместо того чтобы обновлять их под пользователем веб-сервера. На серверах где пользователь веб-сервера также является и владельцем файлов сайта запрос на доступ будет пропущен. Обычно такое поведение применимо для шаред хостингов, где пользователь веб-сервера и владельца сайта находятся в одной группе, что не очень безопасно.

Благодаря данной настройке вы можете отключить это поведение и обновление сайта будет доступно только по SSH и FTP.

¶Права доступа файлов

При помощи настроек file_chmod_directory и file_chmod_file вы можете задать права по умолчанию для папки с файлами и непосредственно файлов. Значение должны быть задано в соответствии с Linux chmod в восьмеричном виде (с ведущим нулём).

¶Основной URL публичных файлов

В настройке file_public_base_url вы можете указать альтернативный основной URL который будет использован для публичных файлов.

Значение отличное от основного домена Drupal сайта будет использовано для доступа к публичным файлам. Эта настройка может быть использована как простая интеграция с CDN или для улучшения безопасности путём обслуживания загруженных пользователями файлов с другого домена или поддомена но ведущие на тот же сервер.

Дополнительно:  Ноутбук не включается и не запускается: что делать и как быть?

Например, если указать в настройке http://downloads.example.com/files то все пути типа /sites/default/files/js/js_tzTgUlQwCuDqAJy4wyzIGJDhQU5AS7XxLzo_MCisroE.js будут заменены на http://downloads.example.com/files/js/js_tzTgUlQwCuDqAJy4wyzIGJDhQU5AS7XxLzo_MCisroE.js.

¶Путь до публичных файлов

В настройке file_public_path вы можете поменять стандартный путь (sites/default/files) до папки где должны храниться публичные файлы. Указанная директория должна существовать и Drupal (веб-сервер) должен иметь права на запись в неё. Путь до директории должны быть относительно установки Drupal (index.php) и доступен из сети.

¶Путь до приватных файлов

В настройке file_private_path вы можете указать путь до директории где будут храниться приватные файлы. Данная директория должна находиться за пределами установки Drupal (index.php) и не быть доступна из сети.

¶Интервал записи сессии

В настройке session_write_interval вы можете указать минимальный интервал в секундах, который должен пройти для записи данных сессии в БД после предыдущей записи. В целях производительности по умолчанию задано значение 180.

¶Переопределение строк локали

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

¶Тема оформления для режима обслуживания

В настройке maintenance_theme вы можете указать машинное имя темы оформления, которая должна использоваться для страниц, когда сайт находится в режиме обслуживания.

Данная настройки применятся только тогда, когда сайт явно находится на обслуживании. Не забудьте переопределить шаблон maintenance-page.html.twig на необходимый вам.

¶Хранилище активных конфигураций

В настройке container_yamls вы можете указывать дополнительные файлы сервисов который будут загружены. Пути должны быть относительно установки Drupal (index.php).

По умолчанию данная конфигурация загружает стандартный services.yml.

¶Класс Dependency Injection контейнера

В настройке container_base_class вы можете указать класс, который будет использован в качестве контейнера для Dependency Injection. Это может быть полезно для сбора информации о производительности и тестирования.

¶Парсер YAML

В настройке yaml_parser_class вы можете указать класс, который будет вызываться для парсинга YAML (.yml) файлов. Например, данная возможность может оказаться полезной если вам нужен альтернативный парсерс. Класс должен реализовывать интерфейс DrupalComponentSerializationSerializationInterface.

¶Шаблоны доверенных хостов

Drupal может использовать механизм доверенных хостов Symfony для предотвращения спуфинга HTTP Host заголовка.

Данная настройка разрешит работать сайту только с запросами по адресу www.example.com.

Если у вас мультисайтинг или сайт имеет несколько доменных имён, то необходимо указать все доступные значения.

Например, чтобы разрешить сайту работать с запросами example.com и example.org, а также всеми поддоменами нужно задать следующую настройку:

¶Чёрный список директорий на сканирование

В настройке file_scan_ignore_directories вы можете задать название директорий которые должен игнорировать File API при сканировании.

По умолчанию запрещено сканирование node_mobules и bower_components для того чтобы избежать проблем при сканировании расширений Drupal (могут оказаться схожие файлы, но не являться расширением Drupal).

¶Количество обрабатываемых сущностей за раз

В настройке entity_update_batch_size вы можете изменить какое количество сущностей будет обрабатываться за один этап обработки массовых операций в процессе обновлений.

Данная настройка используется ядром в хуках обновлений (hook_update() и hook_post_update()) при обработке больших объёмов сущностей. Это позволяет снизить потребление памяти и увеличить скорость обработки.

Также данная настройки иногда используется модулями как значение по умолчанию, чтобы сохранять требования к массовым операциям при больших объёмах данных.

¶Резервная копия сущностей при обновлении

В настройке entity_update_backup вы можете включать и отключать создание резервных копий для таблиц сущностей с их данными при обновлении схем и полей.

Данные таблицы остаются в БД и их нужно удалять в ручном режиме. Это позволяет в случае проблем не потерять данные и иметь точку возврата.

¶Отключение принудительного изменения прав на запись для директории сайта

При помощи настройки skip_permissions_hardening вы можете выключить принудительное удаление прав на запись для папки сайта (/sites/default).

По умолчанию Drupal регулярно сбрасывает права доступа к папке сайта, полностью убирая возможность записи. Это может повлечь за собой проблемы при управлении сайтом при помощи Composer и чаще всего встречается при попытке создания скафолд файлов в соответствующей директории плагином drupal/core-composer-scaffold.

Если вы не работаете с сайтом через FTP и управляете им при помощи Composer, вы можете без последствий отключить данное поведение.

¶Проверка схемы БД для синонимов

В настройке system.path_alias_schema_check вы можете отключить проверку схему БД при сохранении сущностей синонимов.

В Drupal 8.8.0 синонимы были конвертированы в сущности и их хранение соответственно изменилось. Если вы не применяли соответствующие обновления БД, то при попытке сохранить синонимы используя сущности будет фатальная ошибка. В Drupal 8.9.0 была добавлена проверка что данные обновления применены, и если их нет, мягко выдавать ошибку и продолжать выполнение. При помощи данной настройки вы можете отключить данное поведение.

¶Включение классических миграций нод

При помощи настройки migrate_node_migrate_type_classic вы можете активировать старую версию миграций нод, которая предоставлялась ядром до Drupal 8.9.0.

Начиная с Drupal 8.9.0 появились новые миграции, которые мигрируют ноды, со всеми их переводами, ревизиями и переводами ревизий, которые отличаются от тех что были ранее. Если ваш код или миграции основывались на старых миграциях, данная настройка позволит вернуть прежнее поведение.

¶Получение информации об обновлениях по HTTP

При помощи настройки update_fetch_with_http_fallback вы можете выключить получение информации об обновлениях с использованием HTTP.

Начиная с Drupal 9.1.0 Drupal использует HTTPS протокол для получения информации об обновлениях. Данная особенность требует чтобы на сервере было установлено OpenSSL расширение для PHP, в противном случае получить информацию об обновлениях будет невозможно.

Данная настройка отключает данные проверки и использует HTTP протокол для получения информации. Включение данной настройки открывает потенциальную возможность для MITM атак на сайт. Вы должны попробовать установить OpenSSL расширение прежде чем включать данную нстройку.

¶Управление заголовком для ответов Permissions-Policy

По умолчанию, Drupal устанавливает на все ответы заголовок Permissions-Policy: interest-cohort=() для того чтобы отключить Google Federated Learning of Cohorts (FLoC) которая доступна начиная с Chrome 89.

Если вы не хотите отключить данную возможность, вы можете установить данное значение в FALSE и заголовок не будет добавляться:

¶$config

При помощи переменной $config вы можете переопределить значения конфигураций на глобальном уровне. Как правило, это не требуется. Эта возможность полезна для переопределения адреса сайта или путей для локального окружения.

Существуют конфигурации которые опасно перезаписывать. Например перезапись списка активных модулей для core.extension лишь сломает сайт, так как изменения не вызовут соответствующие процессы установки и деинсталяции. Другой пример это хранилища полей, которые также повлекут за собой проблемы, так как эти изменения не вызовут изменения схемы БД. Поэтому часть из данных конфигураций не подвержены данным изменениям.

Также учтите, что изменение данных значений через текущий подход — не вызовет никаких событий, и подписчики ничего об этом не узнают.

Дополнительно:  Синий экран смерти 0x1000007e: причины и решения

¶Быстрые 404 страницы

Drupal может генерировать полноценное оформление для 404 ответов. Тем не менее часть ответов происходит на запросы картинок или прочих файлов, которые не отображаются для пользователя, так как это создаст дополнительную нагрузку и потребление интернет канала.

При помощи изменения некоторых конфигурационных настроек, вы можете настроить быстрые 404 ответы в соответствии с паттернами:

¶Настройки PHP

В определённых местах settings.php файла вы можете встретиться с различными примерами настроек для PHP которые могут вам пригодиться.

Для задавания настроек PHP нужно использовать ini_set().

¶Настройка во время выполнения

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

ini_set(‘pcre.backtrack_limit’, 200000);
ini_set(‘pcre.recursion_limit’, 200000);

Чаще всего вы можете обнаружить данный сайт по пути /sites/default, но это зависит от того, как произведена настройка Drupal и какой подход в разработке был использован.

По умолчанию проверяется только /sites/default, но если вы настроите мультисайтинг (присутствует /sites/sites.php), то поиск будет происходить по различным директориям.

Рассмотрим на примере. Если Drupal установлен по пути https://www.drupal.org:8080/mysite/test/ то файл settings.php будет искаться в следующих директориях, в порядке приоритета:

Данный файл необходим для работы Drupal и обязательно должен присутствовать. Создать его можно двумя способами:

Если settings.php у вас уже существует, при установке нового сайта он и будет использован для автозаполнения настроек.

Other Tools

There’s one more tool that is crucial in modern Drupal project deployments, and it is git, but it’s already included in Ubuntu 20.04, so there’s nothing to do. You should check if it’s available on your Ubuntu version, and if it isn’t install it (sudo apt install git).

Apache

To install apache web server execute:

$ sudo apt install apache2

Serve From Custom Directories (Optional)

It’s probably a good idea to configure the security attributes of the newly created file to match other files from the same directory.

Once the file is in place we can activate the new configuration by executing:

$ sudo a2enconf allow-opt-websites
$ sudo systemctl reload apache2

Note that the configuration name in the first line (allow-opt-websites) needs to be the same as the name of the configuration file we’ve created previously, with or without .conf extension.

Drush Launcher (Optional)

Drush Launcher is another optional, but very useful tool, and I strongly recommend using it. If you don’t use Drush — you definitely don’t need Drush Launcher (but you should reconsider this decision). Even if you do use Drush — you can use it without Drush Launcher, but again it’ll make your life easier.

Let me very quickly explain what it’s all about. Earlier, people who were using drush were usually installing it globally, and use the same installation for all the Drupal websites on that machine. But since Composer workflow has become popular, every Drupal project (which contains the Drupal site, but also a few more things) usually contains its own drush in vendor/drush sub-directory (and compiled executable vendor/bin/drush). This way every Drupal site can have its own version of drush, if a specific version is needed for some reason. So if you want to execute some drush command (let’s say cache rebuild), you have two options:

This introduces two problems: First, you will always need to be careful about which version to use (global or local), and it’s error-prone, and second is that the local version requires some additional typing (you need to specify the full path to the executable). These are the exact problems that Drush Launcher solves.

Drush Launcher is a small wrapper around drush, which simply forwards the commands to the actual drush executable. But it adds a little bit of magic to that: it knows which underlying drush command to use. If you execute Drush Launcher from a directory that is within a Drupal project directory (where a local drush executable is available) — it will use the local drush version. If executed from any other location — it will fall back to the global drush version (if one is installed). In other words, you’ll always execute something like drush cr, and it will always select the appropriate version (local or global) automatically.

Installing Drush Launcher

The installation is very simple. First, you need to download drush.phar file by executing:

$ curl -OL https://github.com/drush-ops/drush-launcher/releases/latest/download/drush.phar

Then make it executable by executing:

$ chmod +x drush.phar

Finally, rename it and move it somewhere within the PATH:

$ sudo mv drush.phar /usr/local/bin/drush

To check if it’s installed correctly execute drush —version, and you’ll get something like:

Note that, although we’ve executed drush —version, the output displayed actually comes from the newly installed Drush Launcher, not from actual drush, and the launcher currently complains that it cannot find underlying drush (not a surprise since we don’t have it yet). But when we execute the same command from a Drupal project directory (once we deploy one), the output will also contain info about the underlying drush that will be used. Just to demonstrate, here’s the output of the same command executed from a Drupal project directory:

$ drush —version
Drush Launcher Version: 0.8.0
Drush Commandline Tool 9.7.2

Global Drush (Optional)

In my case, since I’m always using the new Composer workflow (and Drupal project) for my Drupal websites, I don’t need a global version of drush. But if you need a global version of drush (if you have old-fashioned, non-Composer Drupal deployments), this section will show how to accomplish that.

The first step is to install Drush globally, but there are few things to know:

So let’s say that you’ve installed the global drush outside the PATH, for example in /opt/drush. Now you need to make Drush Launcher aware of it. To do that you need to export one environment variable:

$ export DRUSH_LAUNCHER_FALLBACK=/opt/drush

Thank You!

That’s it! Ubuntu is now ready to host Drupal sites. I hope that I will be able to create few tutorials about how to implement a proper, Git-based, Composer-based, staging development environment. Until then — enjoy and always smile! Thanks for reading!

Оцените статью
Master Hi-technology
Добавить комментарий