メインコンテンツに移動
vps eye catch
Drupal Logo

前回はNGINXとMariaDB + phpMyAdminのセットアップを行いました

続いてWebコンテンツ管理システム(CMS)であるDrupalの構築を行います

今回の​​コンポーネント

コンポーネント 利用しているもの
Webサーバ NGINX 1.18
データベース MariaDB 10.3
コンテンツ管理(CMS) Drupal9

 

Drupal

Drupalはコンテンツ管理はもちろん、優れた拡張性と柔軟性を備えていてWebフレームワークとしても耐えうるスペックを持っています。

大規模の会員サイトやECサイトなどでの実績も多数あり、個人用サイトとしてはオーバースペックではありますが、Wordpressは以前使っていたこともあり新たなチャレンジとして本サイトでは利用してみたいと思います。

Drupalの特徴

Drupalの特徴は、公式サイトでは次のように紹介されています。

  • 簡易なコンテンツ作成
  • 信頼できるパフォーマンス
  • 優れたセキュリティ
  • 柔軟性とモジュール化

Drupalのインストールには、各種用途向けにパッケージ化されたディストリビューションの利用、開発用途向けのDDEVというDockerベースの事前設定済みツールなどもありますが、今回はDrupalコミュニティお勧めのPHPのパッケージ管理システムであるComposerを使ってのインストールを進めます。

 

Drupalインストール前の確認

公式インストールガイドに従って事前確認を行います。

先に結論をお伝えすると、Drupal9を各種Linuxディストリビューションの公式パッケージベースで構築しようとすると、Ubuntu 20.04LTSまたはCentOS 8.1以降が必要です。

ディスクサイズ

Drupalコアソフトウェアはおおよそ100MBを利用します。

その他に、今後展開するコンテンツサイズも見越したディスク容量を確保してください。

 

PHP

Drupal9ではPHP7.3以降のバージョンが必要です。

PHPでは最低64MB以上のメモリサイズが必要です。

また、Drupalコアソフトウェアや各種モジュールはPHP extensionが必要です。

Webサーバ

今回はNGINXを利用しますが、その他のWebサーバを利用する際の条件も転記します。

Apache

Drupal公式ではApacheが推奨となっています。

DrupalコアソフトウェアはApache 2.4.7以降で、mod_rewriteモジュールが有効化された環境が必要です。

ApacheのVirutalHost設定には.htaccessファイルで利用するAllow Overrideディレクティブの値をAllとする必要があります。

PHP Local Server

趣味の世界ですね。。。

テンポラリでの利用であれば、Webサーバをインストールせずともサーバ上のPHPを利用することも可能です。

NGINX

Drupalコアソフトウェアはnginx 0.7以降で、ngx_http_rewrite_moduleが有効化された環境が必要です。

Microsoft IIS

PHPが正しく設定されたIIS 5,6,7,8,10で利用可能です。

IIS 7/8ではMicrosoft URL Rewrite moduleかサードパーティ製のモジュールが必要です。

 

データベース

今回はMariaDBを利用しますが、各種DBの要件も記載します

MySQL

5.7.8以降(InnoDB互換ストレージエンジンが必要)

MariaDB

10.3.7以降(InnoDB互換ストレージエンジンが必要)

PostgreSQL

10.0以降(pg_trgmが必要)

SQLite

3.26以降

デモサイトなどを簡易に作成する際はPHPにバンドルされたSQLiteの利用は簡単ですが、バージョンが要件を満たすかの確認が必要です。

 

Composerセットアップ

Drupalのインストールにあたり、今回はDrupalコミュニティお勧めのPHPのパッケージ管理システムであるComposerをセットアップします

Composerのインストール

最新版のComposerを利用するには、Composer公式サイトのダウンロードページを参照ください。

下記はComposer v2.0.13(2021/5/6時点最新版)をベースに記載しています

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc
62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') 
{ echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer
-setup.php'); } echo PHP_EOL;"
# php composer-setup.php
# php -r "unlink('composer-setup.php');"
# mv composer.phar /usr/local/bin/composer

例では以下を順番に実行しています

ベリファイ用のハッシュ値などはインストールするタイミングで異なりますので、実行時はComposer公式サイトのダウンロードページを参照ください

  1. 最新版のインストーラをダウンロード
  2. ダウンロードしたファイルのベリファイ(SHA384)
  3. インストーラ(composer-setup.php)実行
  4. インストーラ(composer-setup.php)削除
  5. 作成された実行ファイル(composer.phar)をパスが通っているディレクトリに移動(/usr/local/bin)

Composerを利用してDrupal9をインストール

今更ですが、コマンド実行例とユーザスイッチ方法

ここまではroot権限で実行していきましたが、以下はnginxの実行ユーザであるwww-dataで実行します

コマンド実行例

# コマンド                          rootでのコマンド実行
user$ コマンド                   ユーザ(user)でのコマンド実行
 

複数ユーザで管理するシステムでは、sudoを使ってのコマンド実行などルールがあると思いますので、環境によって使い分けしてください

特定ユーザ権限でのコマンド実行
以下のように、sudoでコマンド実行権限があるユーザのコマンド実行は以下のように実施します

user$ sudo -u target_user command

例)ユーザubuntuでログインしている際に、ユーザ www-dataでmkdirコマンド実行

