Bitnamiで1インスタンスに複数のパッケージをインストールする

BitnamiはWordPressやRedmineなどのウェブアプリケーションをPHPやMySQLなどのミドルウェアとともに一式設定済みでパッケージ化して提供してくれるソリューション。例えばAWSのEC2でWordPressを搭載したインスタンスを作るとき、一式インストール済みのインスタンスを選択することができるが、これを提供しているのがBitnamiである。

自前でPHP+Apache+MySQL+CMS(WordPress)をインストールするのとBitnamiはディレクトリ構成や設定ファイルが異なる。

一般的には1インスタンス1パッケージの形で提供されたものを使うことになり、あまりそのあたりを気にせずに使える。ただし1インスタンスに複数のパッケージを同居させるなど拡張して使う場合などには中身を触ることになり、仕組みを知っておく必要がある。

  • 同じインスタンスにWordPress(記事コンテンツ)とMyBB(掲示板)を同居
  • 複数のWordPressを同じインスタンスのバーチャルホストで並行運用

などのケースである。

パッケージごとのURLの識別の考え方

1インスタンスに複数のパッケージをインストールする場合、それぞれのパッケージのURLを

  • サブディレクトリで識別する
  • バーチャルホストで識別する

いずれかの方法を選択する。前者をprefix、後者をvhostsでの識別という。これらを組み合わせて「WordPressとRedmineは同じドメイン、MediaWikiは別ドメイン」という構成も可能である。

ディレクトリ構成

CMSやミドルウェア一式がインストールされているディレクトリは

/opt/bitnami

個別のアプリは

/opt/bitnami/apps

配下にあり、アプリ別の設定もここで行う。

/opt/bitnami/apache2

がApacheのファイル一式で、バイナリやログが格納されている。Apacheの設定もここで行う(アプリ固有の設定はapps配下の設定をインクルードする)。

基本的な使い方

WordPressのインスタンスを使う場合

起動スクリプト

パッケージの更新とタイムゾーンの設定は起動スクリプトで自動実行

apt update
DEBIAN_FRONTEND=noninteractive apt upgrade -y -o Dpkg::Options::="--force-confnew"
timedatectl set-timezone Asia/Tokyo

ログイン

OSのログインは各クラウドのルール通り(公開鍵)。
WordPressやMySQLなどミドルウェアのパスワードはBitnamiが生成したもので、

/home/bitnami/bitnami_application_password

に格納されている。

デフォルトでWordPressで作られたサイトのURLは

http://ホスト名/wordpress/

になる。

WordPressの設定

WordPressユーザのデータベースやユーザの設定は完了済み。

デフォルトでページの右下にBitnamiのロゴが表示されるが、それを削除する。

sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1

これ以外に--installer-language--machine_hostnameなどのオプションもあるが、指定しても意味がなかった。

管理画面の設定

ログインパスワードを取得

cat bitnami_application_password

W3 Total Cacheを使う場合は設定時のみ権限を変更する必要がある

sudo chmod 664 /opt/bitnami/apps/wordpress/htdocs/wp-config.php

<管理画面で設定>

http://ホスト名/wordpress/wp-admin/

設定後

sudo chmod 644 /opt/bitnami/apps/wordpress/htdocs/wp-config.php

W3 Total Cacheの設定方法

Apacheなどミドルウェアの起動

OSのsystemctlではなくBitnami付属のctlscript.shを使ってサービスの起動コントロールをする。

sudo /opt/bitnami/ctlscript.sh start apache
sudo /opt/bitnami/ctlscript.sh stop mysql

複数のWordPressや他のWebアプリケーションをインストールする

WordPressインストール済みのインスタンスで追加のWordPressをインストールする。BitnamiではWordPressのMultiSite版をインストールすることもできるが、構成が複雑になってしまうので分けたい場合はこの方法がいい。またWordPressに限らずRedmineやTracなどほかのウェブアプリケーションを追加インストールする場合も同様の手順でできる。

