ubuntu18.04+apacheでhttps対応

# 3行で
* あまり手をかけずにhttpsに対応したwebサーバーを立てたい
* 使い慣れたubuntuと、よく使われるであろうapacheを使う
* ubuntu18.04+apacheはcertbotが自動でhttpsの設定をしてくれる


# モチベーション
機械学習モデルを使った簡単なデモをブラウザ上で動かしたい。
そのためにAPI提供しようと思い、簡単なwebサーバーを立てたい。
さらに、今どきhttpsで公開されてるwebページも多いので、httpsに対応できる形にする。

# 環境
|   項目   | 使用環境 |
|:-----------|:------------|
| クラウドサービス  | AWS EC2       | 
| OS    | ubuntu 18.04 LTS  | 
| サーバーソフト     | Apache/2.4.29 (Ubuntu)      | 
| 認証局      | let's encrypt       | 


# 必要な作業
1. インスタンス作成、SSH接続
2. インバウンドルールの設定
3. apacheのインストール
4. 認証取得

# インスタンス作成、SSH接続
まずはEC2インスタンスを作成してSSHで接続できるようにしてください。
本記事では割愛します。詳しくは下記で。

* [EC2上にどこからでも簡単にアクセスできるjupyter lab環境を構築する](https://qiita.com/nabion/items/fa7fb822d95bb2125754#ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90)

# インバウンドルールの設定
httpとhttpsの通信が必要なので、80番(http)と443番(https)のインバウンドルールを設定しておきましょう。
EC2のマネジメントコンソール上の「セキュリティグループ」＞「launch-wizard-<*>」(<*>は具体的な数字launch-wizard-6など)からアクセスできます。
タイプ「HTTP」「HTTPS」を追加して、ソースを0.0.0.0に設定しておけば外部からアクセスできるようになります。

# apacheのインストール
```
sudo apt install apache2
```
これだけ。
インストールが完了するとサーバーが自動で起動しますので、EC2のマネジメントコンソールにあるIPv4 パブリック IPか、パブリック DNSの値をブラウザのURLバーに打ち込んでください。
以下のようなページが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373785/145b8847-c837-fa9e-876b-7c3f497b7fa2.png)


これで無事サーバーが立ち上がりました。

# 認証取得
無料でやろうとするなら[Let's encrypt](https://letsencrypt.org/ja/)というサービスがあるようです。
Let's encryptで認証を取得するためには

* 今公開しているドメインが、認証取得希望者自身のコントロール下にあること

を認証局(Let's encrypt)に認めさせる必要があります。
これには、決まったディレクトリに決まったファイルを置き、そこにhttpで認証局からアクセスしてもらう等の方法がありますが、幸いubuntu18.04+apache環境の場合は認証～https対応のためのapacheの設定変更までcertbotが自動でやってくれます。

(Let's encryptからの引用)
>シェルへのアクセス権を持っている場合
シェルアクセスができるほとんどの人には、[Certbot](https://certbot.eff.org/)という ACME クライアントを使うのがおすすめです。証明書の発行とインストールを、ダウンタイムゼロで自動化できます。自動設定を使いたくない人のために、エキスパートモードも用意されています。とても簡単に使え、多数のオペレーティングシステムで動作し、たくさんのドキュメントもあります。[Certbot のウェブサイト](https://certbot.eff.org/)では、各オペレーティングシステムやウェブサーバーごとの個別の設定方法について解説されています。
https://letsencrypt.org/ja/getting-started/

[Certbot](https://certbot.eff.org/)にいって、ubuntu 18.04上でのapacheで動作しているwebサイトの認証取得の方法を調べてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373785/384b860e-83cb-5375-4a2c-67b2a2fd3601.png)
上記のように作業の前に満たすべき必要事項がでてきます。
ほとんどは自動的に満たされていると思いますが、ドメイン名をちゃんと取得出来ていることが必要です。
これは、EC2の場合[NoIP](https://www.noip.com/)などの動的DNSサービスを使えば取得できます。
(参考：[動的DNSの設定](https://qiita.com/nabion/items/fa7fb822d95bb2125754#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E5%8B%95%E7%9A%84dns%E3%81%AE%E8%A8%AD%E5%AE%9A))

あとは指示に従って

```
sudo apt-get install certbot python3-certbot-apache
```
でcertbotとapacheのpluginを導入します。

認証+apacheの設定まで自動でやりたい場合は続いて以下のコマンドを入力します

```
sudo certbot --apache
```

これでhttpsを利用した通信が有効になりました。

# その後の作業にあたって
私の場合、この後引き続きflaskを導入しようと思っています。
その際、DocumentRootを変更したいと思っていて、`/etc/apache2/apache2.conf`と`/etc/apache2/sites-available/000-default.conf`だけでなく、certbotによって自動生成された設定ファイルも書き換える必要があったのでメモしておきます。
書き換える必要があるのは

* /etc/apache2/sites-available/000-default-le-ssl.conf

です。必要な書き換え内容は[ubuntuでapache2のDocumentRootを変更するまで](https://qiita.com/shita_fontaine/items/40a086265f0cf07d10e0#000-defaultconf)で紹介されている内容と同じです。
もともとあるDocumentRootの項をコメントアウトして、好きなディレクトリに設定してください。
書き換えができたら

```
cd /etc/apache2/sites-enabled
sudo a2dissite 000-default-le-ssl.conf
cd ../sites-available/
sudo a2ensite 000-default-le-ssl.conf
/etc/init.d/apache2 restart
```
で設定を反映させます。

# 感想
djangoの開発用サーバーをhttps化しようと最初頑張りましたが、それより圧倒的に簡単でした・・・。

# 参考
[Let's encrypt](https://letsencrypt.org/ja/)
[UbuntuとApacheでウェブサーバを立てる](https://qiita.com/sakkuntyo/items/03742bad0f57a4f46b07)
[ubuntuでapache2のDocumentRootを変更するまで](https://qiita.com/shita_fontaine/items/40a086265f0cf07d10e0)