Drupalでは、マルチサイトと呼ばれる、単一のコードベースから複数のサイトを提供できる機能が用意されています。各サイトは独立したデータベース、構成設定、ファイルを持ちます。コードベースが共通化されていることによって次のことが実現できます。
- モジュール、テーマの一括配置
- セキュリティアップデートの一括適用
同じモジュール、テーマを配布しながら、設定やコンテンツは各サイトごとに持てるので、類似するサイトをある程度柔軟性を持ちながら建てることができます。グローバル企業の各現地法人ウェブサイトなどがユースケースとしてよく挙げられます。
設定方法
Dockerベースのローカル開発環境を構築できるLandoを使用して、ローカル環境にマルチサイトを起動します。
Drupalプロジェクトの作成
ローカル環境で composer create-project
を実行し、Drupalプロジェクトを作成する。後々drushコマンドを使用してサイトをインストールするのでdrushコマンドもインストールする。
$ composer create-project drupal/recommended-project my-multi-site
$ cd my-multi-site
$ composer require drush/drush
各設定ファイルの作成
次の4つのファイルを作成していく。
- .lando.yml
- drush/sites/site1.site.yml
- drush/sites/site2.site.yml
- web/sites/sites.php
.lando.ymlを次の内容で作成する。
name: my-multi-site
recipe: drupal9
config:
webroot: web
proxy:
appserver:
- site1.lndo.site
- site2.lndo.site
services:
site1_db:
type: mysql:5.7
portforward: 33068
site2_db:
type: mysql:5.7
portforward: 33069
Drushで簡単にマルチサイトを操作できるようにするために、Drushのサイトエイリアスファイルを作成する。まず drush/sites ディレクトリを作成する。
$ mkdir -p drush/sites
YAMLファイルのrootキーには、Drupalのプロジェクトルートを指定する。今回はlandoで作成した環境に対してdrushコマンドを実行するので、ローカル環境のプロジェクトルートではなく、lando環境内のプロジェクトルートを指定する。
local:
root: /app
uri: 'http://site1.lndo.site'
paths:
- files: sites/site1/files
local:
root: /app
uri: 'http://site2.lndo.site'
paths:
- files: sites/site2/files
web/sites/sites.phpファイルを作成する。
<?php
$sites['site1.lndo.site'] = 'site1';
$sites['site2.lndo.site'] = 'site2';
web/sites/site1、web/sites/site2ディレクトリを作成する。
$ mkdir web/sites/site1
$ mkdir web/sites/site2
各サイトの起動
lando環境を起動する。
$ lando start
# ...省略...
Here are some vitals:
NAME my-multi-site
LOCATION /Users/hikaru.maruyama/src/test/my-multi-site
SERVICES appserver, database, site1_db, site2_db
APPSERVER URLS https://localhost:54934
http://localhost:54935
http://site1.lndo.site/
https://site1.lndo.site/
http://site2.lndo.site/
https://site2.lndo.site/
drushコマンドで site1 の初期インストールを行う。@site1.local
と指定することで、 site1.site.yml で設定したDrushのサイトエイリアスが利用される。
$ lando drush @site1.local site:install standard \
--locale=ja \
--db-url=mysql://mysql:mysql@site1_db:3306/database \
--sites-subdir=site1
You are about to:
* Create a sites/site1/settings.php file
* DROP all tables in your 'database' database.
Do you want to continue? (yes/no) [yes]:
> yes
# ...省略...
[success] Installation complete. User name: admin User password: WALZ8wD47z
http://site1.lndo.site にアクセスすると、初期インストールが完了したDrupalサイトが作成できていることがわかる。また、web/sites/site1ディレクトリにsettings.phpファイルとfilesディレクトリが作成されていることがわかる。
site2の初期インストールも同様に行う。マルチサイトで異なるデータベースが使用されるようにしたいので、データベースの構成をsite1と同じ設定にしないように気をつける。
$ lando drush @site2.local site:install standard \
--locale=ja \
--db-url=mysql://mysql:mysql@site2_db:3306/database \
--sites-subdir=site2
ちなみにデータベース名やユーザー名は lando info
コマンドで確認できる。特に設定していなければ、
- データベース名:database
- ユーザー名:mysql
- パスワード:mysql
となる。
$ lando info
# ...省略...
{ service: 'site1_db',
urls: [],
type: 'mysql',
healthy: true,
internal_connection: { host: 'site1_db', port: '3306' },
external_connection: { host: '127.0.0.1', port: '33068' },
healthcheck: 'bash -c "[ -f /bitnami/mysql/.mysql_initialized ]"',
creds: { database: 'database', password: 'mysql', user: 'mysql' },
以上の手順で、コードベースを共有しながら異なるDB、ファイル、設定を持つサイトを起動することができる。