Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作（その２：httpsサーバ（apache + mod_wsgi） の構築）

# はじめに
出先からおうちの家電を動かしたい！ということで、
LINE　の Messaging API （webhook） を利用し、
Raspberry pi 3 経由で、赤外線を使って、
おうちの家電製品を操作するような仕組み作りました。
備忘録として、思い出しながら記載します。

今回の構成は以下の通りです。
LINE -> raspberry pi(httpsサーバ) -> 赤外線リモコン -> エアコン

以下のとおり、３回に分けて説明します
- [赤外線リモコン から エアコン を操作(前回)](https://qiita.com/na59ri/items/aea452f2487a393537dd)
- httpsサーバ（apache + mod_wsgi） の構築（今回）
- [LINE から 赤外線リモコンを操作](https://qiita.com/na59ri/items/45b756163aab6c60da0a)


今回は、httpsサーバーの構築するために、
httpsサーバーのデーモンである apache
pythonでhttpsサーバーとwebアプリケーションを繋げるためのモジュール mod_wsgi
httpsサーバで必要なSSLの証明書を無料で取得できるサービス Let's encrypt
を利用します。

※ ４ヶ月以上前に設定したことなので、参照サイト、および、記載が古いことがありますのでご了承ください

# 環境
OS: Raspbian 9.1
**バージョンによって、設定方法など変わることに注意**

# 手順
## apache によるwebサーバーの構築

### apache のインストール
apache のインストール前に、最新のソフトの情報を取得し、システムを最新の状態にする。

```terminal:terminal
$ sudo apt-get update
$ sudo apt-get upgrade
```

apache2 をインストールする。

```terminal:terminal
$ sudo apt-get install apache2
```

### mod_wsgi のインストール
apache2 でmod_wsgi を使うためにlibraryをインストールする。

```terminal:terminal
$ sudo apt-get install libapache2-mod-wsgi
```

pythonで mod_wsgi を使うためのライブラリをインストールする。

```terminal:terminal
$ sudo pip install mod_wsgi
```

### apache の設定ファイルの更新

webからアクセスするためのディレクトリを homeディレクトリ（私の設定は pi と言うディレクトリ名）配下にある public_htmlフォルダ　に変更する。

```terminal:terminal
$ sudo ln -s /etc/apache2/mods-available/userdir.conf /etc/apache2/mods-enabled/userdir.conf
$ sudo ln -s /etc/apache2/mods-available/userdir.load /etc/apache2/mods-enabled/userdir.load
```

webからのアクセスでスクリプトを起動するための仕組み（cgi） を動作するディレクトリを決める。
ここでは、homeディレクトリ（私の設定は pi と言うディレクトリ名）配下に /public_html/cgi-bin/ とし、以下のファイルを編集する。

```text:/etc/apache2/conf-available/serve-cgi-bin.conf
・・・
<IfDefine ENABLE_USR_LIB_CGI_BIN>
    ScriptAlias /cgi-bin/ /home/pi/public_html/cgi-bin
    <Directory "/home/pi/public_html/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Require all granted
    </Directory>
</IfDefine>
・・・
```

cgi を apache2 で利用するために、以下の２つを行なう。
特定フォルダに cgiファイル のリンクを置く。

```terminal:terminal
$ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
```

apache2 で serve-cgi-bin.conf　を参照するために、以下のファイルを編集する

```text:/etc/apache2/sites-available/000-default.conf
(変更前)
 # Include conf-avaliable/serve-cgi-bin.conf
(変更後：コメントを外す)
 Include conf-avaliable/serve-cgi-bin.conf
```

cgi を利用できる拡張子(.py, .wsgi)を追加するために、以下のファイルを編集する。

```text:/etc/apache2/mods-available/mime.conf
(変更前)
 AddHandler cgi-script .cgi
(変更後)
 AddHandler cgi-script .cgi .py
 AddHandler wsgi-script .wsgi
```

apache2で https（http + ssl） を使えるようにするために、特定フォルダに sslファイル のリンクを置く。

```terminal:terminal
$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
$ sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf
```

apache2で mod_wsgi を使えるようにするために、特定フォルダにファイルのリンクを置く。

```terminal:terminal
$ sudo ln -s /etc/apache2/mods-available/wsgi.conf /etc/apache2/mods-enabled/wsgi.conf
$ sudo ln -s /etc/apache2/mods-available/wsgi.load /etc/apache2/mods-enabled/wsgi.load
```

apache2 を再起動し、変更内容を有効化する。

```terminal:terminal
$ sudo /etc/init.d/apache2 restart
```

## Let's encrypt からSSL証明書取得
### ルータのポート変換機能を使えるようにする

raspberry pi が割り当てられているローカルIPアドレスを取得する

```terminal:terminal
$ sudo ifconfig
```

すると、192.168.x.y のIPアドレスを取得できる。

今回、http / https を利用するため、ポート 80 と ポート 443 に対して、
グローバルIPでアクセスした時に、ローカルIPアドレスに変換するように、ルータの設定を変更する。

各自がお持ちのルータの設定を確認ください。

### 証明書作成スクリプトのインストール
```terminfo:terminal
$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
```

### IPアドレスとホスト名を取得
家庭用であれば、IPアドレスはプロバイダ経由で動的に割り当てられると思います。
IPアドレスはよく変わるかもしれませんが、グーグル先生に「IPアドレス」で検索するといくつかサイトが出て来ます。
私も動的にIPアドレスが割り当てられていますが、そこでIPアドレスとホスト名を取得しています。
自己責任で調べて見てください。
ここでは、以下の通りとしておきます。
　　　　IPアドレス：xxx.yyy.zzz.vvv
　　　　ホスト名：abcdefg.xyz.ne.jp

### 証明書の取得
今回、証明書取得フォルダはwebアクセスするためのデフォルトのフォルダになるため、以下のフォルダを参照する。
　　　　/var/www/html/
また、ホスト名は上記の通り取得している。

それをもとに、以下の通りコマンドを実行して、証明書を取得する。

```terminal:terminal
$ ./certbot-auto certonly --webroot -w /var/www/html/ -d abcdefg.xyz.ne.jp
```

具体的には以下に証明書が存在する。

```text:証明書
証明書のデータ
/etc/letsencrypt/live/abcdefg.xyz.ne.jp/fullchain.pem
秘密鍵
/etc/letsencrypt/live/abcdefg.xyz.ne.jp/privkey.pem
```

SSLの証明書を参照するように以下のファイルを修正する。

```text:/etc/apache2/sites-available/default-ssl.conf
(変更前)
SSLCertificateFile          /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateFileKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
(変更後)
SSLCertificateFile          /etc/letsencrypt/live/abcdefg.xyz.ne.jp/fullchain.pem
SSLCertificateFileKeyFile   /etc/letsencrypt/live/abcdefg.xyz.ne.jp/privkey.pem
```

apache2 を再起動し、SSL証明書を有効化する。

```terminal:terminal
$ sudo /etc/init.d/apache2 restart
```

# 参考URL
(1)[Raspberry Pi2にWebサーバを構築し、LEDを点灯させる] (https://qiita.com/aryoa/items/2c28b466e911a3dd101d)
(2)[Let's Encrypt の使い方] (https://letsencrypt.jp/usage/)