ubuntu$ sudo -u www-data mkdir /var/www/drupal

 

特定ユーザでのシェル実行

パスワードを設定していない特定ユーザでシェルを実行したい場合は以下のようなことも可能です

ubuntu$ sudo -u www-data bash

さて、本題であるdrupalのセットアップに進みます

composerを利用してdrupal 9をセットアップ

今回は、ディレクトリ /var/www/drupal 以下にdrupalをインストールします

www-data$ composer create-project drupal/recommended-project:9.1.8 /var/www/drupal

ちなみに、root権限でcomposerを実行すると下記のような警告が出ますので、nginxの実行ユーザである「www-data」で実行するようにします

Do not run Composer as root/super user! See https://getcomposer.org/root for details

 

composerを利用してdrush 9をセットアップ

続いて、コンソール上からDrupalを操作できるDrushをインストールします

www-data$ cd /var/www/drupal
www-data$ composer require drush/drush

以上でインストールは完了です。

Drushの実行ファイルはvender/bin/drushにインストールされるので、./vender/bin/drushのようにコマンドを打てば実行できますが面倒ですね。

1プロジェクトだけであれば環境変数のPATHに追加すれば対応することも可能ですが、複数プロジェクトを利用する際は現実的ではありません。

そこで、パスを通さずともdrushコマンドを利用できるDrush Launcherを導入します。

Drush Launcherとは

Drush Launcher は drush コマンドを実行したカレントディレクトリを見て、適切なDrush を呼び出す Drush のラッパーコマンドです。

composer.json があるディレクトリ配下であれば、どこで drush コマンドを実行してもプロジェクトにインストールされた Drush を呼び出すため、都度パスを考えて打つ必用がなくDrush を実行することができます。

Drush Launcherインストール

Drush公式サイトに書かれた手順通りにインストールを行います

# wget -O drush.phar https://github.com/drush-ops/drush-launcher/releases/latest/download/drush.phar
# mv drush.phar /usr/local/bin
# chown www-data:www-data /usr/local/bin/drush
# chmod 755 /usr/local/bin/drush
  1. 公式サイトからファイルをダウンロード
  2. PATHが通っているディレクトリ/usr/local/binへ移動
  3. ファイルの所有者をnginx実行ユーザに変更
  4. 実行権限を付与

(参考)Drush Launcherのアップデート

新バージョンが出た際はDrush Launcherはコマンドでアップデートが可能です

# drush self-update

 

Drupal用データベース作成

前回の記事でセットアップしたphpMyAdmin、もしくはコマンドラインでデータベースを作成します。

今回は、DB名、ユーザ名共にdrupalとします。

MariaDB/MySQLを利用する際は、照合順序(collation)をutf8mb4_general_ciもしくはutf8mb4_unicode_ciにします。

コマンドラインで作成する場合は以下となります。パスワードは適宜変更ください。

# mysql -u root -p
CREATE DATABASE drupal;
GRANT ALL ON drupal.* TO 'drupal'@'localhost' IDENTIFIED BY 'Str0ngDrupaLP@SS';
FLUSH PRIVILEGES;
\q

尚、aptでMariaDBをインストールした際は、MariaDB標準の照合順序(collation)は/etc/mysql/mariadb.conf.d/50-server.cnfに記載があります。

変更していない場合はutf8mb4_general_ciとなります。

NGINXの設定変更

drupalを使うために、NGINXの設定ファイルを作成します

前回の記事で記載した通り、固定のグローバルIP1個をもつVPS環境(WebARENA Indigo)を利用し、独自ドメインを利用するため、1台のサーバで公開用のホスト名と、各種管理機能用のホスト名を分離して利用します。

今回は公開用サイトとしてdrupal9をセットアップします。

用途 ホスト名(FQDN)
公開用 www.your-domain.com
管理用 manage.your-domain.com

設定ファイル作成

# vim /etc/nginx/sites-availavie/drupal9

Drupal公式サイトのサンプルコンフィグをベースにしてサンプルを記載します。