なお複数のパッケージをインストールする場合、デフォルトでそれらはURLのサブディレクトリで識別する(ドメインでの識別をする場合は別設定が必要)。

インストーラの取得

以下からBitnami用のWordPressのインストーラを取得して実行権限を付ける

https://bitnami.com/stack/lamp/modules

curl -LO https://bitnami.com/redirect/to/772973/bitnami-wordpress-5.2.4-1-module-linux-x64-installer.run
chmod a+x bitnami-wordpress-5.2.4-1-module-linux-x64-installer.run

パッケージのインストールだけでなくApacheやデータベースの設定も同時に行ってくれる。

WordPressのインストール

2基目のインストール

--wordpress_instance_nameでアプリ名を指定する。インストール済みのWordPressでwordpressをいう名前が使われているので違う名前を指定する。アプリ名は英数字だけで、ハイフンやアンダーバーが含まれるとNG

sudo ./bitnami-wordpress-5.2.4-1-module-linux-x64-installer.run --wordpress_instance_name wordpress2

途中で質問されるBitnamiのディレクトリは

/opt/bitnami

これで

/opt/bitnami/app/wordpress2

以下にWordPressがインストールされる。WordPressサイトのURLは

http://ドメイン名/wordpress2/

になる。

2基目のWordPressのバナー削除設定

sudo /opt/bitnami/apps/wordpress2/bnconfig --disable_banner 1

あとは管理画面で設定を行う(W3 Total Cacheを使う場合はディレクトリの権限変更を忘れずに)

Apacheの設定

デフォルトでサイトのURLは

http://ホスト名/アプリ名/

になるが、これの場所を変更したりバーチャルホストに切り替えたりするにはApacheの設定が必要になる。

BitnamiにおけるApacheの設定ファイルの仕組みを説明する。

AWSのインスタンスタイプ別にパフォーマンスチューニングを変えている

/opt/bitnami/apache2/conf/bitnami/

にはインスタンスタイプ別の設定

  • httpd-2xlarge.conf
  • httpd-large.conf
  • httpd-medium.conf
  • httpd-micro.conf
  • httpd-small.conf
  • httpd-xlarge.conf

が格納されている。

この中のインスタンスのサイズに適した設定ファイルに対して

/opt/bitnami/apache2/conf/bitnami/httpd.conf

からシンボリックリンクが張られている。

URLとアプリ振り分け方法

Bitnamiではデフォルトでサブディレクトリ(prefix)でアプリケーション(wordpress, wordpress2)を振り分けている。

/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf

では各アプリのサブディレクトリ振り分け用の設定をインクルードしている

Include "/opt/bitnami/apps/wordpress/conf/httpd-prefix.conf"
                    Include "/opt/bitnami/apps/phpmyadmin/conf/httpd-prefix.conf"
                    Include "/opt/bitnami/apps/wordpress2/conf/httpd-prefix.conf"
                    Include "/opt/bitnami/apps/redmine/conf/httpd-prefix.conf"

各アプリのサブディレクトリ振り分け用の設定は

/opt/bitnami/apps/アプリ名/conf/httpd-prefix.conf

アプリごとのURLのパス名を変更する場合はこのファイルで設定する。

バーチャルホストで振り分ける場合はprefix振り分け用のインクルード設定を削除し、代わりにvhost振り分け用のファイルをインクルードする設定にする。

/opt/bitnami/apache2/conf/bitnami/bitnami.confから

Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf"

をコメントアウトし、

/opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf

Include "/opt/bitnami/apps/wordpress/conf/httpd-vhosts.conf"
                    #Include "/opt/bitnami/apps/phpmyadmin/conf/httpd-vhosts.conf"
                    Include "/opt/bitnami/apps/wordpress2/conf/httpd-vhosts.conf"
                    Include "/opt/bitnami/apps/redmine/conf/httpd-vhosts.conf"

を追加する。アプリ別の設定は

/opt/bitnami/apps/アプリ名/conf/httpd-vhosts.conf

でvhostsごとに行う。まずはServerNameとAliasのみを書き換えればいい

