VPSとDockerで作る会社ホームページ
背景
今回は特に大きな理由はありませんが、何となく何でも自前で作ってしまいたい精神の元、VPS(Virtual Private Server)を借りて会社HP(Home Page)を作成してみる事にしました。
本記事では、「Web ページが表示できるまで」を対象に記事を書いていきます。
構成図
適当な VPS に Ubuntu をインストールし、Docker Container 内に Web サービス( Nginx )を構築します。
事前準備
VPS
自前の PC でも良いのですが、VPS の方がプライベートな環境と分けれるのでセキュリティ面で安心です。私は安いのでよく KAGOYA JAPAN を利用しています。
Ubuntu
VPS の方はインスタンスのOSインストール画面で Ubuntu 22.04 を選びましょう。
Docker
公式HP を参考にインストールします。
ドメイン取得
サーバーに振り分けられた IPアドレス を名前で指定できるようにするために、ドメインの取得が必要です。ドメインが固定されると、例えばサーバーを変えてIPアドレスが変わったとしても、再度ドメインをIPアドレスに紐づければ、ユーザーから見れば同じように使えます。
インターネット上で使用できるドメイン名は当然重複があってはいけませんので、特定の組織によって管理されています。ドメイン名登録業者を通じて、私たちは使用したいドメイン名の申請・登録を行います。参考
作成手順
Image download
Docker container を作るための image を download します。ここで使用する iamge は Ubuntu 22.04 とします。
sudo docker pull ubuntu:22.04
Container Run
次のコマンドで container を起動します。Port は80と443を使用します。/home/share はファイルをHost / Container 間で共有するための適当なディレクトリです。任意に変更してください。
sudo docker run -itd --name web -p 443:443 -p 80:80 -v /home/share:/home/share ubuntu:22.04 /bin/bash --login
sudo docker exec -it web /bin/bash
Nginx ( and other modules ) install
Web サービスの作成に必要な module を install します。
apt update
apt install -y nginx openssl vim cron rsyslog
Rsyslog
後々設定する cron の log を有効にするために、rsyslog の config を書き換えます。
vi /etc/rsyslog.d/50-default.conf
cron の箇所をコメントアウトします。
- #cron.* /var/log/cron.log
+ cron.* /var/log/cron.log
rsyslog を起動します。
rsyslogd
SSL証明書 ( Let’s Encrypt )
Google Chrome などのブラウザで正しくページを表示させるためには、正しいSSL証明書が設定されている必要があります。正しい証明書というのは、第三者の機関が保証しているような証明書で、自前で用意したような証明書ではありません。本来有料のものが多いのですが、今回は無料で証明書を発行してくれる Let’s Encrypt を利用します。
コマンドラインで利用するため、module を install します。
apt update
apt -y install certbot
次に、証明書を発行します。初回利用時にはいくつか登録が必要です。また、弊社ドメイン名は tanukinet.jp なので、適宜変更してください。-w には web ページのルートディレクトリを、 -d にはドメイン名を記載してください。
certbot certonly --webroot -w /var/www/html -d tanukinet.jp
次のようなメッセージが表示されるので、適宜メールアドレスや「Y」を入力します。
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): mymailaddress@gmail.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
正常に完了すると、以下に証明書ファイルが作成されています。tanukinet.jp はドメイン名です。
ll /etc/letsencrypt/live/tanukinet.jp
drwxr-xr-x 2 root root 4096 Nov 21 21:51 ./
drwx------ 3 root root 4096 Aug 5 12:12 ../
-rw-r--r-- 1 root root 692 Aug 5 12:12 README
lrwxrwxrwx 1 root root 36 Nov 21 21:51 cert.pem -> ../../archive/tanukinet.jp/cert4.pem
lrwxrwxrwx 1 root root 37 Nov 21 21:51 chain.pem -> ../../archive/tanukinet.jp/chain4.pem
lrwxrwxrwx 1 root root 41 Nov 21 21:51 fullchain.pem -> ../../archive/tanukinet.jp/fullchain4.pem
lrwxrwxrwx 1 root root 39 Nov 21 21:51 privkey.pem -> ../../archive/tanukinet.jp/privkey4.pem
4つのファイルが作成されていますが、必要なのは2つです。fullchain.pem が公開鍵で、privkey.pem が秘密鍵となっています。
※その他ファイルの補足
Nginx で他のSSL証明書にも切り替えられるようにするため、リンクファイルを作成してきます。
ln -f -s /etc/letsencrypt/live/tanukinet.jp/privkey.pem /etc/nginx/ssl/ssl.key # -f is "force to replace"
ln -f -s /etc/letsencrypt/live/tanukinet.jp/fullchain.pem /etc/nginx/ssl/ssl.crt
また、証明書の更新を自動で行うために、cron にタスクを設定します。
cp /etc/crontab /etc/crontab.`date "+%Y%m%d%H%M%S"`
echo "00 1,13 * * * root certbot renew --no-self-upgrade" >> /etc/crontab
/etc/init.d/cron restart
Nginx config
Nginx の設定ファイルを開きます。
vi /etc/nginx/conf.d/homepage.conf
次の設定を記載します。tanukinet.jp のドメイン名は適宜変更してください。
server {
listen 80;
server_name tanukinet.jp;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name tanukinet.jp;
location / {
try_files $uri $uri/ =404;
}
}
テスト
以下のコマンドで HTML を作成し、サービスを再起動します。
echo "Hi" > /var/www/html/index.html
/etc/init.d/nginx restart
ブラウザで https://domain-name/ を開き、問題無い事を確認します。
Discussion