server {
    server_name www.your-domain.com;
    root /var/www/drupal/web; ## Drupalをインストールしたディレクトリに適宜変更

    listen 80;
    listen [::]:80;
    listen 443 ssl;

    ssl_certificate      /etc/letsencrypt/live/your-domain.com/fullchain.pem;  ## Let's Encryptで作成したワイルドカード証明書を指定
    ssl_certificate_key  /etc/letsencrypt/live/your-domain.com//privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;

    # Redirect HTTP to HTTPS 強制的にHTTPSアクセスに変更
    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
  # For Google Adsense  Google Adsenseを利用する場合はads.txtを利用可能とする
    location = /ads.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    # Very rarely should these ever be accessed outside of your lan .txt/.logファイルへのアクセスを拒否
    location ~* \.(txt|log)$ {
        deny all;
    }

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ ^/sites/.*/private/ {
        return 403;
    }

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
        return 403;
    }

    location / {
        allow 12.34.56.78;       ## セットアップ時は接続元の制限をかけることをお勧めします
        allow 11.22.33.44/24;
        deny all;
        #allow all;  

        # try_files $uri @rewrite; # For Drupal <= 6
        try_files $uri /index.php?$query_string; # For Drupal >= 7
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    # In Drupal 8, we must also match new paths where the '.php' appears in the middle,
    # such as update.php/selection. The rule we use is strict, and only allows this pattern
    # with the update.php front controller.  This allows legacy path aliases in the form of
    # blog/index.php/legacy-path to continue to route to Drupal nodes. If you do not have
    # any paths like that, then you might prefer to use a laxer rule, such as:
    #   location ~ \.php(/|$) {
    # The laxer rule will continue to work if Drupal uses this new URL pattern with front
    # controllers other than update.php in a future release.
    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini 
        ## 標準サンプルコンフィグではcgi.fix_pathinfo変更の記載がありますが前回の記載通りPHP5.3.8以降では対応不要
        include fastcgi_params;
        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php-fpm.sock;  ## FastCGIの配置に合わせて適宜変更
    }

    # Fighting with Styles? This little gem is amazing.
    # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
    location ~ ^/sites/.*/files/styles/ { # For Drpal >= 7
        try_files $uri @rewrite;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

作成したコンフィグファイルを有効にします 

# ln -s /etc/nginx/sites-available/drupal /etc/nginx/sites-enabled/
# nginx -t
# systemctl restart nginx
  1. /etc/nginx/sites-enabled/にリンクを作成
  2. コンフィグ書式確認
  3. nginx再起動

 

Drupal初期セットアップ

無事起動が出来たら、アクセスを許可した環境からブラウザ経由でアクセスします。

https://www.your-domain.com/

初期アクセス時はインストーラ/core/install.phpが起動します。

言語選択

日本語を選択

Image
Drupal_Setup_01

プロファイル選択

標準を選択

Image
Drupal_Setup_02

必要条件の検証

システムが要件を満たしているか確認が入ります。問題なければデータベースのセットアップに進みます。

データベースのセットアップ

スクリーンショットの取得が漏れてしまったため、項目のみ記載します

項目
データベースのタイプ 「MySQL, MariaDB, Percona Serverまたは同等のもの」を選択
データベース名 作成したデータベース(drupal)
データベースのユーザー名 作成したデータベースユーザー(drupal)
データベースのパスワード データベース作成時に指定したパスワード
高度なオプション 標準のまま(ホスト:localhost、TCPポート:3306、テーブル名プレフィックス:なし)

 

この後にデータベースの作成、翻訳の作成、設定ファイルの作成などが実施されます

サイトの環境構築

 

Image
サイトの環境構築

作成するWebサイトの情報を入力します

  • サイト名
  • サイト管理用のメールアドレス
  • サイト管理用初期アカウント(ユーザ名、パスワード、メールアドレス)
  • 地域設定(国、タイムゾーン)
  • 更新通知(自動的なアップデート確認の有無、メール通知有無)

 

セットアップ

インストール完了すると、初期画面が表示されます

Image
Drupal9 Welcome

 

まずはここまでとします。

今後、テーマのインストール、拡張機能のインストールなど追加していきます。

次回はPostfix、Dovecot、PostfixAdminを使って送受信用のメールサーバのセットアップを行います。

SPF / DKIM / Dmarcなど自サーバの信頼度向上、Amavis / ClamAV / SpamAssasinなど受信メールのSPAM/セキュリティ対策なども実施していきます。

 

 

 

Drupal9を始めるにあたって、Drupal 9 Web開発ことはじめ (技術の泉シリーズ(NextPublishing)が発売されたそうです。よかたら参考にしてみてください。