一つのサーバで複数のドメインのサイトを運営する事になったので、その時に対応したメモを残す。

具体的にどのような構成であるか?を整理しておくと、

example.kyotoとother.example.kyotoという2つのドメインがあり、全く異なるテーマのサイトを一つのサーバで一つのSOY CMSで運営する。


利用しているサービス等

・サーバ:さくらのVPS 512プラン

・OS:Ubuntu 19.10

・ドメイン:お名前.comで管理

・SSL証明書:Let's Encrypt


今回の作業は既にLet's Encryptでexample.kyotoで証明書を発行しているものとする。

ブラウザでhttps://other.example.kyotoでアクセスできるようにするためには、example.kyotoのSSL証明書をワイルドカードで取得する必要がある。

上記の内容を加味した上で、これから実際に行った作業を記載する。


SSL証明書の取得等の作業は下記の記事等に記載されている方法で行っている。

ApacheでLet's Encryptの自動更新する為にCertBotを導入した


今回の話は、既にother.example.kyotoのDSN設定でAレコードでIPアドレスの指定が終わっているものとします。




既に登録しているSSL証明書の失効

下記のコマンドを実行する

$ sudo certbot delete -d example.kyoto

Which certificate(s) would you like to delete?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: example.kyoto
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

失効の候補が出力されたら、Enterをクリックして処理を開始する。


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Deleted all files relating to certificate example.kyoto.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

上記が表示されたら、下記のコマンドを実行して、一旦https://example.kyotoでアクセス出来ないようにする。

$ sudo a2dissite 000-default-le-ssl
$ sudo /etc/init.d/apache2 restart



example.kyotoのワイルドカードのSSL証明書を取得

下記のコマンドを実行する。

$ sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns -d *.example.kyoto -d example.kyoto

※ワイルドカードの証明書の取得なので、-d example.kyotoのオプションはいらないかも


表示された英文に従い、手続きを進めた後で、

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.kyoto with the following value:

##TXT用のランダム?な文字列##

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

上記の内容が出力されたら、次はお名前.comの方での作業になる。


お名前.comのログイン後の画面のDNSレコード設定の画面で、


woldcard_onamae_txt_value


ホスト名の入力フォームを「_acme-challenge

TYPEを「TXT

TTLを「3600

VALUEを「##TXT用のランダム?な文字列##

→サーバ毎にTXT用の文字列は異なります

にして追加ボタンを押した後、設定を更新します。


数分待った後にお名前.comからメールが送信されてくるらしいので、受信を確認したら端末に戻り、

※代理で設定をしたのでメールの送信は確認できていない。


端末の方に戻り、Enterボタンを押す。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.kyoto/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.kyoto/privkey.pem
   Your cert will expire on 2020-06-05. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Congratulations!と出力されたら設定は終了。


Apacheを下記のコマンドで再起動しておく。

$ sudo a2ensite 000-default-le-ssl
$ sudo /etc/init.d/apache2 restart



SOY CMS側で一つのサーバ、一つのSOY CMSで複数のドメインのサイトを運営する設定


create_multi_site


SOY CMSの管理画面を開き、サイトを2つ作成します。

これからサイト1(https://example.kyoto/main/)をhttps://example.kyotoで開けるようにし、

サイト2(https://example.kyoto/other/)をhttps://other.example.kyotoで開けるように設定することを予定して話を進めます。


ようこそSOY CMSへ!のページのサイドナビにあるサイト一覧を開き、サイト1の方のサイト詳細を開く。


create_multi_site_config_1


サイトURLの入力フォームに「https://example.kyoto」と入力して設定を変更する。


同様にサイト2でも


create_multi_site_config_2


サイトURLを「https://other.example.kyoto」として設定を変更する。

2つのサイトのどちらもルート設定をせずにそのままにしておいた状態で、端末を開き下記の対応を行う。




※以後の説明はApache2のドキュメントルートを/var/www/htmlとして話を進める。

$ cd /var/www/html
$ nano index.php

index.phpを下記のようにして保存する。

<?php

if(strpos($_SERVER["SERVER_NAME"], "other") !== false){
        include_once("other/index.php");
}else{
        include_once("main/index.php");
}

続いて、.htaccessの方も作成する。

$ nano .htaccess

RewriteEngine on

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/main%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}main%{REQUEST_URI} -f
RewriteRule ^(.*)$ /main/$1 [L]

RewriteCond %{HTTP_HOST} ^other\.example\.kyoto
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/other%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}other%{REQUEST_URI} -f
RewriteRule ^(.*)$ /other/$1 [L]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.htm !-f
RewriteCond %{REQUEST_URI} !^/server-status
RewriteCond %{REQUEST_URI} !^/server-info
RewriteCond %{REQUEST_URI} !^/index.php/
RewriteRule ^(.*)$ index.php/$1 [L]

これですべての設定は終了。




Let's Encryptのワイルドカードの証明書の更新は毎回TXTレコードの値の更新があるので、既存の仕組みでは3月毎の自動更新が出来ない。

利用しているDNSによってはTXTレコードを自動で更新できる仕組みがあるので、この仕組みと組み合わせることでワイルドカードの証明書の自動更新ができるらしいが、お名前.comでこのような仕組みが見当たらず…


さくらのクラウドのオプションにあるDNSに移管すれば、自動更新がイケるようになるっぽい。

クラウドサーバーはIaaS型のさくらのクラウド


3ヶ月毎の更新は手動でやるか…