/opt/bitnami/apps/アプリ名/conf/httpd-app.conf

サブディレクトリ用のリライトの設定をバーチャルホスト用に修正する。

    RewriteEngine On
    RewriteBase /wordpress/
    RewriteRule ^index\.php$ - [S=1]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wordpress/index.php [L]
    RewriteEngine On
    #RewriteBase /wordpress/
    RewriteRule ^index\.php$ - [S=1]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]

/opt/bitnami/apps/アプリ名/htdocs/wp-config.php

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/wordpress');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/wordpress');
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

httpをhttpsにするのも忘れずに。

SSL証明書の取得

BitnamiにもSSL証明書(Let’s Encrypt)を取得する機能が備わっているが、1インスタンス1アプリしか設定できない。
自前でcertbotをインストールしてコマンドラインで発行するのがいい。

前提条件

  • example1.com / www.example1.comでオリジナルのwordpress
  • example2.com / www.example2.comでwordpress2
  • example3.1.22.333.444.nip.ioでredmine

を公開する場合

証明書の取得と設定手順

Apacheを停止

sudo /opt/bitnami/ctlscript.sh stop apache

証明書の取得

apt install -y certbot

sudo certbot certonly --standalone -d example1.com -d www.example1.com -m someone@example1.com --agree-tos
sudo certbot certonly --standalone -d example2.com -d www.example2.com -m someone@example2.com --agree-tos
sudo certbot certonly --standalone -d example.1.22.333.444.nip.io -m someone@example2.com --agree-tos

サーバにインストールされた証明書にアプリの設定ディレクトリから参照できるようにする

sudo ln -s /etc/letsencrypt/live/example1.com/privkey.pem /opt/bitnami/apps/wordpress/conf/certs/server.key
sudo ln -s /etc/letsencrypt/live/example1.com/fullchain.pem /opt/bitnami/apps/wordpress/conf/certs/server.crt

sudo ln -s /etc/letsencrypt/live/example2.com/privkey.pem /opt/bitnami/apps/wordpress2/conf/certs/server.key
sudo ln -s /etc/letsencrypt/live/example2.com/fullchain.pem /opt/bitnami/apps/wordpress2/conf/certs/server.crt

sudo ln -s /etc/letsencrypt/live/example3.1.22.333.444.nip.io/privkey.pem /opt/bitnami/apps/redmine/conf/certs/server.key
sudo ln -s /etc/letsencrypt/live/example3.1.22.333.444.nip.io/fullchain.pem /opt/bitnami/apps/redmine/conf/certs/server.crt

Apacheを起動

sudo /opt/bitnami/ctlscript.sh start apache

証明書の自動更新

更新時は

sudo /opt/bitnami/ctlscript.sh stop apache
sudo certbot certonly --standalone -d example1.com -d www.example1.com -m someone@example1.com --agree-tos
sudo certbot certonly --standalone -d example2.com -d www.example2.com -m someone@example2.com --agree-tos
sudo certbot certonly --standalone -d example.1.22.333.444.nip.io -m someone@example2.com --agree-tos
sudo /opt/bitnami/ctlscript.sh start apache

crontabに以下追記しておくと2か月に1回自動で更新される。

0 2 1 1-12 * 
sudo sh -c '/opt/bitnami/ctlscript.sh stop apache && certbot certonly --standalone -d example1.com -d www.example1.com -m someone@example1.com --agree-tos && certbot certonly --standalone -d example2.com -d www.example2.com -m someone@example2.com --agree-tos && certbot certonly --standalone -d example.1.22.333.444.nip.io -m someone@example2.com --agree-tos && /opt/bitnami/ctlscript.sh start apache'

追加アプリ

https://bitnami.com/stack/

にあるアプリ以外に自前で作ったwebアプリをBitnamiの形式に合わせて設置する(Bitnamiで一元管理)ことも可能。

Apache

すべてroot権限で

export APPNAME=whatismyapp
export DOMAINNAME=whatismyapp.net

mkdir -p /opt/bitnami/apps/${APPNAME}/{conf,htdocs}
chown -R bitnami:daemon /opt/bitnami/apps/${APPNAME}/htdocs/
chmod -R g+w /opt/bitnami/apps/${APPNAME}/htdocs/

cat << EOF > /opt/bitnami/apps/${APPNAME}/conf/httpd-app.conf
<Directory "/opt/bitnami/apps/${APPNAME}/htdocs">
    Options +FollowSymLinks
    AllowOverride None
    <IfVersion < 2.3 >
        Order allow,deny
        Allow from all
    </IfVersion>
    <IfVersion >= 2.3>
        Require all granted
    </IfVersion>
</Directory>
EOF

ドキュメントルートは

/opt/bitnami/apps/${APPNAME}/htdocs/

サブディレクトリ振り分けを採用する場合

cat << EOF > /opt/bitnami/apps/${APPNAME}/conf/httpd-app.conf
Alias /${APPNAME}/ "/opt/bitnami/apps/${APPNAME}/htdocs/"
Alias /${APPNAME} "/opt/bitnami/apps/${APPNAME}/htdocs"

Include "/opt/bitnami/apps/${APPNAME}/conf/httpd-app.conf"
EOF

cat << EOF >> /opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf
Include "/opt/bitnami/apps/${APPNAME}/conf/httpd-prefix.conf"
EOF

バーチャルホスト振り分けを採用する場合

cat << EOF > /opt/bitnami/apps/${APPNAME}/conf/httpd-vhosts.conf
<VirtualHost *:80>
    ServerName www.${DOMAINNAME}
    ServerAlias ${DOMAINNAME}
    DocumentRoot "/opt/bitnami/apps/${APPNAME}/htdocs"

    RewriteEngine On
    RewriteRule ^(.*)?$ https://www.${DOMAINNAME}$1 [R=301,L]

    Include "/opt/bitnami/apps/${APPNAME}/conf/httpd-app.conf"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.${DOMAINNAME}
    ServerAlias ${DOMAINNAME}
    DocumentRoot "/opt/bitnami/apps/${APPNAME}/htdocs"
    SSLEngine on
    SSLCertificateFile "/opt/bitnami/apps/${APPNAME}/conf/certs/server.crt"
    SSLCertificateKeyFile "/opt/bitnami/apps/${APPNAME}/conf/certs/server.key"

    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)?$ https://www.%{HTTP_HOST}/$1 [R=301,L]

    Include "/opt/bitnami/apps/${APPNAME}/conf/httpd-app.conf"
</VirtualHost>
EOF

cat << EOF >> /opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf
Include "/opt/bitnami/apps/${APPNAME}/conf/httpd-vhosts.conf"
EOF

バーチャルホストのSSL証明書

/opt/bitnami/ctlscript.sh stop apache

if certbot certonly --standalone -d ${DOMAINNAME} -d www.${DOMAINNAME} -m white35g@getsv.com --agree-tos; then
  mkdir -p /opt/bitnami/apps/${APPNAME}/conf/certs/
  ln -s /etc/letsencrypt/live/${DOMAINNAME}/privkey.pem /opt/bitnami/apps/${APPNAME}/conf/certs/server.key
  ln -s /etc/letsencrypt/live/${DOMAINNAME}/fullchain.pem /opt/bitnami/apps/${APPNAME}/conf/certs/server.crt
fi

/opt/bitnami/ctlscript.sh start apache

MySQL

export DBNAME=DB名
export USERNAME=ユーザ名
export PASSWORD=パスワード

cat << EOF | mysql -uroot -p
create database ${DBNAME};
create user '${USERNAME}'@'localhost' identified by '${PASSWORD}';
grant all privileges on ${DBNAME}.* to '${USERNAME}'@'localhost';
flush privileges;
EOF

その他のミドルウェアのインストール

Nodejs

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt install -y nodejs

Python

sudo apt install -y python3-pip

参考

データ周辺の技術 の記事一覧